【问题标题】:How to query axon aggregates如何查询轴突聚集体
【发布时间】:2022-12-29 20:08:54
【问题描述】:

有没有办法查看存储在轴突中的聚合体的当前状态?

我们的应用程序使用 Oracle 支持的 axon 事件存储。 我尝试查询 domainevententry 和 snapshotevententry 表,但它们是空的。

【问题讨论】:

    标签: aggregate axon


    【解决方案1】:

    有没有办法查看存储在轴突中的聚合体的当前状态?

    简而言之,是的,虽然它是不建议.当然,如果您打算使用 CQRS。 CQRS,或命令查询责任分离,规定命令模型和查询模型是分开的。

    Axon 提供的聚合支持为构建命令模型提供了一种简单的方法。顾名思义,它用于命令。另一方面,您有专为查询设计的查询模型。 AxonIQ 在 CQRS 上有 this 可以说;也许这澄清了一些事情。

    我尝试查询 domainevententry 和 snapshotevententry 表,但它们是空的。

    这本身就很有趣!当您通过 AggregateLifecycle#apply(Object...)EventGateway#publish(Object...) 方法在 Axon 中发布事件时,发布的事件应该最终出现在您的 domain_event_entry 表中。如果不是这种情况,那么要么是您的 JPA/JDBC 配置有遗漏,要么是您的应用程序中发生了一些其他异常。

    您能否使用您看到的配置示例和/或堆栈跟踪来更新您的问题?

    在本地重放生产问题

    我过去所做的能够重放生产环境中发生的行为的方法是将聚合的事件流从该环境加载到本地开发/测试事件存储中。为了能够查询这个,您只需要聚合标识符。由于对聚合标识符进行了索引,因此检索特定聚合(不同名称的聚合流)的所有事件非常简单。

    通过这样做,我可以在本地运行应用程序以逐步通过聚合。这样做的好处是可以准确了解哪个事件导致了哪个状态发生变化,从而导致出现问题的场景。

    然而,为什么你的事件不在你的 domainevententry 中,我不清楚。如果您仍然遇到问题,我仍然建议您使用项目的更多细节更新问题。

    【讨论】:

    • 关于第一个问题,我的目标不是查询代码中的命令模型以在运行时使用。问题更多的是,如果我可以通过某种方式查看聚合的当前状态,而不必在我的代码中放置断点,也不必发送命令来触发它。
    • 明白了,谢谢你指出这一点,马克。但是,您需要它的确切用例是什么?我能想到的一种选择是让您调用 Repository<A>#load(String)(其中 A 是您的聚合类)来手动加载聚合。这将为您提供 Aggregate<A> 对象,该对象又包含您的聚合。
    • 我的用例是能够查看聚合的当前状态,以调查命令处理程序中嵌入的某些业务逻辑是否按预期工作。我有一个案例,根据某些状态,我们选择忽略命令而不是发出事件。我希望能够检查状态,看看这是否是命令未被处理的原因,因为无法在轴突中查看命令(除非我弄错了)。
    • 好吧,明白了,谢谢你,@Marc。不过,框架提供的测试装置在这里不够用吗?如果您使用 Axon 的 AggregateTestFixture 验证所有命令处理程序,则不应要求您检查内部结构,因为内部结构定义了事件的结果。此外,对于事件溯源,唯一要验证的是事件,因为它们无论如何都会驱动您的聚合状态(以您喜欢的未来格式)。那么,这对您的场景有用吗,马克?
    • Steven.vanbeelen@axoniq.io 这一切都很好,除了在现实生活中确实会发生您在测试期间没有预见到的事情,并且在调查生产环境中的事件时,能够查询聚合内部状态会非常方便。
    猜你喜欢
    • 2021-12-31
    • 2019-12-04
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    相关资源
    最近更新 更多