cqrs - 通过网络分发事件
问题描述
我正在尝试将 Axon 框架用于基于事件溯源的应用程序,并且我需要发布某些类型的事件,以便其他服务可以出于特定目的(统计、电子邮件服务等)意识到这一点。问题是,从 Axon 的文档来看,服务应该共享事件存储来订阅这些事件(见这里)。这违反了微服务架构,因为服务共享数据库,尽管架构不会随着时间而改变,因为它是一个事件存储。另一种选择是设置 Kafka 或其他消息代理,如 RabbitMQ、ActiveMQ 或任何其他与 AMQP 兼容的代理。但是,这意味着这些消息代理也将负责在事件中持久化,这并不理想。我的问题是:有什么方法可以将事件保存在非共享数据存储中,但也可以将事件发布到主题或队列中的另一个服务?
谢谢。
解决方案
您是正确的,在服务之间共享数据库会违反 SOA 的原则,从而违反微服务的原则。令人惊讶的是,他们在文档中提出了这一建议。
这是我采用的一种方法,对您的设置进行了一些假设:通过 http 端点 (API) 将 Event Store 中的事件公开给外部消费者。API 可能允许过滤来自某个检查点/日期的事件,也可以通过流/聚合 Id 过滤。然后使用消息代理或 ESB 来广播通知事件,这与事件存储事件不同,并且只包含足够的信息来提醒下游服务发生了一些变化,以便它们可以查询 API。序列将类似于:
- 对 WidgetA 进行了更改
- 主服务广播一条消息,WidgetA 在 XX 日期发生了变化
- 消费服务接收 WidgetChangedEvent
- 消费服务向主服务的 API 查询 WidgetA 的 Id 晚于 XX 日期的事件
推荐阅读
- javascript - 在不禁用 eslint 的情况下解决没有未使用的表达式错误?
- c# - Catel:防止 DataWindow 自动调整大小
- javascript - 使用 Vue Axios 和 Laravel 在多部分/表单数据 POST 数据中缺少边界
- javascript - 为什么我需要添加 [i-1] 以使循环正确地遍历数组?
- python - Python - Seaborn kdeplot 设置点标记
- azure-sql-database - 外部表的外部表
- python - 在 tkinter 问题中将 np 数组显示为 imshow
- vimeo - 我可以使用 Vimeo 托管移动应用程序的公共视频(本机播放器)吗?
- regex - 正则表达式匹配特定位置的数字
- python - 在带有 Groupby 的 Pandas 中:从以另一列为条件的列分配值