Перейти к содержанию

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 проводок.

Первичные источники