Event Contract: <event.name> (<EventName>)
Версионируемый контракт интеграционного Kafka-события. Consumer-документы ссылаются сюда, не переописывая payload.
Назначение
Какое доменное изменение фиксирует событие, кто producer, почему оно публичное и какие consumers его используют без синхронного запроса в owning-контекст.
Metadata
| Поле | Значение |
|---|---|
| Event type | <event.name> (напр. pin.crm.client-fixated) |
| Topic | <topic-name> (напр. pin.crm.client-fixations.v1) |
| Partitions / key | <кол-во партиций> / ключ = MessageId (Guid v7) или AggregateId |
| ContractVersion | <n> |
| Producer | <context/service> |
| Статус | draft / approved / deprecated |
Событие публикуется атомарно со сменой состояния агрегата: пока изменение не зафиксировано, событие не отправляется потребителям; после фиксации — доставляется гарантированно (at-least-once).
Payload <EventName>
Публичные display-поля бизнес-состояния. Snapshot-поля ссылаются на дом сущности
(entity: <EntityName>) — перечисляется только то, что реально
в событии.
| Поле | Тип | Обязательность | Источник (поле агрегата) | Compatibility | Описание |
|---|---|---|---|---|---|
<AggregateId> | Guid | Да | <Entity>.Id | Immutable | Ключ агрегата. |
TenantId | Guid | Да | <Entity>.TenantId | Immutable | Tenant boundary. |
<Snapshot> | <SnapshotModel> | Да | aggregate | Additive only | Типизированный snapshot. |
Вложенная модель <SnapshotModel>
| Поле | Тип | Обязательность | Ограничения | Описание |
|---|
Когда публикуется
| Условие | Переход состояния | Публикация |
|---|---|---|
<condition> | <From> → <To> | атомарно со сменой состояния агрегата |
Потребители (consumers)
| Consumer-контекст | Consumer | Side effects | Идемпотентность | Задержка (SLA) |
|---|---|---|---|---|
<context> | <ConsumerName> | <projection/command/export> | MessageId/business key | <SLA> |
Версионирование и совместимость
- Версия — один
ContractVersion; consumer приVersion != ContractVersionлогирует предупреждение и продолжает обработку. Топик кодирует версию по конвенции — суффикс.vNв имени. - Additive-only для minor: новые поля добавляются как optional с безопасным default — без bump.
- Breaking (удаление/переименование/смена типа/смысла) — новый
ContractVersion+ новый топик.vN+1- параллельная публикация (dual-publish) на период миграции + deadline миграции consumers + sunset старой.
- Unknown enum — обрабатывается явно (fallback). Deprecated-версия — sunset rule.
Безопасность
| Поле | Класс данных | Правило |
|---|---|---|
<FieldName> | Public/Internal/PII/Sensitive | include/mask/exclude |
Событие НЕ содержит secrets, tokens, raw credentials, полные PII и иные чувствительные реквизиты, unbounded вложения.
Обратные ссылки
Автоссылки: где используется этот документ.
- События (6): События контекста selections: карта топиков и отклонённые события, Event Contract: pin.rewards.commission-accrual-created, Event Contract: pin.rewards.commission-distribution-adjusted (CommissionDistributionAdjustedKafkaEvent), Event Contract: pin.rewards.commission-money-received (CommissionMoneyReceivedKafkaEvent), Event Contract: pin.rewards.referral-accrual-created (ReferralAccrualCreatedKafkaEvent), Event Contract: pin.rewards.referral-accrual-status-changed (ReferralAccrualStatusChangedKafkaEvent)
- documentation-file-templates.md (1): Индекс Шаблонов Документации
- index.md (1): Шаблоны Документации
Связанные документы
- Источник (операция): api-method; сущность: entity-template.md; consumers: consumer-template.md.