Pull to refresh

Comments 16

Есть ещё Temporal — тоже очень удобен для реализации saga

А если упало компенсирующее действие?

Там тоже saga и так до бесконечности :)

Автор почему-то забыл упомянуть про главное свойство саги, без которого это все не имеет смысла. Все компенсирующие действия должны быть идемпотентными (т.е. f(f(x))=f(x)). Поэтому если мы валимся на откате, мы этого просто не замечаем и повторяем откат.
Более-менее нормальное описание этого дела есть тут

Спасибо. В таком варианте это имеет смысл. Странно, что автор проигнорировал ключевую вещь.

Хотя тут сохраняется еще один вопрос. Если все упало вообще наглухо, то как после рестарта системы понять нужны ли еще какие-то компенсирующие действия?

Отвечу сам себе - вдруг кому-то будет полезно.

По ссылке, предоставленной @flx0 написано, что уровень оркестрации должен иметь свой стейт. Тогда все встает на свои места. Только вот выглядит это теперь как вариация стандартного координатора транзакций. Которой , видимо, и является.

Если есть записанная сага, значит нужны. Даже если они все уже были произведены, но финализации не произошло, благодаря идемпотентости их можно повторить еще раз и ничего плохого не случится. После успешного отката сага удаляется (атомарно ставится флажок "удалено"). Соответственно, если саги нет, последняя транзакция была либо успешно завершена, либо откатилась, и система находится в консистентном состоянии.

Ага, тоже уже прочитал. И вот это наличие стейта у оркестратора - вторая ключевая особенность паттерна, не описанная автором.

Какой паттерн? Здесь нет никакого паттерна. Это обычный try/except. Более того, он у вас работает не отказоустойчиво. Что будет, если при откате у вас второй откат одного из действий приведёт к ошибке? Правильно, остальные даже не попытаются откатиться, а первый успешно откатился. У вас будет сильно нарушена целостность системы.

Это типичный шаблон try/except, со всеми вытекающими проблемами и это далеко не новый "паттерн".

Это паттерн микросервисной архитектуры https://microservices.io/patterns/data/saga.html Если try catch ловит исключения, то здесь речь скорее о бизнес-логике, когда, например, заказ невозможно оплатить из-за того, что продавец его не подтвердил, и это не исключение, а логичное поведение.

Т.е. без "паттерна" это никому не понятно и никто не делает откаты транзакций, если они произведены разными подсистемами?

И я не уверен, что при не удачной генерации оповещения производится откат всего процесса.

Не откат, а компенсация. Есть большая разница между откатом транзакции в БД и компенсацией в Саге. Это не одно и то же.

А где я сказал, что это одно и то же?

Это следует из ваших утверждений. Сага это не про откат транзакций и даже не про откат процесса. Предусматривается определённый план действий и его реализация на случай возникновения программных или логических ошибок.

Фарш невозможно провернуть назад. А по делу, не совсем понятно, что скрывается за откатом локальной транзакции. Ушедшее оповещение откатывается новым сообщением, об отмене платежа? А неудача в отправке сообщения, откатывает платеж платежом отрицательных значений?

Успешно совершена оплата, отдан сигнал на подготовку к отправке товара, но уведомление система не смогла сгенерировать и мы отменяем всё))) Я походу понял, почему у нас Почта в России не очень работает) Там Saga используется)

Sign up to leave a comment.