Event-driven banking platform¶
Раздел 05 · Редакционный стандарт
Тип материала — референсная архитектура. HYPOTHETICAL — схемы и операции. INFERENCE — инженерные рекомендации и критерии выбора. Внешние контракты ограничены источниками ниже.
Бизнес-задача¶
Развязать команды core banking, доменные факты и перестраиваемые read models.
Требования¶
Сохранить boundary денежной операции и доступную историю. Управлять evolution, retries и privacy.
Поток данных и владение состоянием¶
flowchart LR
A["Banking channels"] --> B["Core command API"]
B --> C["Ledger and outbox"]
C --> D["Event backbone"]
D --> E["Read models"]
Core владеет posting и account rules. Доменный event описывает committed fact.
Транзакционные границы¶
Local core commit и downstream commits раздельны. Saga координирует междоменные эффекты через durable state.
Порядок и идемпотентность¶
Ordering по aggregate и revision. Команды имеют operation ID. Consumers поддерживают inbox и version guard.
Нормальная последовательность¶
sequenceDiagram
participant A as Banking channels
participant B as Core command API
participant C as Ledger and outbox
participant D as Event backbone
A->>B: Submit core command
B->>C: Commit posting and outbox
C-->>B: Return committed journal reference
B->>D: Publish domain fact to backbone
Отказ и восстановление¶
sequenceDiagram
participant B as Core command API
participant C as Ledger and outbox
participant E as Recovery operator
B->>C: Subscriber commits view but loses progress
Note over B,C: Outcome becomes uncertain
E->>C: Rebuild view with durable identity guard
E->>B: Resume from verified boundary
При отставании consumer пересобрать shadow view. Перед replay запретить external effects или применить operation guard. Компенсация является новой операцией.
Сверка¶
Сверить ledger факт, опубликованный event и downstream keysets.
Контракт события. Aggregate ID задаёт partitioning и routing, event ID связывает retries, aggregate revision обнаруживает gaps, occurred_at и recorded_at отвечают на разные вопросы. Consumer, принимающий deltas, не может без проверки пропустить revision. При gap временно остановите этот aggregate, восстановите факты и отдельно измерьте задержку соседних aggregate. Проекция и inbox могут хранить общую durable boundary.
Наблюдаемость¶
Outbox age, replay frontier, DLQ debt и drift.
Безопасность и применимость требований¶
Разделить доступ к events по purpose. Минимизировать поля клиента.
Альтернативы и trade-offs¶
Modular monolith проще внутри общей транзакции. Event backbone помогает независимым consumers.
Вопросы на собеседовании¶
Что остаётся синхронным? Авторитетная проверка средств и commit проводок.