【问题标题】:PHP-AMQPLIB: RPC -> RPC queue leaves unack messages behindPHP-AMQPLIB:RPC -> RPC 队列留下未确认消息
【发布时间】:2015-07-14 22:46:47
【问题描述】:

我有几个 PHP RPC 类型的消费者(代理)永久附加到 RMQ 以进行事件消费。

一个代理位于远程系统上 - 但是,出于开发/测试目的,我在本地运行“远程”代理。

有面向应用程序的代理,其中一个(代理 Au)处理请求,在处理期间,通过包含的类创建到远程代理的新 AMQP 连接,将请求发布到远程代理(代理 Vu)。

代理 Vu 使用请求,将返回的负载发布回代理 Au - 并调用 basic_ack() 方法。

Broker Au 将来自 Broker Vu 的返回负载解包,并将其负载返回给正确显示结果的 PHP 客户端。

回顾:

testProgram --> 实例化 testClass1 打印出回调队列名称: (ex: amq.gen-6_EhL_eb3HcLiiOb-TUNRA) ,向代理 Au 发布请求

broker Au --> 实例化 class2,打印出回调队列名称:(ex: amq.gen-J0jhxeMAf1XZSbHZJ8NZ3g),向代理 Vu 发布请求

broker Vu --> 做事(成功),将负载返回给代理 Au,调用 basic_ack()

broker Au --> 解码返回载荷并生成自己的返回载荷给 testProgram 并调用 basic_ack()。

testProgram --> 显示结果并结束

此时我在 RMQ 管理控制台的“队列”选项卡中看到的是:

我所有连接的经纪人 (AD = true) 和 (amq.gen-J0jhxeMAf1XZSbHZJ8NZ3g) 显示就绪:0,未确认:1,总计:1

对于我提交的请求数量,生成的回调队列会相应增加。

在代理 Vu 中,我有一个 ping 事件处理程序——它所做的只是说“是的 - 我在这里”并返回一个 true。此事件还会生成孤立生成的回调队列孤立。

我已经在代理中注册了所有关闭方法 - 如果我尝试显式关闭连接客户端中的通道/连接(在 $channel->wait() 之后),它会第一次工作并崩溃代理第二次执行。

如果我运行一个直接连接到代理 Vu 并提交相同事件请求的测试程序,则不会孤立 amqp 生成的队列。这肯定是由于代理上代理发布/消费过程而发生的事情。

感谢您坚持...任何帮助表示赞赏!

--麦克

【问题讨论】:

    标签: php rabbitmq amqp php-amqp


    【解决方案1】:

    在代理 Vu 中实例化的客户端类中,我在 wait() 之后和返回有效负载之前添加了一个显式通道 close() 调用。

    这会清理 amqp 生成的队列。

    添加显式连接关闭会导致代理在第二次迭代时崩溃(尽管所有已发布的示例都显示)所以我将把它排除在外,让这件事完成它的事情......

    【讨论】:

    • 您是否有日志显示代理因第二次连接关闭而崩溃?还是代理只是抛出异常并继续运行?
    • 日志文件显示关闭,但相对没有帮助。经纪人是自闭的(我在所有调用中都进行了广泛的异常捕获 - 崩溃是一个调用已注册的关闭函数的捕获异常) - 在第二次迭代中(日志显示连接已关闭)所以我最好能弄清楚的是远程amqp 连接使其返回队列感到困惑。 (无法通过将事件直接发布到第二个 AMQP 服务来复制。)关闭第二个连接(但不是通道关闭)解决了这个问题,我继续做其他事情。
    • 酷,我觉得 RabbitMQ 会因为这样的事情而崩溃很奇怪,但无论如何,如果你回到这个 pelase,请在我们的邮件列表中报告它groups.google.com/forum/#!forum/rabbitmq-users
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 2018-04-02
    • 1970-01-01
    • 2011-12-20
    • 2014-09-26
    • 1970-01-01
    相关资源
    最近更新 更多