我在当前的php应用程序中实现了rabbitMQ,以处理由工人处理的异步作业。但是,我目前的问题是,我应该如何监督和扩大工人的规模。此外,我想添加错误处理,以防所有工人死亡。我曾想过两种方法,但不知道哪一种更好:
请帮帮忙。
发布于 2014-07-06 01:37:06
我不建议在没有工作可做的情况下把它们缩小到一无所有。剩下的工作人员(如果您想缩小到1)将简单地等待其他东西的消费,这并不是一个昂贵的操作。
在决定是否扩大规模方面,我建议利用RabbitMQ管理HTTP (http://hg.rabbitmq.com/rabbitmq-management/raw-file/3646dee55e02/priv/www-api/help.html)。您可以通过GET操作使用与队列相关的方面来获取有关队列的信息,包括当前等待处理的条目数量。
有了这些信息,您就可以决定是否达到某个阈值,或者在一定时间内,每次检查都会不断增加,或者类似的情况。这可以从消费者方面进行。
在错误处理方面,我建议封装工作人员的RabbitMQ连接方面,以便如果发生RabbitMQ异常,则从头开始重新建立连接并继续。
如果它是一种更严重的、与RabbitMQ无关的异常类型,您可能需要在这样一个级别捕获它,即该工作者基本上在它死前生成一个新的工作人员。当然,还有其他类型的异常(例如内存不足),在这些情况下,尝试继续运行是不可行的,而且程序应该完全死掉。
发布于 2014-07-07 17:57:55
很难用任何程度的精确回答你的问题,因为有很多方面的上下文没有包括在内。
尽管如此,来自Erland和(这是用于驱动RabbitMQ的语言)的世界,我想提出一个监督线程的概念。该线程将承担以下职责:
监控程序线程应该尽可能简单,并且应该以这样一种方式构建:它简单地循环、休眠和检查所有需要活着的线程是否真的存在--然后它可以检查负载,并根据需要生成或杀死工作人员。或者换句话说,根据你的需要,产生更多的和/或不-产卵。
您可以很容易地使用exchange向主管和工作队列发送消息,在这些队列中,主管将能够保存队列中消息的记录/计数,而不必向服务器写入轮询代码,它只需侦听它自己的队列。您可以从管理线程中增加/管理计数器,并从那里管理所有内容。
希望这能有所帮助。
请参阅:http://docs.dotcloud.com/guides/daemons/
遗憾的是,我没有用PHP编程,因此不能给您特定于PHP的帮助,但是,这是我建议您使用的编程模式。如果PHP不允许多线程编程和/或线程,那么我强烈建议您使用这样一种语言,因为除非使用多个线程,否则您将无法扩展和使用本地机器的全部功能。至于主管崩溃,如果在主管中保持最低限度的工作,并将所有责任委托给子线程,则主管崩溃的风险是最小的。
也许这会有所帮助:哲学:agent PHP特定的:http://www.quora.com/PHP-programming-language-1/Is-there-an-actor-framework-for-php。
https://stackoverflow.com/questions/24583409
复制相似问题