Событийно-ориентированный дизайн
Паттерны Kafka RPC, Outbox Pattern и Request Correlation
Событийно-ориентированный дизайн
Платформа Манитон построена на принципах асинхронного взаимодействия. Основной шиной данных является Kafka. Это позволяет достичь высокой масштабируемости, отказоустойчивости и строгого аудита всех действий.
1. Паттерн Kafka RPC (Request-Reply)
Для межсервисного взаимодействия мы используем Kafka вместо традиционного HTTP/gRPC. Это позволяет сервисам оставаться доступными даже при временном падении смежных модулей.
Преимущества:
- Backpressure: Если сервис перегружен, сообщения просто копятся в Kafka.
- Retryability: Гарантированная доставка команд.
- Traceability: Вся история запросов сохраняется в логах Kafka.
2. Гарантированная доставка (Outbox Pattern)
Для исключения ситуаций, когда данные в БД обновились, а событие в Kafka не ушло (или наоборот), мы используем Transactional Outbox.
- Сервис открывает транзакцию в PostgreSQL.
- Обновляет бизнес-таблицы (например,
identity_users). - Записывает событие в служебную таблицу
outbox_events. - Транзакция фиксируется.
- Фоновый процесс (Outbox Relay) читает таблицу и публикует сообщения в Kafka.
3. Сквозная трассировка (Request Correlation)
Каждый запрос обогащается метаданными в структуре RequestContext:
request_id: Уникальный ID внешнего запроса.correlation_id: Связывает все асинхронные цепочки действий (например:CreatePayment->FiatDeposited->CfaMinted).idempotency_key: Ключ для предотвращения повторных операций.
4. Контракты прежде всего (Protobuf First)
Все сообщения в Kafka строго типизированы. Мы используем Protobuf и инструмент Buf для обеспечения обратной совместимости.
- Envelope: Все события оборачиваются в
EventEnvelope(соответствует стандарту CloudEvents). - Versioning: Номера полей никогда не меняются, новые поля добавляются как опциональные.