【发布时间】:2021-02-01 02:32:59
【问题描述】:
情况
为了更好地理解 CQRS、事件溯源和异步服务通信的概念,我一直在使用 Go、MongoDB 和 RabbitMQ 构建一个小型系统。这包括以下内容:
- 命令 API:公开 API 以接受和处理命令,然后将事件写入 MongoDB 集合(称为“事件”)
- 事件发布者:监视“事件”集合的变化并将其发布到 RabbitMQ
- 事件消费者:从 RabbitMQ 接收事件并使用它们来更新读取优化的 MongoDB 集合
- 查询 API:公开 API 以从具体化集合返回数据
(我设想为系统中的每个微服务重复一组类似的应用程序,所有应用程序都通过 RabbitMQ 异步通信)
问题
我觉得我在高层次上对这些概念有了不错的掌握,但是在构建这个系统时,我在细节上遇到了一些麻烦。我发现我需要:
-
使用 BSON 作为 RabbitMQ 有效负载,使事件发布者的事情变得“简单” - 这感觉就像 MongoDB 正在泄漏到设计的其余部分,因为否则我不会选择 BSON
-
让事件发布器了解所有事件类型,以便它可以正确地将存储的事件从 BSON 转换为 JSON(例如,将日期和 UUID 重写为字符串)以发布到消息总线 - 这似乎很臭,因为各种事件类型需要在不少于三个不同的地方定义(命令端、查询端、和事件发布者)。
问题
-
这种类型的问题对于使用 CQRS + 事件溯源 + 消息总线的设计来说是正常现象,还是我的方法存在根本缺陷?
-
如果这是课程的标准,那么以上两个选项中哪一个更适合用于生产环境?
我的搜索没有发现任何关于这个问题的信息,但如果你知道一篇文章或博客文章解决了这个问题,那可能就足够了。
【问题讨论】:
标签: mongodb go rabbitmq cqrs event-sourcing