【问题标题】:Activemq does not balance messages after some time一段时间后,Activemq 不平衡消息
【发布时间】:2018-09-13 17:45:19
【问题描述】:

我正在使用 activemq(5.14.5)camel(2.13.4),因为我仍然需要 java 6。 我有一个队列和 15 个消费者。发送给他们的消息是请求回复。

当我启动消费者时,一旦消息到达,消息就会分配给每个消费者,但一段时间后,只有一个消费者接收到消息,其他消费者保持空闲状态,并且大量消息处于待处理状态。

消费者有这样的配置:

concurrentConsumers=15&maxMessagesPerTask=1&destination.consumer.prefetchSize=0&transferException=true

由于我们的业务规则,处理每条消息所花费的时间可能会有很大差异,因此,我不知道activemq 是否有一些规则可以管理慢速消费者并仅重定向到更“高效”的规则。

我所期待的行为是所有到达的消息都开始处理,直到所有消费者都满了,但事实并非如此。

有人知道发生了什么吗?

以下是关于正在发生的事情的图片:

【问题讨论】:

    标签: java apache-camel jms activemq


    【解决方案1】:

    您的配置有两个引人注目的设置:

    1. maxMessagesPerTask=1

    如果您不打算配置自动缩放线程池,则应完全删除此设置。默认情况下是无限制的,它设置保持线程进行处理的时间(扩大/缩小线程池)。

    另见Spring Docs about this setting

    1. prefetchSize=0

    您是否尝试过将此设置为 1,以便每个消费者一次只收到 1 条消息?

    AMQ docs 说一下 prefetchSize:

    建议使用较大的预取值以获得高性能和高消息量。但是,对于较低的消息量,每条消息需要很长时间来处理,预取应设置为 1。这确保了消费者一次只处理一条消息。但是,将预取限制指定为零会导致消费者轮询消息,一次一条,而不是将消息推送给消费者

    【讨论】:

    • 嗨,这个 maxMessagesPertask 在那里,因为我使用的是自动缩放。我关闭它试图解决问题。对不起,我错误地留下了这个参数。我尝试了 prefetchSize=1 但也不起作用。我知道 prefetchSize=1 使消费者在处理另一条消息时仍然缓存一条消息。这对我来说是个问题,因为这个过程需要很长时间,而待处理的消息对我来说是个问题。我理解正确吗?我可以再试试 prefectchSize 1。
    • 对不起,您对 prefetchSize 的看法是正确的。直到现在,我从来没有看到它的价值 0,我误解了文档。
    • issues about slow consumers and selectors。我在您的屏幕截图中看到您使用选择器。是否可以使用相同的选项但没有选择器来启动消费者并检查消息分发是否更好?
    • 是的,我认为我们可以将队列拆分到不同的 activemq 中,并且生产者将重定向消息,以便我可以删除选择器。另一个建议是您提到的问题中的解决方法。更改 maxPageSize。
    • 我今天在activemq中添加了policyEntry maxPageSize。现在是时候等待并检查它是否有效。我会及时通知您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2013-08-13
    • 2023-04-05
    • 2019-06-11
    • 2023-01-16
    • 2019-06-08
    • 2022-01-06
    相关资源
    最近更新 更多