RabbitMQ 在使用者有一些消息时,是否调用该使用者的回调函数?
当 RabbitMQ 有一些消息供使用者使用时,它是否调用回调函数,或者使用者是否必须轮询 RabbitMQ 客户端?
所以在消费者端,如果有PHP脚本,RabbitMQ可以调用它,并将消息/参数传递给它。例如,如果在分片 1 上提交了评级,而聚合评级表在分片 2 上,那么分片 2 上的 RabbitMQ 使用者是否会触发脚本 aggRating.php并传递分片 1 中插入的参数?
当 RabbitMQ 有一些消息供使用者使用时,它是否调用回调函数,或者使用者是否必须轮询 RabbitMQ 客户端?
所以在消费者端,如果有PHP脚本,RabbitMQ可以调用它,并将消息/参数传递给它。例如,如果在分片 1 上提交了评级,而聚合评级表在分片 2 上,那么分片 2 上的 RabbitMQ 使用者是否会触发脚本 aggRating.php并传递分片 1 中插入的参数?
AMQPQueue::consume 方法现在是 php AMQP 库 1.0 版 (http://www.php.net/manual/en/amqpqueue.consume.php) 的 basic.consume 的“正确”实现。不幸的是,由于PHP是一种单线程语言,因此在同一进程空间中等待消息时,您无法执行其他操作。如果调用 AMQPQueue::consume 并为其传递回调,则整个应用程序将阻塞并等待代理发送下一条消息,此时它将调用提供的回调函数。如果你想要一个非阻塞方法,你将不得不使用AMQPQueue::get(http://www.php.net/manual/en/amqpqueue.get.php),它将轮询服务器以获取消息,如果没有消息,则返回布尔值 FALSE。
我不同意scvatex的建议,即使用单独的语言来使用“推送”方法来解决这个问题。PHP不是IO驱动的,因此当消息到达时使用单独的语言来调用PHP脚本似乎是不必要的复杂性:为什么不直接使用AMQPQueue::consume并让进程阻塞(等待消息),并将所有逻辑放在回调中或使回调运行单独的PHP脚本。
在我作为大规模作业处理系统的工作中,我们已经完成了后者,因此无论子级发生什么,我们都可以隔离错误并保持父作业处理器运行。如果您想详细了解我们如何设置它以及一些代码示例,我将非常乐意发布它们。
您需要的是 ,它允许代理将消息推送到客户端。basic.consume
也就是说,这些库的实现方式不同。它们中的大多数都支持 ,但由于所用框架的固有局限性,有些则不支持(最值得注意的是许多其他客户端所基于的官方RabbitMQ C客户端)。basic.consume
如果你的PHP库不支持,你要么必须使用轮询(坏),要么你可以使用一个更完整的客户端来驱动脚本。例如,您可以编写一个从代理使用的Python或Java程序(因此,代理将交付推送给他们),并且只要收到新消息,他们就可以调用脚本。官方教程是对 AMQP API 的一个很好的介绍,是一个很好的起点。basic.consume
从大多数角度来看,这是有效的,但它确实需要与代理建立稳定的连接。
如果您对各种客户端的功能有疑问,或者您需要更多指导,RabbitMQ 讨论邮件列表是提出问题的好地方。开发人员特意回答那里发布的任何查询。