首页 > 解决方案 > 通过网络分发事件

问题描述

我正在尝试将 Axon 框架用于基于事件溯源的应用程序,并且我需要发布某些类型的事件,以便其他服务可以出于特定目的(统计、电子邮件服务等)意识到这一点。问题是,从 Axon 的文档来看,服务应该共享事件存储来订阅这些事件(见这里)。这违反了微服务架构,因为服务共享数据库,尽管架构不会随着时间而改变,因为它是一个事件存储。另一种选择是设置 Kafka 或其他消息代理,如 RabbitMQ、ActiveMQ 或任何其他与 AMQP 兼容的代理。但是,这意味着这些消息代理也将负责在事件中持久化,这并不理想。我的问题是:有什么方法可以将事件保存在非共享数据存储中,但也可以将事件发布到主题或队列中的另一个服务?

谢谢。

标签: cqrsevent-sourcingaxonaxon-framework

解决方案


您是正确的,在服务之间共享数据库会违反 SOA 的原则,从而违反微服务的原则。令人惊讶的是,他们在文档中提出了这一建议。

这是我采用的一种方法,对您的设置进行了一些假设:通过 http 端点 (API) 将 Event Store 中的事件公开给外部消费者。API 可能允许过滤来自某个检查点/日期的事件,也可以通过流/聚合 Id 过滤。然后使用消息代理或 ESB 来广播通知事件,这与事件存储事件不同,并且只包含足够的信息来提醒下游服务发生了一些变化,以便它们可以查询 API。序列将类似于:

  1. 对 WidgetA 进行了更改
  2. 主服务广播一条消息,WidgetA 在 XX 日期发生了变化
  3. 消费服务接收 WidgetChangedEvent
  4. 消费服务向主服务的 API 查询 WidgetA 的 Id 晚于 XX 日期的事件

推荐阅读