9
  • 您如何为面向队列的系统设置一个或多个工作脚本?
  • 您如何根据需要安排启动 - 并在必要时重新启动 - 工作脚本?(我正在考虑诸如 init.d/、基于 Ruby 的“上帝”、DJB 的 Daemontools 等工具)

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

还有许多其他类似的队列/工作者设置,例如StarlingGearmanAmazon 的 SQS和其他更多面向“企业”的系统,例如 IBM 的 MQ 和 RabbitMQ。如果你运行 Gearman 或 SQS 之类的东西 - 你如何启动和控制工作池?问题在于最初的工人启动,然后能够添加额外的额外工人,随意关闭它们(尽管我可以通过队列发送消息以关闭它们 - 只要一些“观察者”不会自动重新启动它们)。这不是 PHP 问题,它是关于直接设置一个或多个进程以在启动时运行的 Unix 进程,或者向池中添加更多工作人员。

循环脚本的bash 脚本已经到位 - 这会调用 PHP 脚本,然后从队列中收集并运行任务,偶尔退出以便能够自行清理(它也可以在失败时暂停几秒钟,或通过计划的活动)。这很好用,在此基础上构建工作进程一点也不难。

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

4

4 回答 4

4

我一直在帮助一个朋友,他正在从事一个项目,该项目涉及一个基于 Gearman 的队列,该队列将向多个服务器池上的各种 PHP 和 C 守护程序分派各种异步作业。

由于 /etc/init.d/ 中的简单 shell 脚本和以下命令,worker 被设计为像经典的 unix/linux 守护进程一样运行:

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

这种机制简单有效。由于它依赖于标准的 linux 功能,即使对您的应用程序了解有限的人也可以启动或停止一个守护程序,如果他们知道它是如何被称为系统级的(在上面的示例中也称为“myWorker”)。

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

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

于 2009-12-01T17:47:16.277 回答
0

真正的消息队列中间件(如 WebSphere MQ 或 MSMQ)提供“触发器”,当新消息放入队列时,作为 MQM 一部分的服务将启动工作程序。

AFAIK,没有“网络服务”排队系统可以做到这一点,这是野兽的本性。但是我只仔细研究了 SQS。在那里你必须轮询队列,而在亚马逊的情况下,过于急切的轮询将花费你一些真正的美元。

于 2009-03-08T18:42:00.133 回答
0

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

这是一个工人的简单配置文件。

[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
于 2014-09-26T07:53:19.003 回答
0

我最近一直在研究这样的工具。它还没有完全完成(认为在我达到我可以称之为 1.0 的东西之前还需要几天以上的时间)并且显然还没有准备好投入生产,但重要的部分已经编码。任何人都可以在这里查看代码:https ://gitorious.org/workers_pool 。

于 2011-05-03T22:08:49.570 回答