События сервиса нужны для projections, audit, troubleshooting и синхронизации с control-plane-service. Kafka используется как event transport, но не как источник истины: authoritative state хранится в PostgreSQL execution-plane-service.
Event Envelope
1 2 3 4 5 6 7 8 9 10 11 | |
Правила:
event.idуникален глобально.correlation_idобычно равенoperation_id.causation_idравенattempt_idили команде, которая вызвала событие.- Payload не содержит secret values.
- Публикация выполняется через outbox pattern из той же БД.
Published Events
execution.attempt.queued
Attempt создан и ожидает runner.
1 2 3 4 5 6 7 8 | |
execution.attempt.leased
Runner получил lease.
1 2 3 4 5 | |
execution.attempt.started
Runner начал выполнение.
1 2 3 4 | |
execution.attempt.progressed
Heartbeat/progress snapshot.
1 2 3 4 5 | |
Не каждый heartbeat обязан становиться Kafka event. Сервис может публиковать sampled progress events, а полную heartbeat history хранить в БД.
artifact.created
Создан artifact или log bundle.
1 2 3 4 5 6 7 8 | |
execution.attempt.succeeded
Техническое выполнение завершилось успешно.
1 2 3 4 5 6 7 8 9 10 | |
Это не означает automatic business success всей операции.
execution.attempt.failed
Техническое выполнение завершилось ошибкой.
1 2 3 4 5 6 7 8 9 10 | |
execution.attempt.cancelled
Attempt остановлен по запросу.
1 2 3 4 5 | |
execution.attempt.timed_out
Attempt превысил timeout.
1 2 3 4 | |
execution.attempt.heartbeat_lost
Runner перестал отправлять heartbeat.
1 2 3 4 | |
Consumed Commands / Events
Основной command path идет через internal API, но сервис может потреблять control events:
operation.cancel_requested- запросить cancellation для связанных attempts;runner.drain_requested- перестать выдавать новые leases конкретному runner pool;artifact.retention_policy.changed- пересчитать retention для bundles.
Эти events не заменяют API для запуска jobs.
Ordering
- Для одного
attempt_idevents публикуются в порядкеattempt_events.created_at. - Для разных attempts глобальный порядок не гарантируется.
- Consumers должны быть idempotent.
Delivery
- Outbox row создается в той же транзакции, что и state change.
- Event worker публикует row в Kafka.
- После publish фиксируется delivery status.
- Re-publish допускается, consumers дедуплицируют по
event.id.
Consumers
Основные consumers:
control-plane-service.event-worker- связывает attempt events с operation/node timeline;- audit integration - future extension point;
- observability pipeline - metrics/traces/log index;
- billing integration - future extension point для resource usage accounting.
Security
- События не содержат secret values.
- URI артефактов должны быть refs, а не signed download URLs.
- Ошибки проходят redaction.
- Payload ограничен metadata; большие outputs лежат в S3/MinIO.