ActiveMQ中的AMQP 1.0支持-can';设置预取

ActiveMQ中的AMQP 1.0支持-can';设置预取,activemq,amqp,prefetch,qpid,Activemq,Amqp,Prefetch,Qpid,我们正试图在ActiveMQ 5.9.1之上构建一个作业队列系统。我们在activemq中使用AMQP1.0支持,目前使用qpid jms库作为客户端代码 对于作业队列系统而言,将预回迁设置为1是至关重要的——我们希望我们的作业工人一次只能完成一项任务,这是竞争模式。qpid库使用连接工厂定义支持这一点,定义如下: connectionfactory.activemq-amqp-manager = amqp://{user}:{password}@{hostname}:{port}?client

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

对于作业队列系统而言,将预回迁设置为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.amqprotocolconverter的源代码

其中包括:

  consumerInfo.setPrefetchSize(100);

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

您是否确实做过任何测试,以查看预取为1的用户是否能按预期工作

ActiveMQ的内部并不是基于AMQP的,所以即使AMQP使用者已连接,事情也不会总是像您希望的那样出现。AMQP客户机连接的ActiveMQ内部使用者默认为100,但是向客户机发送消息仍然受到远程端设置的当前流窗口的限制。如果QPid客户端在设置预取值时将链接信用限制为1,则代理将仅向其发送一条消息

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


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

您好,是的,我们已经测试过了。例如,在一个队列中放置5条消息。启动工作者/消费者-它获取第一条消息并开始处理它。启动第二个工人/消费者,它坐在那里无所事事。同时,第一个工作进程在处理完第一条消息后,将获得第二条消息、第三条消息等。很明显,第一个工作进程的客户端已经有效地预取了队列上的所有消息,尽管qpid中有max prefetch设置,结合activeMQ管理上下文,显示使用者的预取为100。是的,这是一个已知的限制。我在AMQP支持方面做了一些工作,但没有时间解决这个问题。欢迎投稿,谢谢确认。我们将看看它有多容易修补。