Изменения документа Диллема обработки сообщений
Редактировал(а) Alexandr Fokin 2024/06/12 16:21
отредактировано Alexandr Fokin
на 2020/02/13 12:24
на 2020/02/13 12:24
отредактировано Alexandr Fokin
на 2020/08/09 15:35
на 2020/08/09 15:35
Изменить комментарий:
К данной версии нет комментариев
Комментарий
-
Свойства страницы (2 изменено, 0 добавлено, 0 удалено)
Подробности
- Свойства страницы
-
- Название
-
... ... @@ -1,1 +1,1 @@ 1 - Обработкастранзакцией1 +Диллема обработки сообщений - Содержимое
-
... ... @@ -1,0 +1,43 @@ 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) Возможно в нашей системе производитель сообщение, генерирует сообщенеи повторно через некоторой промежуток времени, если фиксирует, что предыдущее сообщение не было обработано. 29 + 30 + 31 +Более надежное, но более тяжелое решение: 32 +Использование потхода номер 2 совместно с каким-либо более продвинутым механизмом транзакций. Т.е в случае падения приложения транзакция не будет завершена успешно. 33 +Но есть риск если у нас выполняются 2 действия: 34 +1) коммит транзакции в базе, 2) коммит сообщения. (или в порядке 2, 1) 35 +В случае падения приложения между указанными шагами, мы все равно можем получить 36 +либо потерю сообщения (закоммитили сообщение, но не завершили транзацию), 37 +либо повторную обработку (завершили транзакцию, но не закоммитил сообщение). 38 +Хоть и вероятность такого события в целом крайне мала. (зависит от системы) 39 + 40 + 41 + 42 + 43 +