给定服务A(CMS)来控制模型(产品,让我们假设它具有的唯一字段是id,标题,价格)以及服务B(运费)和服务C(电子邮件)必须显示给定模型的方法是什么在事件采购方法中跨这些服务同步给定的模型信息?我们假设产品目录很少更改(但确实会更改),并且有管理员可以非常频繁地访问货运和电子邮件数据(示例功能为: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可能不需要有关Product的相同信息,但是事件必须包含两者(除非我们将事件分成两个)。如果给定事件中不存在给定数据,则代码将无法使用它-如果我们将给给定产品添加颜色选项,则对于B和C中的现有订单,给定产品将是无色的,除非我们更新事件然后重新运行它们。
解决方案2
在事件内仅发送产品的GUID-这意味着以下结构order_placed
:
{
order_id: [guid],
product_id: [guid]
}
在服务B和C上,产品信息存储在表的product_id
属性orders
中
必要时,服务B和C通过对A/product/[guid]
端点执行API调用来检索产品信息
问题:这使得B和C始终依赖于A。如果产品模式在A上发生更改,则必须对依赖于它们的所有服务进行更改
解决方案3
仅在事件内发送产品的GUID-这表示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进行直接DB访问并复制给定的必需产品信息来更改有关产品的信息,就可以更新产品信息。服务。
问题:这使得B和C依赖于A(播种时)。如果产品模式在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
-在事件来源中,事件历史是您的真理之源,切不可更改,而应向前迈进。如果事件发生更改,则可以使用事件版本控制或类似的解决方案,但是在重播事件直到特定时间点时,数据状态应与该点相同。