1.3 KiB
1.3 KiB
Event-Driven Architecture
Envelope
All events use shared.events.EventEnvelope:
{
"event_id": "uuid",
"event_type": "tenant.created",
"aggregate_type": "tenant",
"aggregate_id": "uuid",
"tenant_id": "uuid|null",
"source_service": "core-service",
"payload": {},
"occurred_at": "ISO-8601"
}
Outbox → Inbox (ADR-006)
- Producer writes business row +
outbox_eventsin one transaction. - Worker (
process_outbox_events) publishes pending rows. - Consumer inserts
inbox_eventskeyed byevent_id(idempotency) then handles payload.
Naming
{aggregate}.{past_tense_verb} — e.g. tenant.created, subscription.updated, user.registered.
Torbat Workspace publishes workspace.* only (ADR-024). Do not emit work-management events as experience.workspace.* or payment.workspace.*.
Catalog
Canonical list → event-catalog.md
Future
Replace in-process/Celery-only publish with a real message bus without changing envelope or outbox ownership.