使用 Axon 跨不同 JVM 的多个传奇(相同类型)

Multiple sagas (of same type) across different JVM using Axon

如何使用同一应用程序的多个 JVM 实际管理 sagas 运行ning

这个应用程序的每个 JVM 应该使用相同的数据库吗? 否则跟踪令牌不会 "be shared" 跨同一个应用?

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

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

还有什么需要注意的吗?


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

如何处理事件,例如 3 个事件 EventA 和 EventB,每个事件具有 "id" 个不同的值


等 还有很多问题。

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

事件处理器有两种形式:

  1. SubscribingEventProcessor
  2. TrackingEventProcessor

您应该将订阅处理器描述为 "receiving the events from the EventBus within the same JVM"。 跟踪处理器应描述为“从 EventStore 拉取事件,通过 保持 track 作为可共享令牌 的进度。

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

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

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

希望这个答案能满足您 "many more questions" @Yoann 的需求!