Версия 4.1 от Alexandr Fokin на 2020/08/09 15:32

Скрыть последних авторов
Alexandr Fokin 2.1 1
2 Ситуация:
3 Имееться очередь, из которой приложение читает данные и обрабатывает их. Рассмотрим пример, что приложение имеет следующий цикл обработки сообщения:
4
5 1) Взять сообщение из очереди
6 2) Попытаться выполнить некоторый набор действий на основе данных из сообщения.
7 Отметим, что обработка сообщения может завершиться как успешно, так и с ошибкой.
8
9 Вариации:
10
11 1]
12 1) Получаем сообщение
13 2) Выполняем коммит (при следующем чтении на вход пойдет следующее сообщение)
14 3) Выполняем обработку
15
16 2]
17 1) Получаем сообщение
18 2) Выполняем обработку
19 3) Если п.2 выполнен успешно, то выполняем коммит (при следующем чтении на вход пойдет следующее сообщение)
20
21 Возможные проблемы
Alexandr Fokin 3.1 22 1) При потходе 1, мы теряем сообщение, в случае если его обработка не завершилась успешно.
Alexandr Fokin 2.1 23 2) При потходе 2, в случае, если после выполнения 2 пунтка наше приложение упадет (не успев выполнить пункт 3), то при повтроном запуске мы обработаем то-же самое сообщение второй раз.
24
25 Вопросы
26 1) Является ли повторная обработка одного и того же сообщения допустимой для нашей системы.
27 2) Является ли потеря данных из одного из сообщений критичной для нашей системы
Alexandr Fokin 4.1 28 3) Использование потхода номер 2 совместно с каким-либо более продвинутым механизмом транзакций. Т.е в случае падения приложения транзакция не будет завершена успешно.
29 Но есть риск если у нас выполняются 2 действия:
Alexandr Fokin 3.1 30 1) коммит транзакции в базе, 2) коммит сообщения. (или в порядке 2, 1)
31 В случае падения приложения между указанными шагами, мы все равно можем получить
Alexandr Fokin 4.1 32 либо потерю сообщения (закоммитили сообщение, но не завершили транзацию),
33 либо повторную обработку (завершили транзакцию, но не закоммитил сообщение).
Alexandr Fokin 3.1 34 Хоть и вероятность такого события в целом крайне мала. (зависит от системы)
Alexandr Fokin 2.1 35
36
37
38
39