是否可以使用PHP-FPM来管理队列消费者?


Is it ok to use PHP-FPM to manage queue consumers?

有一个bean - stalkd队列,它被很多任务填满,比如每10分钟,每个任务都被尽快处理是最高优先级。任务可能需要几毫秒才能完成,因为有对第三方服务的调用,这些服务往往会不时超时。

因此,由于PHP没有多线程,一种选择是创建许多空闲的工作线程,这将尝试保留一个任务,但它可能会占用太多的RAM,而这些RAM在这些机器上可能不可用。

是一个好主意,使用PHP-FPM来调整工人的数量和节省一些RAM?它可以投入生产了吗?有没有更好的解决方案?

谢谢

我正在运行一个每天处理数百万条消息的队列系统。主要是通过Amazon SQS,但我也在运行一个新的beanstald系统,现在那里有超过60万个消息。

正如在一篇关于这个主题的博客文章中所描述的那样,我在循环中运行shell脚本来处理消息(PHP脚本中的循环在返回之前运行多个作业也很有用,至少对于较小的作业来说)。

这些shell脚本是由superord启动的。还有另一篇博客文章也谈到了这种用法。我目前在9台机器上运行800多个worker脚本(用于几种不同类型的作业),它们都从不同的队列中提取数据,并将数据放回其他队列,写入DB或文件。增加每台机器的工作线程数量就是增加"numprocs"(或者已经足够大),然后根据需要启动更多的工作线程。你也可以有5个自动启动,然后另一个50个的块准备根据需要启动。

我发现每个worker只占用大约20mb的非共享内存(其余的在进程之间是通用的)。这当然取决于工人所做的工作。调整图像的大小需要花费很多精力。这部分是由于这个原因,我设置了能够频繁重启PHP脚本。

每当我必须并发地(或异步地)运行一些东西时,我就把这些作业分派给gearman工人。我通常在每台运行的物理机器上,每个CPU内核至少有一个进程。

PHP-FPM是一个cgi守护进程。因此,您基本上可以让bean - stalk处理器向您自己的系统运行一堆HTTP请求。这些可能需要经过http堆栈。我不确定这是不是个好主意。

你也可以检查pcntl_fork,将当前进程分拆成多个同时运行的进程。