【问题标题】:Axon Event Published Multiple Times Over EventBusAxon 事件通过 EventBus 多次发布
【发布时间】:2021-03-03 23:01:27
【问题描述】:

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

我看到的问题如下:(1) 我发布了一个命令(例如 CreateServiceCommand),该命令命中了 ServiceAggregate 的构造函数,然后 (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

【问题讨论】:

    标签: apache-kafka cqrs axon


    【解决方案1】:

    给定的解释有几个漏洞,说实话很奇怪,而且很难确定问题所在。

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

    从你的成绩单我猜你说的是一个创建聚合的命令处理程序。因此,您所看到的行为让我觉得很奇怪。事件存储是自定义的,会插入这种不良行为,或者是由于未使用 Axon 的专用 Kafka Extension

    另请注意,使用像Axon Server 这样的事件存储和消息分发的单一解决方案将完全忽略该问题。您将不再需要在 Kafka 上配置任何自定义事件处理和发布,从而节省您的个人开发工作和基础设施协调。补充说,它为您提供了我之前讨论过的保证。从更多关于 Axon Server 的原因/方式的见解中,您可以查看我的this other SO 回复。

    【讨论】:

    • 感谢@Steven 的确认。是的,事件存储是自定义 Cassandra 实现。我们有严格的安全性和可扩展性要求,而 Axon Server 可能还不够,但也许我们会再看看它。
    • 为了避免创建另一个帖子,我们还在 snapshot_event_entry 表中看到了重复项。这是我们不应该看到的吗?同样,可能是我们自己做的。
    • 在默认设置中确实不应该发生快照条目重复。
    • 我更新了我的帖子。我们的实现确实有缺陷。感谢您的帮助史蒂文!
    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 2020-11-14
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2022-01-08
    • 1970-01-01
    相关资源
    最近更新 更多