使用RabbitMQ管理员工

时间:2014-07-05 05:47:45

标签: php rabbitmq

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

  1. 在生产者端,我会分析rabbitMQ队列大小。如果队列大小(待处理任务列表)超过阈值,我会在每次生成器脚本执行时创建一个新工作器但在此之前我会检查服务器负载(使用linux命令正常运行时间)。如果服务器负载小于阈值,则仅创建新工作程序。在消费者端(在worker.php中),我会应用相同的方法来扩展工作者,我也会检查如果脚本在给定时间内空闲(即兔子mq队列中没有待处理的任务)那么它会自动死亡(自动缩减工人)。

  2. 第二种方法是使用后台进程或cron来监视和扩展/缩小工作人员。但我不想依赖于cron(因为我有非常糟糕的经历)或后台进程,因为如果后台进程由于某种原因崩溃,那么就无法从中恢复。

  3. 请帮忙。

2 个答案:

答案 0 :(得分:1)

如果没有工作要做,我建议不要费心去做。离开的工人(如果你想缩减到1)将只是等待其他东西消费,而且这不是一项昂贵的操作。

在确定是否扩展方面,我建议利用 RabbitMQ管理HTTP API http://hg.rabbitmq.com/rabbitmq-management/raw-file/3646dee55e02/priv/www-api/help.html)。您可以通过 GET 操作使用队列相关方面来获取有关队列的信息,包括当前等待处理的条目数。< / p>

使用该信息,您可以决定是否达到特定阈值时进行缩放,或者在每次检查一定时间内保持增加,或者类似的东西。这可以从消费者方面完成。

在错误处理方面,我建议封装工作者的 RabbitMQ 连接方面,这样如果发生 RabbitMQ 异常,则从头开始重新建立连接。继续进行。

如果它是一种更严重的异常类型,并不是 RabbitMQ 相关的,那么你可能需要在这样的水平上抓住它,在这个水平上,工人基本上会产生一个新的工人它死了。然后当然还有其他类型的异常(例如,内存条件不足),尝试继续并且你的程序应该完全死亡是不可行的。

答案 1 :(得分:0)

很难以任何准确度回答您的问题,因为上下文的许多方面都没有包括在内。

  1. 执行任务需要多长时间?
  2. 为什么要扩大/缩小?你为什么不首先让线程等待加载?
  3. 话虽这么说,来自Erland的世界和函数式编程(这是用于为RabbitMQ提供动力的语言),我想建议一个SUPERVISOR线程的概念。该主题将承担以下责任:

    1. 根据请求的负载/数量生成线程
    2. 根据请求的负载/数量丢弃线程
    3. 监视子线程并根据需要重新启动它们,如有必要,重新处理相同的消息或丢弃它们
    4. Supervisor线程应该尽可能简单,并且应该以这样的方式构建:它只是循环,休眠并检查是否所有需要活动的线程实际上是 - 它然后可以检查负载并产生或者根据需要杀死工人。或者换句话说,根据您的需要产生更多和/或不产卵。

      您可以轻松地使用交换机向主管和工作队列发送消息,然后主管可以在队列中保留消息的记录/计数,而无需将轮询代码写入服务器,它只会听它自己的队列。您可以从主管线程增加/减少计数器并从那里管理所有内容。

      希望这有帮助。

      请参阅:http://docs.dotcloud.com/guides/daemons/

      遗憾的是我没有用PHP编程,因此无法为您提供特定于PHP的帮助,但这是我建议您使用的编程模式。如果PHP不允许多线程编程和/或线程,那么我强烈建议您使用一种语言,因为除非您使用多个线程,否则您将无法扩展并使用本地计算机的全部功能。至于主管崩溃,如果你在主管中保持最少的工作并将所有责任委托给子线程,那么主管崩溃的风险很小。

      也许这会有所帮助: 哲学: http://soapatterns.org/design_patterns/service_agent PHP-具体: http://www.quora.com/PHP-programming-language-1/Is-there-an-actor-framework-for-php