Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用兔子管理工人_Php_Rabbitmq - Fatal编程技术网

Php 用兔子管理工人

Php 用兔子管理工人,php,rabbitmq,Php,Rabbitmq,我在当前的php应用程序中实现了rabbitMQ,以处理由Worker处理的异步作业。但我目前的问题是,我应该如何监控和放大或缩小员工。此外,我还想添加错误处理,以防所有工人死亡。我曾想过以下两种方法,但不知道哪一种更好: 在生产者端,我将分析rabbitMQ队列大小。如果队列大小(挂起的任务列表)超过阈值,我会在每次执行producer脚本时创建一个新的工作线程,但在此之前,我会检查服务器负载(使用linux命令正常运行时间)。如果服务器负载小于阈值,则只会创建新的工作进程。在使用者端(在wo

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

  • 在生产者端,我将分析rabbitMQ队列大小。如果队列大小(挂起的任务列表)超过阈值,我会在每次执行producer脚本时创建一个新的工作线程,但在此之前,我会检查服务器负载(使用linux命令正常运行时间)。如果服务器负载小于阈值,则只会创建新的工作进程。在使用者端(在worker.php中),我将应用相同的方法来扩展worker,并且我还将检查脚本是否在给定时间内空闲(即rabbit mq队列中没有挂起的任务),然后它将自动死亡(以自动缩小worker)

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


  • 请帮忙。

    我不建议在没有工作要做的时候费心把它们缩小到零。剩下的工人(如果你想缩小到1)只需等待其他东西消费,这不是一个昂贵的操作

    在决定是否扩大规模方面,我建议利用RabbitMQ管理HTTP API()。您可以通过GET操作使用与队列相关的特性来获取有关队列的信息,包括当前有多少条目正在等待处理

    有了这些信息,你就可以决定如果它达到某个阈值,或者在某段时间内随着每次检查而不断增加,或者类似的事情,你就可以进行缩放。这可以从消费者方面完成

    在错误处理方面,我建议封装worker的RabbitMQ连接方面,以便在发生RabbitMQ异常时重新建立连接并继续


    如果它是一种与RabbitMQ无关的更严重的异常类型,那么您可能需要在这样一个级别捕获它,即工作进程基本上会在它死亡之前生成一个新的工作进程。当然,还有其他类型的异常(例如,内存不足的情况),在这些情况下,尝试继续下去确实是不可行的,您的程序应该完全死掉。

    很难准确地回答您的问题,因为上下文中有许多方面没有包括在内

  • 执行这些任务需要多长时间
  • 为什么要放大/缩小?为什么不先让线程等待加载呢
  • 话虽如此,来自Erland和函数式编程(这是用于支持RabbitMQ的语言)的世界,我想提出一个主管线程的概念。此线程将具有以下职责:

  • 根据请求的负载/数量生成线程
  • 根据请求的负载/数量丢弃线程
  • 监视子线程,并根据需要重新启动它们,必要时重新处理相同的消息或丢弃它们
  • 主管线程应该尽可能简单,并且应该以这样一种方式构建:它只是循环、休眠并检查所有需要活动的线程是否都处于活动状态——然后它可以检查负载,并根据需要生成或杀死工作线程。或者换句话说,根据您的需要,生成更多和/或不生成

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

    希望这有帮助

    见:

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

    或许这将有助于: 理念: 特定于PHP的:

    感谢您的回复。请您解释一下,我如何实现您在第二点中提到的关于php中等待加载的线程的解决方案。据我所知,php不直接支持多线程。另外,正如我前面提到的,我如何处理由于任何原因导致的主管线程崩溃的情况?