0

我有多个用 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 条消息?

4

0 回答 0