使用Kafka和MongoDb连接器同步微服务之间的事件



我正在尝试微服务架构。我有UserServiceShoppingService。在UserService我使用MongoDb。当我在UserService中创建新用户时,我想将基本用户信息同步到ShoppingService。在UserService中,我使用的是事件来源之类的东西。当我创建新的User时,我首先创建UserCreatedEvent,然后将事件应用到域User对象上。因此,最后我得到具有当前状态的域User对象和包含一个UserCreatedEvent的事件列表。

我想知道我是否应该坚持Events集合作为User文档的嵌套属性或单独的UserEvents集合。我计划使用Kafka Connect将事件从UserService同步到ShoppingService

如果我决定在User文档中持久化事件,那么我不需要事务,我将使用它来保存事件以分离UserEvents集合,但我不能设置Kafka连接器来仅跟踪嵌套属性中的变化。

如果我决定在单独的UserEvents集合中持久化事件,我需要将事务更改包装到UserUserEvents。但是将事件保存到单独的集合使得设置Kafka连接器非常容易,因为我只跟踪插入,我不需要跟踪User文档中嵌套的UserEvents数组的更新。

为了简单起见,我想我会选择第二个选项,但也许我错过了什么。像这样实现它是一个好主意吗?

我通常建议采用第二种方法。请注意,您也可以通过观察User只是基于UserEvents的快照来消除对事务的需求,直到流中的某个点,因此不必立即更新。

有了这个,你对User的读取操作可以是:从User(最新的快照)中选择一个用户,其中包括一个版本/序列号,表示它是某个事件的版本/序列号;然后选择序列号较晚的事件,并将这些事件应用于用户。如果有一些查询器想要更快的响应,并且可以容忍得到一些过时的东西,那么不同的端点(或查询中的一个选项)可以绕过事件重播。

你可以有一些异步进程订阅用户事件流,并基于这些事件更新User