Axon 事件通过 EventBus 多次发布

Axon Event Published Multiple Times Over EventBus

只是想确认 Axon 的预期行为,而不是我在应用程序中看到的行为。我们有一个与 Axon 框架集成的自定义 Kafka 发布器,以及一个自定义的 Cassandra 支持的事件存储。

我看到的问题如下:(1) 我发布了一个命中 ServiceAggregate 构造函数的命令(例如 CreateServiceCommand),然后 (2) 将 ServiceCreatedEvent 应用于聚合。 (3) 我们看到领域事件在后端持久化并通过 EventBus 发布(我们有一个 Kafka 消费者)。

一切都很好,但假设我使用相同的聚合标识符再次发布相同的命令。我确实看到 ServiceCreatedEvent 被应用于调试器中的聚合,但由于域事件记录已经存在,并且没有任何内容保留到后端。同样,一切都很好,但是我看到 ServiceCreatedEvent 被发布到 Kafka 并被我们的侦听器使用,这是意外行为。

我想知道这是否是 Axon 的预期行为,或者我们的 Kafka 集成是否应该确保我们不会通过 EventBus 发布重复事件。

编辑:

我交换了 Axon 的 JPA 事件存储,并在尝试发出命令以创建已存在的聚合时看到以下日志。那么这个问题确实是由于我们的自定义事件存储存在缺陷。

"oracle.jdbc.OracleDatabaseException: ORA-00001: unique constraint (R671659.UK8S1F994P4LA2IPB13ME2XQM1W) violated\n\n\tat oracle.jdbc.driver.T4CTTIoer11.processError

给出的解释有几个漏洞,说实话很奇怪,很难确定问题出在哪里。

简而言之,Axon 不会因为第二次发送完全相同的命令而发布两次事件。这取决于您的实施。如果该命令创建了一个聚合,那么您应该会看到对聚合标识符和(聚合)序列号的唯一性要求的约束冲突。如果它是一个适用于现有聚合的命令,它是否幂等取决于您的实现 yes/no.

根据您的成绩单我猜您正在谈论创建聚合的命令处理程序。因此,您看到的行为让我觉得很奇怪。事件存储是自定义的,它插入了这种不需要的行为,或者是由于没有使用 Axon 的专用 Kafka Extension.

另请注意,使用单一解决方案进行事件存储和消息分发,例如 Axon Server will omit the problem entirely. You'd no longer need to configure any custom event handling and publication on Kafka at all, saving you personal development work and infrastructure coordination. Added, it provides you the guarantees which I've discussed earlier. From more insights on why/how of Axon Server, you can check 我的 SO 响应。