Исходный код вики Диллема обработки сообщений
Версия 4.1 от Alexandr Fokin на 2020/08/09 15:32
Скрыть последних авторов
author | version | line-number | content |
---|---|---|---|
![]() |
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 | Возможные проблемы | ||
![]() |
3.1 | 22 | 1) При потходе 1, мы теряем сообщение, в случае если его обработка не завершилась успешно. |
![]() |
2.1 | 23 | 2) При потходе 2, в случае, если после выполнения 2 пунтка наше приложение упадет (не успев выполнить пункт 3), то при повтроном запуске мы обработаем то-же самое сообщение второй раз. |
24 | |||
25 | Вопросы | ||
26 | 1) Является ли повторная обработка одного и того же сообщения допустимой для нашей системы. | ||
27 | 2) Является ли потеря данных из одного из сообщений критичной для нашей системы | ||
![]() |
4.1 | 28 | 3) Использование потхода номер 2 совместно с каким-либо более продвинутым механизмом транзакций. Т.е в случае падения приложения транзакция не будет завершена успешно. |
29 | Но есть риск если у нас выполняются 2 действия: | ||
![]() |
3.1 | 30 | 1) коммит транзакции в базе, 2) коммит сообщения. (или в порядке 2, 1) |
31 | В случае падения приложения между указанными шагами, мы все равно можем получить | ||
![]() |
4.1 | 32 | либо потерю сообщения (закоммитили сообщение, но не завершили транзацию), |
33 | либо повторную обработку (завершили транзакцию, но не закоммитил сообщение). | ||
![]() |
3.1 | 34 | Хоть и вероятность такого события в целом крайне мала. (зависит от системы) |
![]() |
2.1 | 35 | |
36 | |||
37 | |||
38 | |||
39 |