我在这个php库https://github.com/jakubkulhan/bunny的帮助下使用RabbitMQ,现在我的代码以下面的方式工作:每个队列都有单独的类,用于向队列添加新消息和单独的队列工作者,例如:SmsQueue和SmsWorker。我运行队列工作者 (例如SmsWorker)来自cron,问题是我只想在它已经没有运行的情况下运行它。我认为RabbitMQ有一些方法可以查看当前是否有队列的活跃消费者,但我找不到它。这里有什么解决方案,我做得对吗?
P.S。我刚刚开始使用RabbitMQ并且对此不太了解,如果这是一个愚蠢的问题,那就很抱歉。
答案 0 :(得分:1)
我认为RabbitMQ有一些方法可以查看当前是否有活跃的队列消费者,
不直接,没有。
您可能能够在管理工具的HTTP API中找到一种方法来查询,但我不会这样做。查询运行和启动代码之间的时间量可能允许创建多个应用程序实例。
相反,我会考虑两个选项:
1)为消费者请求对队列的独占访问权限(不确定您的库,但它是AMQP规范的一部分:https://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.consume.exclusive)
2)在您的应用程序中使用互斥锁,以确保您的应用程序只运行一次
或者,设置您的消费者应用程序,以便您只有一个实例,并且它始终在运行。如果您没有动态启动新实例,则永远不会有多个实例。