Pull to refresh

Comments 15

INSERT INTO statuses (id, name) VALUES (1, 'PENDING'), (2, 'CREATED');

Для двух статусов табличка, конечно, совершенно необходима.

Почему нет? C точки зрения поддержки целостности тут есть только одна альтернатива, это postgresql enums. Но это ни разу не серебрянная пуля, особенно если список значений надо будет расширять..

Я за ENUM. Нагляднее, проще, на один JOIN меньше.
Но я придрался скорее к тому, что такая табличка используется в примере, который не должен отвлекать от главного.

Что делать, если не удалось выполнить компенсирующую транзакцию?

Великая тайна сия есть. Но вообще компенсирующая операция должна быть идемпотентной, так что её можно повторять до упора, пока не получится хоть что-то в ответ получить.

Нормально так сложнее. В целом, saga работает примерно так, как работают распределенные транзакции, т.е. в общем случае не работает.

Как вариант, сохранять в бд «неудачу». Демоном уже обрабатывать отдельно неудавшиейся компенсирующие транзакции

Это только половина дела. Нужно уметь пока они наказываются как-то ведь фильтровать данные которые "на половину" верны.

Так называемое грязное чтение избежать.

Один из вариантов решения такой проблемы как раз в описанном примере. А именно статусы, по которым можно осуществлять фильтрацию

В ваших примерах обработчик CreateOrderV1 и обработчик события order_created_v1 совершенно не готовы к повторам операций, которые кажется должны случиться когда вы закроете транзакцию, но не сможете отправить сообщение: в базе будут задваиваться и заказы и товары.

да, вы правы, много чего нет т.к пример чисто концептуальный

со всеми деталями он бы был раза 3 больше

Можете хотя бы словами описать как вы эти проблемы решали? Это достаточно важные детали, чтобы даже этот более простой пример саги, когда можно положиться на надёжный транспорт сообщений, стал более похож на то, что можно реально использовать.

1) использовать паттерн дроссельная заслонка (throttle), чтобы избежать одинаковых запросов в единицу времени
2) формировать ключ идемпотентности (включить в него ip и метку времени, например) для каждого запроса. проверяя его, можно отсеить лишние запросы
Sign up to leave a comment.