【问题标题】:Multiple sagas (of same type) across different JVM using Axon使用 Axon 跨不同 JVM 的多个 sagas(相同类型)
【发布时间】:2020-01-11 13:22:47
【问题描述】:

如何在运行同一应用的多个 JVM 的情况下实际管理 sagas

这个应用程序的每个 JVM 是否应该使用相同的数据库? 否则跟踪令牌不会在同一个应用程序之间“共享”?

如何在为 sagas 运行的同一应用程序之间拆分事件?一个 saga 类型或 saga 实例是否总是在同一个应用程序上处理(直到它被关闭以便另一个实例负责它)?

或者是每个 JVM 接收事件并且每个相同类型的 saga 都会运行? (并导致发送重复的命令和错误)

还有什么需要注意的吗?


场景示例: 3 个不同的 PC/VM 上的 3 个相同的应用程序。 名称为“SagaA”的 Saga,可以以 EventA 开头,以 EventB 结尾。 两个事件都有一个字段“id”,saga 有 2 个事件处理程序来处理 saga 中的事件。

将如何处理事件,例如 3 个事件 EventA 和 EventB,每个事件都有不同值的“id”


等等。 还有很多问题。

【问题讨论】:

    标签: java kotlin domain-driven-design saga axon


    【解决方案1】:

    Axon 术语中的 Saga 只不过是一种特定类型的事件处理程序。 因此,Axon 将使用事件处理器为 Saga 实例提供其事件。

    事件处理器有两种形式:

    1. SubscribingEventProcessor
    2. TrackingEventProcessor

    您应该将订阅处理器描述为“接收来自EventBus 在同一JVM中的事件”。 跟踪处理器应该被描述为“从EventStore 中提取事件,通过作为可共享令牌 保持跟踪进度。

    您的问题的性质现在很大程度上取决于所使用的事件处理器。 使用SubscribingEventProcessor,根据定义,您将在同一应用的不同实例之间共享事件负载。 因此,给定的 Saga 将被加载到任何实时实例上,假设两个接收事件都与同一个 saga 相关联。 不用说,如果您要分发运行这些 Saga 实例的应用程序,则使用 Sagas 的订阅处理器效果不佳。

    相反,强烈建议使用TrackingEventProcessor 作为特定 Saga 实例的事件源。 在这样做时,任何负载共享都遵循这样的要求:TrackingToken必须被这样的处理器声明才能执行任何工作(也就是处理事件) . 因此,要分担从事件存储向 Axon 中的 Saga 实例提供事件的工作量,您必须执行以下操作:

    1. 为所述 saga 类型设置 TrackingEventProcessor
    2. 设置TokenStore,其中底层存储机制在所有应用实例之间共享
    3. [可选] 如果你想并行处理事件流,你必须为给定的 saga 类型分割TrackingToken[编辑]除此之外,SagaStore 使用的saga_entry应该在所有运行给定 Saga 类型的应用实例之间共享

    希望这个答案足以解决您@Yoann 的“更多问题”!

    【讨论】:

    • 谢谢。仅对 3. 部分进行澄清,如果我们并行处理,这是否意味着相同的 saga 类型和“实例”可能会加载到不同的 JVM 中?这是否意味着和 tokenStore 一样,我们需要在相同的应用程序之间共享 SagaStore?
    • 该假设是正确的@YoannCAPLAIN,在这种情况下,用于存储您的 sagas 的数据库也需要共享。为了清楚起见,我会相应地更新我的回复。
    猜你喜欢
    • 2021-11-09
    • 2020-01-08
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2021-07-29
    • 1970-01-01
    相关资源
    最近更新 更多