我正在使用 Laravel 5.5,并且正在尝试设置一些快速队列处理。我一直在一个接一个地遇到障碍。
本网站是一个雇主/雇员匹配服务。因此,当雇主发布工作职位时,它需要遍历我们系统中的所有员工并计算一些变量以确定他们与工作的匹配程度。我们已经把这一切都弄清楚了,但是当系统中有数千名员工时,一次处理一个需要很长时间。所以,我准备写几个表。第一个是定义职位 ID 和状态的简单表。第二个是列出所有员工 ID、职位 ID 和正在处理的员工状态的表格。这只需几秒钟的时间来编写,然后允许用户在应用程序中继续前进。
然后我有另一个服务器设置,每分钟运行一个 cron 来检查第一个表中的新条目。找到后,它会将其标记为已启动,然后抓取所有员工并遍历每个员工并在 Laravel 中开始排队的工作。我定义的作业确实正确提交到队列并且运行queue:work
实际上确实正确处理了该作业。这都是经过测试的。
但是,我遇到的问题是我已经为队列尝试了数据库(MySQL)、Redis 和 SQS,它们都非常慢。我正在使用同一台服务器尝试操作queue:work
(使用 Supervisor 并尝试运行多达 300 个进程),但随后创建了 3 个不运行 cron 但仅运行 Supervisor 的克隆(每个克隆 100 个进程)并在第一台服务器。使用数据库它会处理得很好,虽然运行 10k 个排队的作业需要几个小时,但是使用 SQS 和 Redis 我会遇到很多失败。脚本花费的时间太长或其他什么。我检查了运行工人的克隆上的 CPU,它们几乎没有达到 40%,所以我没有对服务器过度征税。
我只是在阅读有关 Horizon 的信息,我不确定它是否会帮助解决这种情况。我一直在尝试查找有关如何使用 Laravel 正确设置队列处理系统的信息,并且遇到的问题多于答案。
是否有人熟悉这些东西并对如何正确设置它有任何建议,以便它非常快速且无故障(假设我的代码没有错误)?
更新:根据其他一些帖子建议,我想我会分享更多细节:
- 我使用 Forge 作为带有 2G RAM 的 AWS EC2 服务器的设置工具。
三个克隆中的每一个都具有以下工作器配置:
command=php /home/forge/default/artisan queue:work sqs --sleep=10 --daemon --quiet --timeout=30 --tries=3 process_name=%(program_name)s_%(process_num)02d autostart=true autorestart=true stopasgroup=true killasgroup=true user=forge numprocs=100 stdout_logfile=/home/forge/.forge/worker-149257.log
该数据库位于 Amazon RDS 上。
我很好奇 Laravel 缓存是否可以与队列系统一起使用。排队脚本的某些元素对于每次运行都是通用的,所以如果我从一开始就将这些数据排队,它可能会节省一些时间。但我不相信这会是一个巨大的进步。