【问题标题】:Why is pausing a queue not a broker function?为什么暂停队列不是代理功能?
【发布时间】:2013-02-18 10:19:38
【问题描述】:

我正在寻找一个 ActiveMQ 代理管理命令,告诉它暂停一个队列 - 即:

  • 继续接受来自生产客户的消息
  • 停止向消费客户端交付,允许队列积压增长,直到队列恢复,然后将积压发送给客户端。

我找不到这样的命令。最常见的答案是它应该在客户端进行管理——也就是说,找到每个消费者并停止它。其他答案是变通办法,例如操纵网络路由或防火墙,使客户端和代理无法再通信。

对其他消息队列的粗略调查表明,ActiveMQ 在这方面并不罕见。

在我看来,此功能可能无法实现有两个原因:

  • 很难实施——但我想不出任何原因。
  • 这与消息队列的设计理念背道而驰

它是什么,为什么?

【问题讨论】:

    标签: activemq


    【解决方案1】:

    新发布的 ActiveMQ 5.12.0 支持暂停队列:

    当队列“暂停”时:

    • 没有消息发送给关联消费者

    • 仍有待排队的消息

    • 能够浏览队列

    • 队列的所有 JMX 计数器都可用且正确。

    ...

    实现了暂停/恢复/isPaused队列查看mbean操作和属性

    暂停时,不会向常规队列消费者分派,发送 并正常浏览工作。任何飞行消息将继续飞行 直到 ackes 正常为止。

    https://issues.apache.org/jira/browse/AMQ-5229

    如果你启用了 Jolokia(我认为现在默认启用),你可以使用类似下面的 curl 请求来暂停队列:

    curl --user admin:admin http://127.0.0.1:8161/api/jolokia/exec/org.apache.activemq:brokerName=localhost,destinationName=myQueue,destinationType=Queue,type=Broker/pause
    

    (使用默认用户名、密码和代理名称以及名为 myQueue 的队列)

    将“暂停”替换为“恢复”以恢复队列。

    【讨论】:

    • 虽然这在理论上可以回答这个问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
    • 我同意这些 cmets,但我仍然感谢您的提醒。谢谢。
    • 是否有可用的代码示例?我需要使用这个功能
    • @Stoan,我添加了一个使用 curl / jolokia 暂停的示例
    【解决方案2】:

    如您所说,实施起来可能不太复杂。 我不知道如果没有需求,这是否是一个积极的设计决策。其他类似产品(例如 IBM WebSphere MQ)在队列上实现了“禁止获取/放置”,因此这显然并不完全违背消息传递的理念,而是一种操作和解决实时系统故障的工具。

    我有点偏见,但我实际上喜欢将发送方与接收方分离(如果是两个不同的系统,最终可能会被切换/升级/更改......)。

    解耦系统并能够做你想做的事情的一种简单方法是让发送者发送到一个队列“DATA.OUT”,而接收者监听另一个“DATA.IN”。然后您可以使用 Apache Camel(通常与 ActiveMQ 捆绑以实现企业集成模式),从 DATA.OUT 路由到 DATA.IN。

    骆驼路线可以通过 JMX 启动/停止,这将实现与您描述的类似的效果。

    我想 ActiveMQ 设计在这件事上宁愿让你在中间件层中做这些事情,比如 Apache Camel,而不是直接在队列上。

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 2015-12-03
      • 2021-11-29
      • 2021-02-12
      • 1970-01-01
      • 2017-01-08
      • 2021-09-05
      • 2012-12-08
      • 1970-01-01
      相关资源
      最近更新 更多