Асинхронная коммуникация между сервисами строится на Kafka и паттерне Transactional Outbox.
Transactional Outbox
Цель: гарантировать, что событие будет опубликовано в Kafka только если бизнес-транзакция успешно закоммичена (at-least-once доставка без 2PC).
Схема
- API/Use case в одной транзакции с БД:
- записывает бизнес-данные (например, пользователя);
- записывает запись в таблицу
outbox_events(topic, key, payload, status=PENDING). - Outbox Worker (отдельный процесс/поток):
- периодически читает из
outbox_eventsзаписи со статусом PENDING; - публикует их в Kafka;
- помечает записи как PUBLISHED (или удаляет).
Реализация
- Библиотека:
libs/python/storage/patterns/omni-box. - Таблица
outbox_eventsпартиционируется по времени (управление партициями —postgres-partition-manager). - Worker использует APScheduler или аналогичный планировщик для периодического опроса.
Идемпотентность потребителей
Потребители событий должны обрабатывать дубликаты (повторная доставка): по key или по event_id делать дедупликацию или идемпотентную обработку.
Топики и события (текущие)
| Топик | Producer | События | Consumers (planned) |
|---|---|---|---|
identity.user.events |
Identity service | USER_CREATED, USER_DISABLED, USER_ENABLED, USER_DELETED | Account service |
identity.identifier.events |
Identity service | IDENTIFIER_ADDED, IDENTIFIER_VERIFIED, IDENTIFIER_REMOVED | Herald (уведомления) |
credential.password.events |
Credential service | PASSWORD_SET, PASSWORD_CHANGED, PASSWORD_VERIFIED | Account, audit |
Формат сообщений: ключ — идентификатор агрегата (например, user_id); тело — JSON с типом события, версией и payload.
Паттерны потребления
- Single consumer per partition — один consumer в группе обрабатывает партицию; масштабирование через число партиций.
- Idempotent handler — обработчик по
event_idили по ключу агрегата проверяет, не обработано ли уже событие. - Dead Letter Queue — при повторяющихся ошибках сообщение можно перенаправлять в DLQ для разбора и ручного replay.
Связанные страницы
- Data Flow / Event Flow — архитектура потоков событий
- Event Schema Catalog — каталог схем событий
- Backend Overview — обзор backend
- Async Jobs and Workers — outbox worker, планировщики
- Idempotency — идемпотентность операций