【问题标题】:Accessing all (historical) events in Axon访问 Axon 中的所有(历史)事件
【发布时间】:2021-01-03 06:31:40
【问题描述】:

我正在尝试使用 Axon Framewok 构建一个服务,该服务将生成由域事件触发的时间序列数据,但是,它需要访问历史域事件才能重新构建完整的画面。

可能的领域事件可能是例如CreateTimeseriesModifyTimeseriesEndTimeseries 事件将提供生成最终时间序列所需的所有输入。

带有数据的示例模型可能如下所示

CreateTimeseries { 
   min:0
   max: 0
   from: 2020-01-01
}
  
UpdateTimeseries {
    from: 2020-01-03
    to: 2020-01-05
    value: 20
}

UpdateTimeseries {
    from: 2020-01-22
    to: 2020-01-24
    value: 11
}

在这种情况下,我有一个 CreateTimeseries 事件和几个 ModifyTimeseries 事件,它们按顺序应用需要应用于时间序列模型的更改(基于一些事件创建时间戳)。

要通过 Axon 框架实现这一点,“最佳实践”方法是否是在聚合内实现所有这些生成逻辑,因为聚合可以访问所有以前的域事件?

作为聚合的替代方案,有没有一种方法可以让我拥有一个带有事件处理程序的服务,该事件处理程序对新事件做出反应,例如一个新的TimeseriesUpdatedEvent,但随后可以以某种方式访问​​生成时间序列所需的所有先前事件?

【问题讨论】:

  • 你能分享一下你工作的领域吗?那么,您的想法是如何发布这些事件?在发布这些事件之前是否有某种形式的验证?

标签: time-series axon


【解决方案1】:

让我坦率地说@vcetinick:我认为这不会立即属于聚合/命令模型的形式。 我对此的推理是基于对TimeSeriesCreated/TimeSeriesUpdated 事件的来源的思考。哪个对象/模型将负责决定是否发生了这种情况?不确定,鉴于您当前的域描述,这将是什么或这样的聚合将进行什么样的业务验证。

补充说,我想警告您转到类似于基本 CRUD 操作的事件表单。创建的事件是您可能会在所有场景中看到的东西,尽管已更改为注册、构建、构造等。更新事件表明您的模型发生了非常通用的更改,这可能意味着任何事情。您将失去事件可以准确描述发生了什么的权力。因此,如果可能在您的域/应用程序内部,我建议发布更具体的事件,以便您的事件处理程序能够做出更具体的反应。

话虽如此,当谈到对此类事件做出反应以构建“时间序列”模型时,我会将其放入一个专用组件中,其中包含 @EventHandler 注释方法,以更新所述模型。现在,显然需要在处理特定类型的事件时追溯处理事件。

这最好放在一个常规的事件处理组件中(所以一个带有@EventHandler 注释函数的类)。你如何起草这个时间序列模型,在我看来可以从两个方向解决:

  1. 为此模型使用时间序列数据库,因为它是开箱即用的。
  2. 在处理特定事件时执行临时事件存储查询以检索其他事件。

选项一实际上归结为选择您想要的时间序列数据库。并且,在那里起草实际的查询模型。

选项二归结为在您的应用程序中使用一些额外的 Axon 框架组件。如果你想手动读取事件,你可以简单地在事件处理组件中连接EventStore,这样你就可以基于给定的aggregateIdentifier或基于整个EventStore的给定时间戳来检索事件(定义在 Axon 中作为 TrackingToken)。

您可以更进一步,将时间序列模型(确切的类)包装在 SimpleEventHandlerInvoker 中。最后一个组件允许您调用handle(EventMessage) 方法,以便您可以流式传输从EventStore 检索到的事件集。

希望这可以帮助您进一步@vcetinick!

【讨论】:

    猜你喜欢
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    相关资源
    最近更新 更多