3

我正在关注 Allard ( https://github.com/abuijze/bootiful-axon ) 分享的 axon-springboot 示例。

到目前为止我的理解是:(如果我误解了一些概念,请纠正我)

事件被引发并存储在事件存储/事件总线(Mysql)中(使用 EmbeddedEventStore)。现在,事件处理器(TrackingProcessors - 在我的例子中)将从源(MySql - 对吗?)中提取事件,事件处理程序将执行业务逻辑并更新发布到 RabbitMQ 的查询存储和消息。

第一个问题是在何处、何时以及由谁将此消息发布到 RabbitMQ(由配置了消息侦听器的统计应用程序使用。)

我已经配置了 TrackingProcessor 来尝试回放功能。为了执行重播,我停止了我的处理器,删除了处理器的令牌条目,启动了处理器并重播了事件,并且我的查询存储按预期是最新的。

第二个问题是,当触发重播并更新查询存储时,我看不到任何消息发布到 RabbitMQ ......所以我的统计应用程序不同步。难道我做错了什么?

你能给些建议么?谢谢辛格

4

1 回答 1

3

首先,更正一下:将消息发送到 RabbitMQ 的不是跟踪处理器或视图模型的更新器。事件在发布到事件总线时被转发给 Rabbit。

第一个问题的答案:消息由 SpringAmqpPublisher 发布,它直接连接到事件总线,并在发布时将任何已发布的消息转发到 RabbitMQ。

为了回答您的第二个问题,让我们首先澄清回放的工作原理。虽然它被称为“重播”,但本质上它更像是“重置”。跟踪处理器使用 TrackingToken 来记住其处理事件存储的进度。当令牌被删除(或尚不可用)时,跟踪处理器从事件存储的开头开始处理。

您永远不会回复整个应用程序,只需一个(跟踪)处理器。想象一下:您再次将所有消息重新发布到 RabbitMQ,再次触发其他组件,不知道这些是“旧”消息,再次发送用户确认电子邮件,再次下订单等等。

如果您的统计数据已过期,那是因为它们不是同一处理器的一部分,并且没有与其他元素一起重建。RabbitMQ 不支持“重播”,因为它在传递消息后不记得消息。

您希望能够重建的任何模型都应由跟踪处理器管理。

查看 Axon 参考指南以获取更多信息:https ://docs.axonframework.org/part3/event-processing.html#event-processors

于 2017-12-25T13:29:06.357 回答