Комментарии 17
Есть ещё Temporal — тоже очень удобен для реализации saga
А если упало компенсирующее действие?
Там тоже saga и так до бесконечности :)
Автор почему-то забыл упомянуть про главное свойство саги, без которого это все не имеет смысла. Все компенсирующие действия должны быть идемпотентными (т.е. f(f(x))=f(x)). Поэтому если мы валимся на откате, мы этого просто не замечаем и повторяем откат.
Более-менее нормальное описание этого дела есть тут
Спасибо. В таком варианте это имеет смысл. Странно, что автор проигнорировал ключевую вещь.
Хотя тут сохраняется еще один вопрос. Если все упало вообще наглухо, то как после рестарта системы понять нужны ли еще какие-то компенсирующие действия?
Если есть записанная сага, значит нужны. Даже если они все уже были произведены, но финализации не произошло, благодаря идемпотентости их можно повторить еще раз и ничего плохого не случится. После успешного отката сага удаляется (атомарно ставится флажок "удалено"). Соответственно, если саги нет, последняя транзакция была либо успешно завершена, либо откатилась, и система находится в консистентном состоянии.
Какой паттерн? Здесь нет никакого паттерна. Это обычный try/except. Более того, он у вас работает не отказоустойчиво. Что будет, если при откате у вас второй откат одного из действий приведёт к ошибке? Правильно, остальные даже не попытаются откатиться, а первый успешно откатился. У вас будет сильно нарушена целостность системы.
Это типичный шаблон try/except, со всеми вытекающими проблемами и это далеко не новый "паттерн".
Это паттерн микросервисной архитектуры https://microservices.io/patterns/data/saga.html Если try catch ловит исключения, то здесь речь скорее о бизнес-логике, когда, например, заказ невозможно оплатить из-за того, что продавец его не подтвердил, и это не исключение, а логичное поведение.
Т.е. без "паттерна" это никому не понятно и никто не делает откаты транзакций, если они произведены разными подсистемами?
И я не уверен, что при не удачной генерации оповещения производится откат всего процесса.
Фарш невозможно провернуть назад. А по делу, не совсем понятно, что скрывается за откатом локальной транзакции. Ушедшее оповещение откатывается новым сообщением, об отмене платежа? А неудача в отправке сообщения, откатывает платеж платежом отрицательных значений?
Таким образом, мы создали мощный механизм управления транзакциями с помощью паттерна Saga в микросервисной архитектуре.
попахивает chatGpt
Паттерн Saga в микросервисной архитектуре