bank-saga
Перевод между счетами (§11.3): Bank.debit списывает, Bank.credit зачисляет; если зачисление не удалось, списание
отменяется компенсацией undo. Счета — шардированные акторы Account, методы Bank помечены @idempotent, потому что каждый
шаг саги получает ключ идемпотентности.
oxl run examples/bank-saga
oxl test examples/bank-sagaВывод oxl run:
1 -> 2, 30: ok, target balance 30
1 -> 99, 50: account 99 is blocked, debit compensated
1 -> 2, 500: insufficient funds (70)
balance of 1: 70На что смотреть: тип результата саги i64 | Insufficient | Blocked | CompensationFailed | NetError разбирается одним match;
cluster bank { role all { serves Bank; hosts Account; journal; runs sagas } }: сага требует роль с журналом и runs sagas;
три теста проверяют успех, компенсацию и отказ до зачисления. Продолжение — оформление заказа в shop
(склад и платежи там внешние сервисы, подменяемые mock).