【发布时间】: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