Какие поля обязательно закладывают в конверт (envelope) сообщения?
- Какие метаданные должны быть в каждом событии?
В конверт кладут: id события (для идемпотентности), тип и версию схемы, время события, источник, correlation/trace id и id агрегата.
- id — дедупликация у потребителей
- Версия схемы — эволюция формата
- trace id — сквозная трассировка через брокер
А ещё Список получателей в событии — признак, что это скрытая команда
Подробно
Конверт с метаданными важнее красоты полезной нагрузки: без идентификатора нельзя дедуплицировать, без версии схемы нельзя развивать формат, без времени события невозможно отличить порядок наступления фактов от порядка доставки, без корреляции невозможно связать цепочку обработки в трассировке. Отдельно стоит различать время наступления события и время его публикации — они расходятся при повторах и задержках. Перечисление получателей внутри события противоречит самой идее публикации: издатель не должен знать подписчиков, иначе связность возвращается и добавление потребителя требует правки издателя.
Что хотят услышать
- Обязательные поля и зачем каждое.
- Чего в событии быть не должно.
Частые ошибки
- Складывать метаданные вперемешку с бизнес-полями.
- Указывать в событии, кто должен его обработать.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Уникальный идентификатор события для дедупликации
- ✓Тип события и версию схемы
- ✓Время события и идентификатор корреляции
- ✗Список всех потребителей, которые должны обработать это сообщение
Что спросят дальше
- Чем время события отличается от времени публикации?
- Как идентификатор события используется для дедупликации?
Разбор темы
- Проектирование событий и команд
Event vs command, обязательные поля envelope, idempotency key, schema evolution, thick vs thin payload и transactional outbox.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.