2014-07-05 75 views
2

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

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

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

请帮忙。

回答

1

当不需要完成任何工作时,我不会推荐它们将它们缩小为无。剩下的工人(如果你想缩小到1)只会等待其他东西消耗,这不是一个昂贵的操作。

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

有了这些信息,您可以决定如果它达到某个阈值,或者每次检查时间持续增加一定的时间或类似的东西,就可以进行缩放。这可以从消费者方面完成。

在错误处理方面,我建议您封装工人的的RabbitMQ连接方面,使得如果发生的RabbitMQ异常从零开始重新建立连接并继续。

如果它是例外的一个更严重的类型,是不是RabbitMQ的 - 相关,您可能需要抓住它在那里的工人基本上都是产生一个新的工作它死之前的水平。当然,还有其他类型的例外情况(例如内存不足的情况),试图继续下去并且程序完全死亡是不可行的。

-1

由于没有包含上下文的许多方面,因此很难以任何准确度回答您的问题。

  1. 任务需要多长时间才能执行?
  2. 为什么要按比例放大/缩小?为什么你没有线程在第一时间等待加载?

这就是说,来自于Erland的世界和函数式编程(这是用来为RabbitMQ供电的语言)我想提出一个SUPERVISOR线程的概念。该线程将具有以下职责:根据请求,根据请求的负载/数量

  • 放弃线程
  • 监控孩子线程和他们重新启动作为负载/数量

    1. 生成线程要求如果再处理相同的消息必要或丢弃它们

    主管线应尽可能简单,并应建立在这样一种方式,它只是循环,睡觉和检查,如果需要活着的所有线程实际上 - 它可以然后检查负载并根据需要产生或杀死工人。换句话说,根据你的需要产卵更多和/或不产卵。

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

    希望这会有所帮助。

    参见: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

  • +0

    感谢您的答复。你能解释一下我怎么能实现你在第二点提到的关于等待php加载的线程的解决方案。据我所知,PHP不直接支持多线程。另外,正如我之前提到的那样,由于任何原因,我如何处理主管线程崩溃的情况?编辑回答 – user3807016

    +0

    以包含更多信息 –