我正在开发一个使用rabbitmq排队任务的应用程序。我有一个工作脚本,它可以监听队列并完成工作。我想知道的是如何并行管理多个消费者。我最初想过使用pthreads进行多线程处理,但遇到了各种奇怪的问题,而且我在Github页面中读到的内容是不可能的,有些关于AMQP扩展不是线程安全的东西
我还阅读了一些关于Supervisord的内容(虽然没有真正尝试过),但我读到的建议我只是动态修改numprocs而不重新启动其他进程。这实际上是按需的,有一些后端,当一些变量被修改时,工人的数量会被修改。
现在,我最好的办法是运行工作脚本的多个进程。但是如何管理呢?其中一个主要问题是所需的工作人员数量可能会随着时间的推移而变化,以及如何确保如果服务器崩溃,他们将尽快启动并运行。
这样做是否有某种推荐模式?我想过用upstart或者cron来运行一个脚本,它会分配进程,但是当它再次运行时,它必须检查工作者的数量是否足够,并且能够做到这一点我认为我必须将PID存储在数据库中。我想可能还有另一种方式。
更新:我想到了一种方法来使用Supervisord并修改numprocs以便在需要时运行新的工作人员(这实际上很少见,但需要覆盖这个场景)。它会以这种方式工作:每当我需要运行新工作时,我会向当前工作人员发送一条消息,以便停止监听工作队列,当他们完成当前任务时,我重新启动工作人员,包括新工作人员。
你怎么看?我知道它可能不是最好的设计,但它是我能做的最好的。我对如何实现与rabbitmq发送消息的部分有疑问(第一次使用消息代理)但我认为我可以处理它
答案 0 :(得分:2)
是的,您可以使用由supervisord(或monit)控制的多个进程(php脚本),或者您可以使用线程,但在这种情况下您必须打开新连接(不仅是通道)每个线程以防止各种错误(同时使用php-amqp扩展名和php-amqplib库)。
请记住,PHP并非旨在管理线程环境中的资源,因此多进程方式看起来比多线程更稳定和可维护。