Но какую информацию может быть полезно хранить в метаданных, какую информацию стоит хранить, несмотря на то, что она не была зафиксирована при создании модели?
1. Данные аудита
- кто? — просто сохраните идентификатор пользователя инициатора действия.
- когда? — временная метка действия и события.
- почему? — сериализованное намерение/действие актера.
2. Управление версиями событий
Источник событий имеет дело с эффектом действий. Действие, выполняемое в состоянии, приводит к действию в соответствии с текущей реализацией. Ждать. Текущая реализация? Да, реализация вашего агрегата может измениться, и это произойдет либо из-за исправления ошибок, либо из-за добавления новых функций. Было бы неплохо, если бы версия, например идентификатор коммита (SHA1 для gitters) или семантическая версия, также могла храниться вместе с событием? Представьте, что вы опубликовали неработающую версию, а ваш бизнес продали. 100 билетов до исправления ошибки. Было бы неплохо иметь возможность указать, какие события были созданы на основе сломанной реализации. Обладая этими знаниями, вы можете легко компенсировать транзакции, совершенные сломанной реализацией.
3. Детали реализации документа
Довольно часто вводятся канареечные релизы, переключение функций и A/B-тесты для пользователей. Благодаря автоматизированному развертыванию и небольшому усовершенствованию кода все упомянутые подходы можно включить в проектную доску. Если вы считаете, что переключатели или разные реализации сосуществуют в один и тот же момент, хранения только версии может быть недостаточно. Как насчет добавления информации о том, какие функции были применены для действия? Просто создайте простой набор включенных функций или сопоставьте статус функции и добавьте его к событию. Имея это и команду, легко повторить процесс. Кроме того, легко проводить эксперименты A/B. Просто запустите сканирование событий с включенным A и другое для событий B.
4. Оптимизированная комбинация 2. и 3.
Если вы считаете, что это слишком много, создайте поиск наборов функций версий x. Он не такой большой и повторяется для многих пользователей, поэтому вы можете легко оптимизировать хранение набора в другом месте под ссылочным ключом. Вы можете сериализовать эту карту и рассчитать SHA1, поместить значения в карту (таблица также подойдет) и использовать идентификаторы, чтобы поместить их в событие. Существует множество вариантов переложить нагрузку либо на запрос (запросы), либо на хранилище (хранить все как именованные метаданные).
Подведение итогов
Если вы создаете архитектуру, основанную на событиях, рассмотрите возможность добавления временного измерения (версии) и небольшой конфигурации в метаданные. Как только вы это сделаете, будет намного проще рассуждать об источниках ваших событий и вводить такие инструменты, как компенсация. Не бывает слишком много данных, не так ли?