【问题标题】:ActiveMQ - "Random" slow subscribers - causing topic to fill upActiveMQ - “随机”慢速订阅者 - 导致主题填满
【发布时间】:2013-03-04 23:11:47
【问题描述】:

我有一个主题,其中包含多个使用默认预取运行的订阅客户端。如果其中一个客户端速度很慢,它会减慢其他订阅的客户端。我想动态降低慢速消费者的预取限制,但由于客户端随机变慢,这需要动态完成。

我想制作以下解决方案的原型: 为每个订阅者创建队列。线程池将从主题中删除事件并将事件复制到我的队列中。现在,由于我为每个订阅者设置了队列,因此每个客户端都是相互独立的。我将为每个队列设置预取限制。一旦达到该限制,我将放弃这些事件。缺点:现在每个队列都需要内存。

我想对上述解决方案或您认为可能适合我的情况的任何其他解决方案提出一些看法。

我在下面为我的用例添加了更多详细信息:
listener1 处理速度:142 rps - listener2 处理速度:10 rps

事件产生速度 - 100 rps

默认预取限制:32000

案例 1:当两个侦听器的预取限制相等时。 在 ~ 761 秒内 - 主题在开始丢弃事件之前已满。

案例2:当慢消费者的预取限制小于快消费者的预取限制时 listener2 预取限制:64K 以上解决方案效果很好

并非有时侦听器 2 的处理速度会增加,而侦听器 1 的处理速度会降低(注意处理速度不会完全反转,但我使用的是极值)以及 case2 不起作用的情况。 现在 listener1:10 rps 侦听器2:142 rps 在开始丢弃事件之前,主题需要 1523 秒才能填满。一旦它开始丢弃事件,侦听器 1 也将以与侦听器 2 相同的速度开始处理。

我正在寻找让每个侦听器独立运行而不阻塞其他侦听器的建议?

【问题讨论】:

    标签: jms activemq jms-topic


    【解决方案1】:

    你有没有看过 ActiveMQ 页面上的documentation 处理慢消费者的问题。基本上,该策略是使用挂起消息限制策略让代理开始为移动缓慢并导致备份的消费者丢弃旧消息。由于缓慢的消费者会导致在 Broker 上构建消息,因此您开始达到配置限制,从而导致 Broker 减慢生产者的速度。通过制定未决消息限制,您可以防止减慢速度的堆积。

    您还可以关闭生产者流控制以允许生产者继续以正常速率运行,并让消息假脱机到磁盘,直到磁盘也达到其限制,这在documentation 中也有介绍。

    【讨论】:

    • 我确实浏览了文档,并且禁用了 producerflowcontrol。现在发生的事情是我的吞吐量取决于慢速消费者,而我的慢速消费者不是固定的。因此,我不能对某个特定订阅者使用待处理消息限制。因为那个订阅者可能会在一段时间后变慢。
    • 如果您想要更好的答案,那么最好记录下您已经尝试过的内容以及您看到的结果。
    • 感谢蒂姆的回答。我已经在上面编辑了我的问题,并提供了更多详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 2014-01-21
    • 2021-03-02
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    相关资源
    最近更新 更多