最近我一直在研究beanstald与PHP的使用。我已经学了很多,但是有一些关于服务器设置的问题,等等。
我认为它是这样工作的:
- 我在我的Ubuntu服务器上安装了Beanstalkd和任何依赖项(如libevent)。然后我启动beanstald守护进程(它基本上应该一直运行)。
- 在我的网站的某个地方(例如当用户执行一些操作等)任务被添加到beanstald队列内的各种管道。
我有一个bash脚本(如下所示),它作为守护进程运行,基本上执行PHP脚本。
#!/bin/sh php worker.php
4)工人脚本将有类似这样的东西来执行排队的任务:
while(1) {
$job = $this->pheanstalk->watch('test')->ignore('default')->reserve();
$job_encoded = json_decode($job->getData(), false);
$done_jobs[] = $job_encoded;
$this->log('job:'.print_r($job_encoded, 1));
$this->pheanstalk->delete($job);
}
现在这是我基于上述设置的问题(如果我错了,请纠正我):
假设我有一个将RSS提要导入数据库或其他东西的任务。如果有10个用户同时这样做,他们将在"测试"试管中排队。然而,它们一次只能执行一个。让10个不同的管道同时执行会更好吗?
如果我需要更多的管道,那是否也意味着我需要10个工人脚本?除了watch()函数中的字符串字面值外,每个管都使用基本相同的代码并发运行。
如果我运行这个脚本作为一个守护进程,它是如何工作的?它会一直执行worker.php脚本吗?该脚本循环直到队列理论上为空,所以它不应该只被启动一次吗?守护进程如何决定多久执行一次worker.php?这只是一个背景吗?
谢谢!
- 如果worker没有花太长时间来获取feed,就可以了。如果需要一次处理多个工作者,可以运行多个工作者。我有一个系统(目前使用Amazon SQS,但我以前用BeanstalkD做过类似的工作),最多有200(或更多)工人从队列中抽出。单个worker脚本(同一个脚本运行多次)应该就可以了——脚本可以同时监视多个管道,第一个可用的管道将被保留。您还可以使用
job-stat
命令查看特定的$job来自何处(哪个管道),或者如果需要区分每种类型,则在消息中放入一些元信息。 这里描述了一个运行worker的好例子。我还添加了superord(也是一篇有用的入门文章),以便轻松启动并保持每台机器上运行多个worker(我运行shell脚本,如第一个链接中所示)。我会限制它循环的次数,并将一个数字放入
reserve()
中,让它等待几秒钟或更长时间,以便在下一个工作中变得可用,而不会在一个紧循环中失去控制,根本不会暂停-即使没有什么可做的。附录:
- shell脚本将根据需要运行多少次。(链接显示如何有它重新运行所需的
exec $@
)。当php脚本退出时,它会重新运行php。 - 显然有一个django应用程序来显示一些统计数据,但它是微不足道的,足以连接到守护进程,获得管道列表,然后获得每个管道的统计数据-或者只是计数。