我有多个用 java 编写的消费服务实例(或 pod)。当我在 azure 服务总线消息队列上有多个消息时,拥有多个 pod 的目的是能够并行使用多个消息。但似乎只有一两个 pod 正在使用这些消息。我无法理解原因。我是否缺少一些控制它的配置?
PS。我们的目的是根据队列中的消息数量运行 0-N 个 Pod。例如,如果队列中有 4 条消息,我们会自动扩展到 4 个 pod,目的是每个 pod 处理 1 条消息,然后并行处理 4 条消息。但是,出现的第一个 pod 似乎接收了 3 条消息并连续处理它们,而第 2 个 pod 处理了第 4 条消息。第 3 和第 4 个吊舱已启动并运行,但实际上并没有做任何事情。
因此,如果平均消息处理时间是 10 分钟,我们最终需要 30 分钟来处理 4 条消息,而不是 10 分钟
这是我们正在使用的代码:
new ServiceBusClientBuilder().connectionString(connectionString).processor()
.queueName(queueName).maxConcurrentCalls(1).prefetchCount(0)
.maxAutoLockRenewDuration(Duration.ofMinutes(45))
.processMessage(messageProcessor::processMessage).processError(messageProcessor::processError)
.disableAutoComplete().buildProcessorClient();
为了进一步解释这一点,我使用上面的代码创建了一个简单的应用程序,并且 processMessage 的睡眠时间为 30 秒。所以现在,我在队列中有 4 条消息和 4 个实例运行,且 processorClient 已初始化但尚未启动。我现在在每个实例上以 5 秒的间隔触发 processorClient 的启动。
- 实例 1 接收到第 1、2、3 条消息
- 实例 2 收到第 4 条消息
- 实例 3 没有收到任何消息
- 实例 4 没有收到任何消息
为什么实例 1 收到 3 条消息?如何强制每个实例一次只接收 1 条消息?