Для данной службы A (CMS), которая контролирует модель (Product, давайте предположим, что у нее есть только поля, это id, title, price) и службы B (Shipping) и C (Emails), которые должны отображать данную модель, каким должен быть подход синхронизировать данные модели между этими службами в рамках подхода к источнику событий? Давайте предположим, что каталог продуктов редко изменяется (но меняется) и что есть администраторы, которые могут очень часто получать доступ к данным отправлений и электронной почты (пример функциональности: B: display titles of products the order contained
и C:) display content of email about shipping that is going to be sent
. Каждый из сервисов имеет свою БД.
Решение 1
Отправить всю необходимую информацию о продукте в рамках мероприятия - это означает следующую структуру для order_placed
:
{
order_id: [guid],
product: {
id: [guid],
title: 'Foo',
price: 1000
}
}
На сервисе B и C информация о продукте хранится в product
атрибуте JSON orders
таблицы
Таким образом, для отображения необходимой информации используются только данные, извлеченные из события.
Проблемы : в зависимости от того, какая другая информация должна быть представлена в B и C, объем данных в событии может возрасти. B и C могут не требовать одинаковую информацию о продукте, но событие должно содержать оба (если мы не разделим события на две части). Если данные отсутствуют в данном событии, код не может их использовать - если мы добавим цветовую опцию к данному Продукту, для существующих заказов в B и C, данный продукт будет бесцветным, если мы не обновим события, а затем не запустим их повторно. ,
Решение 2
Отправлять только руководство продукта в рамках мероприятия - это означает следующую структуру для order_placed
:
{
order_id: [guid],
product_id: [guid]
}
На услуги B и C информация о продукте хранится в product_id
атрибуте orders
таблицы
Информация о продукте извлекается службами B и C, когда это требуется, путем выполнения вызова API для A/product/[guid]
конечной точки.
Проблемы : это делает В и С зависимыми от А (всегда). Если схема Продукта изменяется на A, изменения должны быть сделаны для всех сервисов, которые зависят от них (внезапно)
Решение 3
Отправлять только идентификатор продукта в рамках события - это означает следующую структуру для order_placed:
{
order_id: [guid],
product_id: [guid]
}
По услугам B и C информация о товаре хранится в products
таблице; все еще product_id
на orders
столе, но есть репликация products
данных между A, B и C; B и C могут содержать информацию о продукте, отличную от A
Информация о продукте просвечивается при создании служб B и C и обновляется всякий раз, когда меняется информация о продуктах, путем вызова A/product
конечной точки (которая отображает требуемую информацию обо всех продуктах) или путем прямого доступа к базе данных А и копирования необходимой информации о продукте, необходимой для данного служба.
Проблемы : это делает В и С зависимыми от А (при посеве). Если схема Продукта изменяется на A, изменения должны быть сделаны для всех сервисов, которые зависят от них (при заполнении)
Насколько я понимаю, правильным подходом было бы пойти с решением 1 и либо обновить историю событий в соответствии с определенной логикой (если каталог продуктов не изменился, и мы хотим добавить цвет для отображения, мы можем безопасно обновить историю, чтобы получить текущее состояние продуктов и заполнить недостающие данные в событиях) или учитывать отсутствие данных (если каталог продуктов изменился, и мы хотим добавить цвет для отображения, мы не можем быть уверены, что в тот момент в прошлом данный продукт был цвет или нет - мы можем предположить, что все товары в предыдущем каталоге были черными и обслуживали путем обновления событий или кода)
updating event history
я имею в виду: пройти через все события, копируя их из одного потока (v1) в другой поток (v2), чтобы поддерживать согласованную схему событий.
display image at the point when purchase was made
) или не может (представляющее намерения display current image as it within catalog
)
updating event history
- В событии источников событий история событий является вашим источником правды и никогда не должен быть изменен, а только идти вперед. Если события изменяются, вы можете использовать управление версиями событий или аналогичные решения, но при воспроизведении ваших событий до определенного момента времени состояние данных должно быть таким, каким оно было в тот момент.