有一个 beanstalkd 队列,每 10 分钟就会充满很多任务,并且每个任务都尽快处理是重中之重。任务可能需要几毫秒才能完成,因为有对第三方服务的调用,这些调用往往会时不时地超时。
因此,由于 PHP 没有多线程,一种选择是创建大量空闲的工作人员,它们会尝试保留任务,但可能会占用太多的 RAM,而这些机器上可能不可用。
使用 PHP-FPM 调整工人数量并节省一些 RAM 是不是一个好主意?准备好生产了吗?有更好的解决方案吗?
谢谢
有一个 beanstalkd 队列,每 10 分钟就会充满很多任务,并且每个任务都尽快处理是重中之重。任务可能需要几毫秒才能完成,因为有对第三方服务的调用,这些调用往往会时不时地超时。
因此,由于 PHP 没有多线程,一种选择是创建大量空闲的工作人员,它们会尝试保留任务,但可能会占用太多的 RAM,而这些机器上可能不可用。
使用 PHP-FPM 调整工人数量并节省一些 RAM 是不是一个好主意?准备好生产了吗?有更好的解决方案吗?
谢谢
我正在运行一个每天处理数百万条消息的队列系统。主要通过 Amazon SQS,但我现在也在运行一个新的 Beanstalkd 系统,其中包含超过 600,000 个消息。
正如有关该主题的博文中所述,我在循环中运行的 shell 脚本处理消息(在返回之前运行多个作业的 PHP 脚本中的循环也有点有用,至少对于较小的作业)。
这些 shell 脚本以Supervisord启动。还有另一篇关于使用它的博客文章。我目前在九台机器上运行超过 800 个工作脚本(用于几种不同类型的作业),所有这些脚本都从各种队列中提取并将数据放回其他队列,写入数据库或文件。增加每台机器的工人数量就是增加“numprocs”(或者已经足够大),然后根据需要开始更多。您也可以说 5 个自动启动,然后再按需要准备启动 50 个块。
我发现每个工作人员只占用大约 20mb 的非共享内存(其余的在进程之间是常见的)。当然,这确实取决于工人所做的任务。调整图像大小可能需要付出很多努力。部分原因是我设置了能够频繁重启 PHP 脚本。
每当我必须同时(或异步)运行一些东西时,我都会将这些工作分派给齿轮工。我通常在每台运行的物理机器上每个 CPU 核心至少有一个进程。
PHP-FPM 是一个 cgi 守护进程。所以你基本上会让你的 beanstalkd 处理器向你自己的系统运行一堆 HTTP 请求。这些可能必须通过您的http堆栈。不确定这是否是个好主意。
您还可以查看pcntl_fork以将当前进程分叉为多个当前正在运行的进程。