0

我们正在尝试在 ActiveMQ 5.9.1 之上构建一个作业队列系统。我们在 activemq 中使用 AMQP 1.0 支持,当前使用 qpid jms 库作为客户端代码。

对于作业队列系统而言,我们可以将 prefetch 设置为 1 至关重要 - 我们希望我们的作业工作者一次只能获得一个任务,竞争消费者模式。qpid 库使用连接工厂定义支持这一点:

connectionfactory.activemq-amqp-manager = amqp://{user}:{password}@{hostname}:{port}?clientid=job-manager&remote-host=default&max-prefetch=1

然而,ActiveMQ 似乎完全忽略了这一点,消费者在 activemq 管理控制台中显示为具有 100 的预取。

进一步挖掘,我找到了来源:org.apache.activemq.transport.amqp.AmqpProtocolConverter

其中包括以下行:

  consumerInfo.setPrefetchSize(100);

这是否意味着 AMQP 1.0 协议的 ActiveMQ 支持硬连线了所有客户端的预取值 100?显然这是非常错误的。我们有哪些选择?我们可以切换到纯 JMS 客户端,但会失去语言互操作性。或者我们可以切换到 RabbitMQ,这意味着引入另一个产品来支持(ActiveMQ 已经在其他地方使用)。

4

1 回答 1

0

您实际上是否进行过任何测试以查看预取为 1 的消费者是否按预期工作?

ActiveMQ 的内部结构不是基于 AMQP,因此即使 AMQP 使用者已连接,事情也不会总是如您所愿。AMQP 客户端连接的 ActiveMQ 内部消费者默认为 100,但是向客户端发送消息仍然受到远程端设置的当前流窗口的限制。如果 QPid 客户端在您设置预取值时将链接信用限制为 1,则代理将只会向其发送一条消息。

这里唯一需要注意的是,每个订阅最初都可以在代理端预取,但最终会在消费者之间均衡,因为随着更多消费者的添加,代理将进行循环调度。

ActiveMQ 中的 AMQP 支持仍在成熟,因此欢迎您潜入并尝试改进它。

于 2014-06-10T10:14:37.357 回答