Transaction Boundaries, Side Effects И Sagas
Назначение
Документ описывает, как Pin фиксирует границы транзакций и побочные эффекты для операций с деньгами, платежами, KYC, играми, бонусами, партнерами и настройками платформы.
Базовое Правило
Одна транзакция принадлежит одному сервису и одной operational database. Cross-service distributed transaction запрещена по умолчанию. Межсервисная согласованность достигается через MassTransit Inbox/Outbox, idempotency, saga state, compensating commands и reconciliation.
Стандарт Transaction Boundary
Каждая mutation операция описывает:
| Пункт | Описание |
|---|---|
| Начало | После каких проверок открывается транзакция. |
| Commit | После каких записей транзакция завершается. |
| Сущности | Aggregates, child entities, technical records. |
| Idempotency | Где хранится ключ и результат повторного запроса. |
| Audit | Какие audit records пишутся в той же транзакции. |
| Outbox | Какие events публикуются через MassTransit outbox до commit. |
| External Calls | До или после commit, timeout, retry, reconciliation. |
| Rollback | Что происходит при ошибке до commit. |
| Partial Success | Что происходит при ошибке после external side effect. |
Внешние Вызовы
- Provider call до commit допускается только если provider требует синхронного создания session/payout до локального ответа.
- Provider call после commit предпочтителен для долгих операций и выполняется background worker-ом.
- Каждый external call имеет idempotency key или deterministic external reference.
- Partial success обязательно закрывается reconciliation job.
Saga
Saga используется, когда бизнес-flow затрагивает несколько сервисов и не может быть завершен одной локальной транзакцией.
| Flow | Saga State Owner | Примеры Шагов |
|---|---|---|
| Deposit | Accounting | request created, provider session created, callback completed, ledger posted |
| Withdrawal | Accounting | request created, hold placed, admin approved, provider payout sent, ledger captured |
| Incentive Grant | Incentive Store | rule matched, incentive created, accounting incentive balance credited |
| KYC Approval | Profile/KYC | verification approved, profile level updated, accounting limits refreshed |
Saga state хранит текущий шаг, correlationId, idempotency keys, external references, retry count, last error и next retry time.
Side Effects
Side effects не прячутся внутри handler-а. Они перечисляются в постановке:
- Kafka events через MassTransit outbox;
- provider/internal HTTP calls;
- cache invalidation;
- Elasticsearch/read model updates;
- notifications;
- audit records;
- metrics и traces.
Reconciliation
Reconciliation job обязателен, если внешний provider может изменить состояние независимо от нашей транзакции.
Job описывает источник правды, ключ сопоставления, периодичность, допустимые статусы для исправления, audit trail и события после исправления.
Обратные ссылки
Автоссылки: где используется этот документ.
- data-architecture.md (1): Архитектура Данных
- scenarios (1): Кросс-сервисные сценарии PIN (OVR)
- adr (1): ADR-0005: Financial Ledger И Double-Entry Accounting
- architecture-overview.md (1): Архитектура Pin
- ddd-rich-model-rules.md (1): DDD И Rich Model: Правила И Практика