AxonIQ处理新事件,同时重播旧事件



偶尔,我们不得不从axon事件存储中回放事件来更新我们的投影。此重播需要几个小时,而且随着时间的推移,只会持续更长的时间。这意味着在重播期间,我们的应用程序不会处理新事件。

我想知道是否有一种方法可以在重播的同时继续处理事件?axon是否提供了这样的机制,或者我们是否必须创建两个不同的事件处理程序:一个用于";正常的";处理和一个回放?

Axon没有提供开箱即用的解决方案。大致来说,你可以采取两种方法:

  1. 执行一种蓝色/绿色部署形式。十有八九,需要一个重播,以符合开发过程中构建的新查询模型格式。如果您使用蓝色/绿色部署样式,您可以简单地预热/回放新实例,并在完成后跳过
  2. 在调用重播期间,实现额外的组件来构造新的TrackingEventProcessor及其包含的事件处理组件。此外,需要并行运行一个新的查询模型存储来存储新格式,并在流程完成后设置别名进行切换

我敢打赌,其中一个选项将是最少的代码工作和更多的操作。选项2当然会改变这一点。

请注意,在进行回放时,您总是需要处理一定程度的最终一致性。事件只是在系统中不断发生,所以从概念上讲,到达事件流的末尾是不会发生的。因此,在构建该空间中的任何解决方案之前,您需要决定回放何时足够远。

最后,还有一些方法可以提高事件处理速度,从而提高重放速度。这篇博客简要介绍了您可以为此做些什么,简而言之,可以通过调整事件处理batchSize、处理线程和段的数量,最后绑定到Axon的UnitOfWork来改进数据库访问来总结。

更新

当涉及到回放功能时,最好考虑的是注意到它是一个强大但沉重的工具任何事件系统(不仅仅是Axon(,如果您需要重播数十亿个事件,都会给实施和部署策略带来一些压力。或者更进一步,你是否应该这样做。

因此,您必须推断重播是否是当前问题的最佳解决方案。有时,简单地直接更新查询模型是最实用的解决方案,而且可以节省大量时间。但在某些场景中,您可能已经在事件处理和部署策略中实现了增强,以允许快速回放。

我还见过很多域,其中重播不需要事件存储的完整重播。如果应用程序的用户只要求立即呈现去年的模型,那么只回放去年的事件要简单得多。也许最后3个月就足够了。

从概念的角度来看,重播可以解析系统中的所有答案。这绝对是活动采购解决方案的好处,因为你实际上有一个单一的真相来源。但与任何工具一样,你应该在正确的时间将其用于正确的问题。

谢谢史蒂文。博客的改进很有趣,但即使这样,10亿个事件流也需要近10个小时才能重播,长时间错过新事件是不可接受的。所以我想,即使有超好的事件处理速度,仍然需要通过实现您提出的两种解决方案之一来解决这个问题。

最新更新