Axon:使用 Cassandra 作为事件存储

问题描述

我们正在尝试实现我们自己的基于 Cassandra 的事件存储,它扩展了 EmbeddedEventStore。关于为什么这可能不适用于 Axon 以便我们看到与使用 JPA 相同的行为的任何想法?一种怀疑围绕着 Cassandra 支持最终一致性这一事实。目前,当在单个 JVM 中使用多线程 TrackingEventProcessor 和/或在具有日志的不同 JVM 中部署基于 Saga 的应用程序时,我们会看到意外行为,如下所示:

o.a.e.TrackingEventProcessor : message=Unable to claim the token for segment: 0. It is owned by another process

似乎它总是试图从段 0 中检索。

这很可能是我们自己的缺陷(也许与我们的 bean 配置 KafkaPublisher/EventProcessorConfigurer)有关,我们将解决这个问题,但更大的问题是,在您看来,是否可以使Cassandra 与 Axon 合作。我记得在 google 群组论坛中看到过一些帖子,指出由于性能问题,没有考虑 Cassandra 支持。我们希望确保我们不会投资于维护起来会是一场噩梦或根本不是一个好的解决方案。

解决方法

如果您想在使用 Axon 框架的同时创建自己的事件存储解决方案,建议提供 EventStorageEngine 实现。

这样,如果您不使用 Axon 服务器,EventStore 类型的 EmbeddedEventStore 可以简单地指向用于存储和检索事件的其他存储解决方案。 EventStorageEngine 的样本是 JpaEventStorageEngineJdbcEventStorageEngineMongoEventStorageEngine。前两者位于 Axon Frameworks 事件源模块中,而 MongoDb 变体是 Axon Mongo Extension 的一部分。

现在,关于它是否可行的实际问题。 我非常有信心您应该能够起草一份能够很好地完成工作的 CassandraEventStorageEngine

它是否会成为您可以拥有的最佳 Event Store 是非常值得商榷的。 AxonIQ 将 Axon Server 设计为 Event Store 是有原因的,这仅仅是因为如果您使用不同的存储方法,您对 Event Store 的所有硬性要求都没有得到最佳实现? 为什么?原因很简单,因为 RDBMS、MongoDb、Cassandra、Kafka 等提供了比事件存储更广泛的功能,其核心意图不同。

此处提供所有详细信息会有点多,但 Allard Buijze(Axon 框架的创建者)的 this 演示应该会对此提供一些见解。另外,为什么 Cassandra 不是最佳解决方案。

最后,如果您强烈希望建立自己的活动商店,那么选择 Cassandra 将是一项有趣的尝试。如果它可以从 Event Store 中为您带来所有需要的,那就有待商榷了。