Изменения документа Диллема обработки сообщений

Редактировал(а) Alexandr Fokin 2024/06/12 16:21

От версии < 4.1 >
отредактировано Alexandr Fokin
на 2020/08/09 15:32
К версии 1.1 >
отредактировано Alexandr Fokin
на 2020/02/13 12:24
>
Изменить комментарий: К данной версии нет комментариев

Комментарий

Подробности

Свойства страницы
Название
... ... @@ -1,1 +1,1 @@
1 -Диллема обработки сообщений
1 +Обработка с транзакцией
Содержимое
... ... @@ -1,39 +1,0 @@
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 -Возможные проблемы
22 -1) При потходе 1, мы теряем сообщение, в случае если его обработка не завершилась успешно.
23 -2) При потходе 2, в случае, если после выполнения 2 пунтка наше приложение упадет (не успев выполнить пункт 3), то при повтроном запуске мы обработаем то-же самое сообщение второй раз.
24 -
25 -Вопросы
26 -1) Является ли повторная обработка одного и того же сообщения допустимой для нашей системы.
27 -2) Является ли потеря данных из одного из сообщений критичной для нашей системы
28 -3) Использование потхода номер 2 совместно с каким-либо более продвинутым механизмом транзакций. Т.е в случае падения приложения транзакция не будет завершена успешно.
29 -Но есть риск если у нас выполняются 2 действия:
30 -1) коммит транзакции в базе, 2) коммит сообщения. (или в порядке 2, 1)
31 -В случае падения приложения между указанными шагами, мы все равно можем получить
32 -либо потерю сообщения (закоммитили сообщение, но не завершили транзацию),
33 -либо повторную обработку (завершили транзакцию, но не закоммитил сообщение).
34 -Хоть и вероятность такого события в целом крайне мала. (зависит от системы)
35 -
36 -
37 -
38 -
39 -