代码之家  ›  专栏  ›  技术社区  ›  Alister Bulman

排队系统-启动多个工人的好方法是什么?

  •  9
  • Alister Bulman  · 技术社区  · 16 年前
    • 如何为面向队列的系统设置一个或多个工作脚本?
    • 您如何安排根据需要启动并重新启动工作程序脚本?(我在考虑诸如init.d/、基于Ruby的“god”、DJB的Daemontools等工具)

    我正在开发一个异步队列/工作系统,在本例中使用PHP& BeanstalkdD (尽管实际的语言和守护进程并不重要)。任务本身并不太难——将一个包含命令和参数的数组编码为JSON,以便通过Beanstalkd守护进程进行传输,然后在工作脚本中获取它们,以便根据需要对它们进行操作。

    还有许多其他类似的队列/工作线程设置,例如 Starling , Gearman , Amazon's SQS 启动并控制工作线程池?问题在于最初的worker启动,然后能够添加额外的worker,随意关闭它们(尽管我可以通过队列发送消息关闭它们——只要某些“观察者”不会自动重新启动它们)。这不是一个PHP问题,而是关于设置一个或多个进程在启动时运行的直接Unix进程,或者向池中添加更多的worker。

    bash script to loop a script 它调用PHP脚本,然后从队列中收集并运行任务,偶尔退出以便能够自我清理(它也可以在失败时暂停几秒钟,或者通过计划的事件)。这很好地工作,并且在此基础上构建worker进程一点也不难。

    获得一个好的worker-controller系统是关于灵活性的,在机器启动时自动启动一个或两个,并且能够在队列繁忙时从命令行添加多个,在不再需要时关闭额外的系统。

    4 回复  |  直到 16 年前
        1
  •  4
  •   Nicolas    15 年前

    我一直在帮助一个朋友,他正在做一个项目,这个项目涉及一个基于Gearman的队列,这个队列将把各种异步作业分派给多个服务器池中的各种PHP和C守护进程。

    由于/etc/init.d/中的简单shell脚本和以下命令,worker被设计成类似于经典的unix/linux守护进程:

    invoke-rc.d myWorker start|stop|restart|reload

    此机制的另一个优点是它也使您的员工池管理变得容易。您的机器上可以有10个守护进程(myWorker1、myWorker2、…)并根据队列长度由一个“worker manager”来启动或停止它们。由于这些命令可以通过ssh运行,所以您可以轻松地管理多个服务器。

    这个解决方案听起来可能很便宜,但如果您使用编码良好的守护程序和可靠的管理脚本来构建它,我不明白为什么对于任何一般项目(如“非关键的”)来说,它的效率会低于大成本解决方案。

        2
  •  0
  •   Bob    16 年前

    不过,从野兽的本性来看,没有一个“web服务”排队系统能做到这一点。不过,我只是认真研究过SQS。在这里,您必须对队列进行轮询,而在Amazon的例子中,过于急切的轮询将花费您一些实际的$$。

        3
  •  0
  •   p4bl0    14 年前
        4
  •  0
  •   kehers    10 年前

    Supervisor 是一个很好的监控工具。它包括一个webui,您可以在其中监视和管理工人。

    [program:demo]
    command=php worker.php ; php command to run worker file
    numprocs=2 ; number of processes
    process_name=%(program_name)s_%(process_num)03d ; unique name for each process if numprocs > 1
    directory=/var/www/demo/ ; directory containing worker file
    stdout_logfile=/var/www/demo/worker.log ; log file location
    autostart=true ; auto start program when supervisor starts
    autorestart=true ; auto restart program if it exits