Обработка с транзакцией

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

Ситуация:
Имееться очередь, из которой приложение читает данные и обрабатывает их. Рассмотрим пример, что приложение имеет следующий цикл обработки сообщения:

1) Взять сообщение из очереди
2) Попытаться выполнить некоторый набор действий на основе данных из сообщения.
Отметим, что обработка сообщения может завершиться как успешно, так и с ошибкой.

Вариации:

1]
1) Получаем сообщение
2) Выполняем коммит (при следующем чтении на вход пойдет следующее сообщение)
3) Выполняем обработку

2]
1) Получаем сообщение
2) Выполняем обработку
3) Если п.2 выполнен успешно, то выполняем коммит (при следующем чтении на вход пойдет следующее сообщение)

Возможные проблемы
1) При потходе 1, мы теряем сообщение, в случае если его обработка не завершилась успешно.
2) При потходе 2, в случае, если после выполнения 2 пунтка наше приложение упадет (не успев выполнить пункт 3), то при повтроном запуске мы обработаем то-же самое сообщение второй раз.

Вопросы
1) Является ли повторная обработка одного и того же сообщения допустимой для нашей системы.
2) Является ли потеря данных из одного из сообщений критичной для нашей системы
3) Использование потхода номер 2 совместно с каким-либо более мродвинутым механизмом транзакции. Т.е в случае падения приложения транзакция не будет завершена успешно.
Но еть риск если у нас выполняются 2 действия:
1) коммит транзакции в базе, 2) коммит сообщения. (или в порядке 2, 1)
В случае падения приложения между указанными шагами, мы все равно можем получить
либо потерю (из-за незавершенной транзакции), либо повторнуб обработку из-за незакоммиченного сообщения очреди.
Хоть и вероятность такого события в целом крайне мала. (зависит от системы)

Теги:
Создал(а) Alexandr Fokin 2020/08/09 15:30