首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用RabbitMQ管理员工

用RabbitMQ管理员工
EN

Stack Overflow用户
提问于 2014-07-05 05:47:44
回答 2查看 3.2K关注 0票数 4

我在当前的php应用程序中实现了rabbitMQ,以处理由工人处理的异步作业。但是,我目前的问题是,我应该如何监督和扩大工人的规模。此外,我想添加错误处理,以防所有工人死亡。我曾想过两种方法,但不知道哪一种更好:

  1. 在生产者端,我将分析rabbitMQ队列大小。如果队列大小(挂起的任务列表)超过一个阈值,我将在每次执行生产者脚本时创建一个新的工作人员,但在此之前,我将检查服务器负载(使用linux命令uptime)。如果服务器负载小于阈值,则只创建新的工作人员。在使用者端(在worker.php中),我将应用相同的方法来扩展工作人员,并且我还将检查如果脚本在给定的时间内空闲(即在兔子mq队列中没有挂起的任务),那么它将自动死亡(以自动缩小工人的规模)。
  2. 第二种方法是使用后台过程或cron来监视和缩小/缩小工人。但是我不想依赖cron (因为我对它有非常糟糕的经验)或后台进程,因为如果后台进程由于某种原因崩溃,那么就没有办法从它中恢复过来。

请帮帮忙。

EN

回答 2

Stack Overflow用户

发布于 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无关的异常类型,您可能需要在这样一个级别捕获它,即该工作者基本上在它死前生成一个新的工作人员。当然,还有其他类型的异常(例如内存不足),在这些情况下,尝试继续运行是不可行的,而且程序应该完全死掉。

票数 1
EN

Stack Overflow用户

发布于 2014-07-07 17:57:55

很难用任何程度的精确回答你的问题,因为有很多方面的上下文没有包括在内。

  1. 执行这些任务需要多长时间?
  2. 你为什么要扩大/缩小规模?为什么一开始就没有线程等待加载?

尽管如此,来自Erland和(这是用于驱动RabbitMQ的语言)的世界,我想提出一个监督线程的概念。该线程将承担以下职责:

  1. 根据请求的负载/数量生成线程
  2. 根据请求的加载/数量丢弃线程
  3. 监视子线程,并根据需要重新启动它们,必要时重新处理相同的消息或丢弃它们。

监控程序线程应该尽可能简单,并且应该以这样一种方式构建:它简单地循环、休眠和检查所有需要活着的线程是否真的存在--然后它可以检查负载,并根据需要生成或杀死工作人员。或者换句话说,根据你的需要,产生更多的和/或不-产卵。

您可以很容易地使用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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24583409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档