我正在尝试微服务架构。我有UserService
和ShoppingService
。在UserService
我使用MongoDb。当我在UserService
中创建新用户时,我想将基本用户信息同步到ShoppingService
。在UserService
中,我使用的是事件来源之类的东西。当我创建新的User
时,我首先创建UserCreatedEvent
,然后将事件应用到域User
对象上。因此,最后我得到具有当前状态的域User
对象和包含一个UserCreatedEvent
的事件列表。
我想知道我是否应该坚持Events
集合作为User
文档的嵌套属性或单独的UserEvents
集合。我计划使用Kafka Connect将事件从UserService
同步到ShoppingService
。
如果我决定在User
文档中持久化事件,那么我不需要事务,我将使用它来保存事件以分离UserEvents
集合,但我不能设置Kafka连接器来仅跟踪嵌套属性中的变化。
如果我决定在单独的UserEvents
集合中持久化事件,我需要将事务更改包装到User
和UserEvents
。但是将事件保存到单独的集合使得设置Kafka连接器非常容易,因为我只跟踪插入,我不需要跟踪User
文档中嵌套的UserEvents
数组的更新。
为了简单起见,我想我会选择第二个选项,但也许我错过了什么。像这样实现它是一个好主意吗?
我通常建议采用第二种方法。请注意,您也可以通过观察User
只是基于UserEvents
的快照来消除对事务的需求,直到流中的某个点,因此不必立即更新。
有了这个,你对User
的读取操作可以是:从User
(最新的快照)中选择一个用户,其中包括一个版本/序列号,表示它是某个事件的版本/序列号;然后选择序列号较晚的事件,并将这些事件应用于用户。如果有一些查询器想要更快的响应,并且可以容忍得到一些过时的东西,那么不同的端点(或查询中的一个选项)可以绕过事件重播。
你可以有一些异步进程订阅用户事件流,并基于这些事件更新User
。