|
|
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
Добрый день . До этого все приложения были не "кластерные" вопросов таких не было ... но появилась вот такая архитектура : Фронтом идет nginx - за ним кластер из двух docker контейнеров в них jetty в нем webapp за ними кластер MariaDB сессия пользователя хранится в базе так http://projects.spring.io/spring-session/ так вот смущает такой кейс : nginx - отправляет запросы на ноды по принципу роундробина - с get запросами все ок (я не вижу подводных камней) ! вопрос с не идемпотентными запросами? Вот пришел на node1 jetty1 post запрос и нода умерла в этот момент (2 вариант успела положить в сессию что то и не успелва)- Этот запрос потерян или нет? Сейчас пользователь в браузере висит и ничего не происходит ( в момент отправки POST / GET ) положили ноду ... все что он делает это - жмет F5 - и продолжает работать - его даже не выбросит на логин итд ... Вопросы : 1) чем потенциально опасна такая схема ? 2) Как ретраить не идемпотентные запросы ? 3) не лучше ли организовать stick на nginx ? - чтобы один пользователь работал с одной нодой - если она упадет перешел на другую 4) jetty - работают ничего не знаю о том что они в докере - Это не jetty cluster 5) proxy_next_upstream - спасение ? 6) http://nginx.org/ru/docs/http/ngx_http_upstream_module.html#sticky Цель не потерять ни одной транзакции :) ps если сессия в базе это плохо - то будет кластер на Redis ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2017, 19:32 |
|
||
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
Atum1вопрос с не идемпотентными запросами? Не делать их. Не проблема сделать все операции изменения идемпотентными. Кластерная система это не просто "ап" и готово. Это именно что изменение всего подхода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2017, 19:52 |
|
||
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
Я тут новенький, но вот читал, что одно из достоинств ЕЕ - это как раз масштабируемость в ширину без дополнительных заморочек в коде. Дополнительные затраты сил только на настройку серверов в домене. Почему бы не пойти этим путем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2017, 20:11 |
|
||
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
HettЯ тут новенький, но вот читал, что одно из достоинств ЕЕ - это как раз масштабируемость в ширину без дополнительных заморочек в коде. Дополнительные затраты сил только на настройку серверов в домене. Почему бы не пойти этим путем? На ЕЕ можно. Но там все медленнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2017, 20:21 |
|
||
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
Hettчто одно из достоинств ЕЕ Всё сбалансировано. Почитай про недостатки EE. Поэтому изучай в паре - EE и не EE. Кстати, тут на форуме, EE на мой imho взгляд - 10%. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2017, 11:10 |
|
||
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
Atum1вопрос с не идемпотентными запросами? Вопросительный знак есть, а вопроса нет. Atum1Вот пришел на node1 jetty1 post запрос и нода умерла в этот момент (2 вариант успела положить в сессию что то и не успелва)- Этот запрос потерян или нет? Очень много размытой терминологии. Если сессию реплицировать синхронно, то это капец как дорого. Если сессию реплицировать асинхронно, то таки да, после положительного отклика, но до репликации можно потерять запрос. Atum11) чем потенциально опасна такая схема ? Проблемами с репликацией сессии, которая отъедает кучу ресурсов кластера. Atum12) Как ретраить не идемпотентные запросы? Повторять запросы может только клиент. Решения два вижу я. Либо коммитить транзакцию после сихронизации, либо валидировать транзакции дополнительными запросами. Atum13) не лучше ли организовать stick на nginx ? - чтобы один пользователь работал с одной нодой - если она упадет перешел на другую sticky session вполне себе нормальное решение. Никто особо не старается одного юзера раскидать на все ноды. Atum14) jetty - работают ничего не знаю о том что они в докере - Это не jetty cluster И вопрос в чем? Atum1Цель не потерять ни одной транзакции :) Мы за ценой не постоим? А цель кластера какая? Atum1если сессия в базе это плохо - то будет кластер на Redis Есть 100500 способов реплицировать сессию. Общая база, это таки single point of failure. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2017, 11:21 |
|
||
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
Alexey TominНа ЕЕ можно. Но там все медленнее. JEE никак не регламентирует кластеризацию и сопутствующие плюшки. Просто требует чтобы оно было. Можно взять GlassFish и получить не работающее решение. Можно взять JBoss, но когда начинутся проблемы в кластеризации придётся либо самому её переделать, либо платить за саппорт. И если вдруг захочется чтобы оно просто работало, придётся раскошелится на WebLogic. В итоге раскошелится придётся в любом случае, что с JEE, что без. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2017, 11:24 |
|
||
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczAtum1вопрос с не идемпотентными запросами? Вопросительный знак есть, а вопроса нет. Atum1Вот пришел на node1 jetty1 post запрос и нода умерла в этот момент (2 вариант успела положить в сессию что то и не успелва)- Этот запрос потерян или нет? Очень много размытой терминологии. Если сессию реплицировать синхронно, то это капец как дорого. Если сессию реплицировать асинхронно, то таки да, после положительного отклика, но до репликации можно потерять запрос. Atum11) чем потенциально опасна такая схема ? Проблемами с репликацией сессии, которая отъедает кучу ресурсов кластера. Atum12) Как ретраить не идемпотентные запросы? Повторять запросы может только клиент. Решения два вижу я. Либо коммитить транзакцию после сихронизации, либо валидировать транзакции дополнительными запросами. Atum13) не лучше ли организовать stick на nginx ? - чтобы один пользователь работал с одной нодой - если она упадет перешел на другую sticky session вполне себе нормальное решение. Никто особо не старается одного юзера раскидать на все ноды. Atum14) jetty - работают ничего не знаю о том что они в докере - Это не jetty cluster И вопрос в чем? Ну якобы можно делать репликацию сессии средствами самого jetty Atum1Цель не потерять ни одной транзакции :) Мы за ценой не постоим? А цель кластера какая? Atum1если сессия в базе это плохо - то будет кластер на Redis Есть 100500 способов реплицировать сессию. Общая база, это таки single point of failure. Спасибо Да один Post Запрос с транзакцией мы можем потерять видимо - это как раз и будет наше SLA 99.95 ибо шаг в 99.999 - где будет репликация всего и вся это стоимость решения вырастает на порядок или два. Там более у нас фронтальная система - за ней по мимо базы еще стоит некоторый бэкенд на rest api и с нашей системы есть определенны правила работы с этим бэкендом : не получив от него ответа (получив 500 ) мы ретраем пост запрос до него по оговоренной логике . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2017, 14:04 |
|
||
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЕсть 100500 способов реплицировать сессию. Общая база, это таки single point of failure. там кластер ,но точка одна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2017, 14:07 |
|
||
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
Atum1Цель не потерять ни одной транзакции :)Предлагаю взглянуть на проблему с другой стороны. Запись в сессию и в рабочую БД - это не одна транзакция. Как можно гарантировать, что выполняя две транзакции, данные не придут в несогласованное состояние? Ответ - никак. Так что выхода два: 1. Использовать распределенные транзакции. Это дорого. 2. Использовать по минимуму механизм сессий. По-крайней мере для критичных операций. В этом случае можно без проблем просто повторить запрос, завершившийся ошибкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2017, 09:51 |
|
||
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
WGAAtum1Цель не потерять ни одной транзакции :)Предлагаю взглянуть на проблему с другой стороны. Запись в сессию и в рабочую БД - это не одна транзакция. Как можно гарантировать, что выполняя две транзакции, данные не придут в несогласованное состояние? Ответ - никак. Тут не понял . можно пояснить ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2017, 15:19 |
|
||
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
Atum1WGAпропущено... Предлагаю взглянуть на проблему с другой стороны. Запись в сессию и в рабочую БД - это не одна транзакция. Как можно гарантировать, что выполняя две транзакции, данные не придут в несогласованное состояние? Ответ - никак. Тут не понял . можно пояснить ?WGA наверное имел в виду, что сессии тоже хранятся в БД ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2017, 15:29 |
|
||
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
Usman, Добрый день . Есть ещё вопрос : в классической схеме все вроде бы ясно: Сессия в базе и таким образом запрос идёт из браузера на haproxy и может быть обработан любым аппсервером так как у него сессионный ключ в базе ( имеется кластер jetty docker контейнеров ) А как быть если клиент работает через websocket? В такой схеме соединение двухсторонне и постоянное через wss, нужно каким то образом его поддерживать ??? Или оно будет каждый раз перестанавливаться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2017, 14:19 |
|
||
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
Atum1А как быть если клиент работает через websocket? В такой схеме соединение двухсторонне и постоянное через wss, нужно каким то образом его поддерживать ??? Или оно будет каждый раз перестанавливаться? Проксирование WebSocket WebSocket Security ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2017, 14:42 |
|
||
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
Atum1А как быть если клиент работает через websocket? В такой схеме соединение двухсторонне и постоянное через wss, нужно каким то образом его поддерживать ??? Или оно будет каждый раз перестанавливаться?а можно и просто продлять сессию http. при каждом сообщении серверу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2017, 14:46 |
|
||
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
вадяAtum1А как быть если клиент работает через websocket? В такой схеме соединение двухсторонне и постоянное через wss, нужно каким то образом его поддерживать ??? Или оно будет каждый раз перестанавливаться?а можно и просто продлять сессию http. при каждом сообщении серверу. Решение нужно для вебсокетов . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2017, 14:54 |
|
||
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
Atum1Решение нужно для вебсокетов .именно для них и предложено и практичеки используется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2017, 14:59 |
|
||
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
Atum1, тут есть ещё одна фишка с использование ws - возможность сервере вести "передачу по своей инициативе" кода http сессия оканчивается -переводить клиента на страницу входа/авторизации для этого достаточно отловить окончание сессии http и отправить клиенту нужное сообщение. N секунд(минут,часов) бездействия (без обращения к серверу) и переход на страницу входа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2017, 15:09 |
|
||
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
вадяAtum1, тут есть ещё одна фишка с использование ws - возможность сервере вести "передачу по своей инициативе" кода http сессия оканчивается -переводить клиента на страницу входа/авторизации для этого достаточно отловить окончание сессии http и отправить клиенту нужное сообщение. N секунд(минут,часов) бездействия (без обращения к серверу) и переход на страницу входа. Не совсем понял , есть пример кода на github e ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2017, 08:39 |
|
||
|
Вопрос по архитектуре отказоустойчивой системы.
|
|||
|---|---|---|---|
|
#18+
При запросе клиента по вебсокету к серверу, сервер проверяет, как долго пользователь был не активен. Если больше определенного какого-то временного интервала, то сервер по WS посылает команду DISCONNECT или просто закрывате вебсокет. На клиентской стороне это событие отлавливается и пользователя перенаправляет на страницу авторизации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2017, 12:58 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=62&tid=2122669]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
25ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 338ms |

| 0 / 0 |
