2

我想运行一个 Spring Integration 流程,如果达到任何容量,我可以轻松地扩展组件实例。

特别是,我想知道如何在以下场景中扩展聚合器:聚合器层之前的各种组件产生类 X 对象的不同部分-假设它们产生两个这样的对象 X 1, X 2的部分-部分称为 {a 1 , b 1 } 和 {a 2 , b 2 }, 分别。聚合器现在应该从它们的部分构造 X 1和 X 2并发送它们。我们还假设有两个聚合器 A 1和 A 2

在此处输入图像描述

我怎样才能最容易地设置它,使其按预期工作,即创建并发送X 1和 X 2 ?

我看到以下注意事项:

  • A 1得到 a 1, A 2得到 b 1,并且 X 1不能在没有额外的东西的情况下被构造。
  • 我们想要一些负载平衡,这首先是多个聚合器的原因。
  • 如果需要,应轻松添加额外的聚合器 - 应避免聚合器数量的静态配置。

我想知道以下内容是否对我有用 - 这是基于 Spring Integration 文档,但我不确定我是否正确。

  1. 设置一个Redis Message Store,其中部分 X 1和 X 2将在所有可用之前存储。
  2. 在所有聚合器实例之间共享消息存储。这是聚合器配置中的设置 (6) 。
  3. (与聚合器一样)使用相同的 CORRELATION_ID 标记相同 X 的部分(a 和 b)。根据收到的 a 和 b 编写 ReleaseStrategy。
  4. 创建一个Redis Lock Registry并配置所有 Aggregator 以使用它。这是聚合器配置中的设置 (20) 。

这会吗?尤其是:

  1. 我可以在多个聚合器之间共享一个 MessageStore 吗?
  2. 共享 MessageStore 时,如果 A 1将 a 1写入其中并且 A 2写入 b 1,我的 ReleaseStrategy 是否会看到 X 1现在已准备好组装?
  3. 是否只有一个 Aggregator 使用 ReleaseStrategy 处理聚合并发送组装好的 X,因为我正在使用锁?

非常感谢!

4

1 回答 1

2

是的,它会工作,但你不需要 Redis,除非你需要持久性或者你的聚合器在不同的盒子上运行(但见下文);SimpleMessageStore您可以在聚合器之间共享相同的内容。默认情况下,每个聚合器都使用自己的 in-memory SimpleMessageStore

而且,是的,锁 (by correlationId) 确保只有一个聚合器将同时处理一个组。

...因为我正在使用锁...

聚合器在内部使用自己的锁,您不需要自己锁定任何东西。事实上,通过全局LockRegistry(gemfire、redis、自定义实现)和持久消息组存储(redis 等),您的聚合器可以在不同的 JVM 上运行。

于 2014-12-16T16:21:21.887 回答