【问题标题】:Axon - Easiest way to make projection at query timeAxon - 在查询时进行投影的最简单方法
【发布时间】:2019-05-27 09:32:24
【问题描述】:

我通常每个聚合有 5-6 个事件,并且不想将预测存储在 DB 中。在查询时进行视图投影的最简单方法是什么?

【问题讨论】:

    标签: java domain-driven-design event-sourcing axon


    【解决方案1】:

    对此的简短回答是,没有简单/快速的方法可以做到这一点。

    但是,实现“在请求时重播给定事件”设置肯定是可行的。

    我建议你做的事情有几个步骤:

    1. 创建您想要返回的查询模型,它可以处理事件(在模型上使用@EventHandler注解的方法)
    2. 创建一个组件,该组件可以处理将在第一步中返回查询模型的查询(为此使用 @QueryHandler 注释方法。
    3. 查询处理组件应该能够从EventStore 检索事件流。如果这是基于aggregateIdentifier,请使用EventStore#readEvents(String) 方法。如果需要整个事件流,需要使用StreamableMessageSource#openStream(TrackingToken)方法(注意:EventStore接口实现StreamableMessageSource
    4. 在处理查询时,创建一个 AnnotationEventHandlerAdapter,为其提供一个新的查询模型实例
    5. 对于您在第 3 点中创建的事件流中的每个事件,调用 AnnotationEventHandlerAdapter#handle(EventMessage) 方法。此方法将调用查询模型对象上的 @EventHandler 注释方法
    6. 如果流耗尽,您可以确保查询模型的所有必要事件都已处理。因此,您现在可以返回查询模型

    所以,我不认为这是过于琐碎、简单或快速的设置。 此外,第 3 步有很多警告。根据聚合标识符检索给定聚合的流非常快速/简洁,因为聚合通常没有很多事件。

    但是,如果您的查询模型跨越多个聚合,您将需要基于 TrackingToken 检索事件流,可以确保您拉入 整个 事件存储以实例化您的模型苍蝇。当然,您可以在处理 TrackingToken 时微调您希望事件流从其返回事件的时间点,但更改非常高,您将不完整且相对缓慢。

    但是,您声明要检索给定聚合标识符的事件。 因此,我认为这在您的场景中应该是一个可行的解决方案。

    希望这会有所帮助!

    【讨论】:

    • 感谢您描述这样做的方式。似乎 Axon 根本不支持的东西。这个实现的问题是事件的性质——投影必须保存所有事件(基本上投影只有 List eventHistory)——使得存储投影不切实际(因为它实际上是重复的事件)。
    • 从事件存储的定义中,您通常应该期望从它接收事件的两种方式,一种是每个聚合标识符,另一种是给定时间点的事件流。因此,我的论点表明这对于每个聚合 ID 的视图非常有效,但对于其他排列则不是那么好。不完全确定这是缺少功能还是仅符合 Event Store 定义。无论如何,我们随时欢迎您提交 Axon 的功能请求:github.com/AxonFramework/AxonFramework/issues
    猜你喜欢
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多