我在我的Spring启动(2.3.0)应用程序中使用Axon框架(4.3),并且我通过jpa将Postgres(9)db设置为事件存储。数据库仅用作事件存储,并且不存在其他关系。数据库也部署在专用 VM 中。
在应用程序上线一年后,我开始注意到事件处理级别极度缓慢(减慢了整个应用程序的速度)。
正在分派事件,需要一些时间来处理。
应用程序部署在4个实例中,并在我们进行部署时定期重新启动。事件存储在所有实例之间共享。
多个事件处理器被配置为一个事件跟踪处理器。
在尝试了多种技巧后,如:
没有看到任何进展。
只有重启Postgres后,性能才恢复正常,甚至更快。
对此有什么解释呢?
我猜你在这里遇到了PostgreSQL的TOAST方法。简而言之,PostgreSQL将移动内部和私有表中的任何BLOB/CLOB/LOB字段,并使用OID引用数据。
随着Axon不断生成事件,您不仅会增加< code>domain_event_entry表,还会增加这个内部表。引用以及执行的连接会变得很麻烦。尤其是如果这张私人桌子没被清理的话。
更痛苦的是token_entry
表。每次对此进行更新,因此每次流式事件处理器处理事件时,都会创建一个新的OID引用。因此,可以快速分解表。
您最好的解决方案是从Axon表的应用程序中完全删除“TOASTing”。AxonIQ正在为此撰写博客,但与此同时,2017年的这篇博客可能会指导您找到解决方案。AxonIQ已经有一个关于你需要设置的方言的样本,你可以在这里作为Saga样本的一部分。
我更正一下,AxonIQ已经有那个博客了。你可以在这里找到它。
我在用轴突事件跟踪处理器。有时事件需要10秒才能处理。 这似乎导致消息再次被处理,并出现在日志“释放令牌X/0的声明失败。它由另一个节点拥有”中。 如果我增加段数,它不会记录此事件,但事件仍被处理两次,所以我认为这可能会引起误解。 (我想我搞错了) 我已经尝试调整fetchDelay、cleanupDelay和TokenClaimInterval。没有一个解决了这个问题。我是不是缺了什么东西? 编
我可以在Axon中顺序处理的两个事件之间放置一个序列(或以一定的时间间隔执行)。这两个事件同时创建。下面是示例事件。 因为我的第二个事件取决于第一个事件的执行结果。我正在使用RabbitMq发布消息。
我想尝试使用Cassandra作为事件源应用程序中的事件存储。我对事件存储的要求非常简单。事件“模式”应该是这样的: id:聚合根实体的id data:序列化的事件数据(例如JSON) 时间戳:事件发生时 sequence_number:事件的独特版本 我对卡桑德拉完全陌生,所以请原谅我对即将写的东西的无知。我只有两个查询,我想对此数据运行。 为我提供给定聚合根 ID 的所有事件 如果序列号为 我
这很可能是我们自己的缺陷(可能是我们的bean配置Kafkapublisher/EventProcessorConfigurer),我们将解决这个问题,但在您看来,更大的问题是,是否可以让Cassandra与Axon一起工作。我记得在google groups论坛上看到一些帖子说,由于性能问题,没有考虑对Cassandra的支持。我们希望确保我们不会投资于那些将是一场噩梦或根本不是一个好的解决方案
这个问题类似于将Kafka用作CQRS EventStore。好主意?,但更具体的实现。当我有数千个事件“源”(DDD中的聚合根)时,如何使用kafka作为事件存储?正如我在链接问题和其他一些地方读到的,我会有每个来源的主题的问题。如果我将事件按类型拆分到主题中,它将更容易使用和存储,但我需要访问特定源的事件流。如何用Kafka做事件来源?
如何读取自创建以来该聚合的所有事件?