我正在使用Laravel 5.5,尝试设置一些快速的队列处理。但是我遇到了一个又一个的障碍。
这个站点是一个雇主/员工匹配服务。所以当雇主发布职位时,它需要运行我们系统中所有员工,并计算许多变量来确定他们与职位的匹配程度。我们已经解决了这个问题,但是在系统中有成千上万的员工时,逐个处理需要很长时间。因此,我设置了写入几个表。第一个是简单的表,定义了位置ID和状态。第二个是列出所有员工ID、位置ID和正在处理的员工状态的表。这只需要几秒钟就可以写好,然后允许用户在应用程序中继续操作。
然后,我另外设置了一台服务器,每分钟运行一个cron检查第一个表中的新条目。找到后,将其标记为已启动,然后获取所有员工并逐个运行队列作业。我定义的作业确实能正确提交到队列,并且运行
然而,我遇到的问题是,我尝试使用数据库(MySQL)、Redis和SQS作为队列,它们都非常慢。我曾经使用同一台服务器尝试运行
我刚刚读到Horizon,我不确定它是否会有所帮助。我一直在尝试寻找关于如何正确设置Laravel队列处理系统的信息,但只遇到更多问题而不是答案。
是否有人熟悉这方面的知识,并有任何建议如何正确设置,使其非常快速且无故障(假设我的代码没有错误)?
更新:根据其他帖子的建议,我想分享更多细节:
这个站点是一个雇主/员工匹配服务。所以当雇主发布职位时,它需要运行我们系统中所有员工,并计算许多变量来确定他们与职位的匹配程度。我们已经解决了这个问题,但是在系统中有成千上万的员工时,逐个处理需要很长时间。因此,我设置了写入几个表。第一个是简单的表,定义了位置ID和状态。第二个是列出所有员工ID、位置ID和正在处理的员工状态的表。这只需要几秒钟就可以写好,然后允许用户在应用程序中继续操作。
然后,我另外设置了一台服务器,每分钟运行一个cron检查第一个表中的新条目。找到后,将其标记为已启动,然后获取所有员工并逐个运行队列作业。我定义的作业确实能正确提交到队列,并且运行
queue:work
也能够正确处理作业。这已经过测试。然而,我遇到的问题是,我尝试使用数据库(MySQL)、Redis和SQS作为队列,它们都非常慢。我曾经使用同一台服务器尝试运行
queue:work
(使用Supervisor并尝试运行多达300个进程),但然后创建了3个克隆体,不运行cron而只运行Supervisor(每个克隆体100个进程),并在第一台服务器上杀死了Supervisor。使用数据库可以处理好,但是要通过10k个排队作业需要几个小时,但是使用SQS和Redis我得到了大量的失败。脚本太长时间或其他原因。我检查了运行工人的克隆体的CPU,它们仅达到40%,因此我没有过度使用服务器。我刚刚读到Horizon,我不确定它是否会有所帮助。我一直在尝试寻找关于如何正确设置Laravel队列处理系统的信息,但只遇到更多问题而不是答案。
是否有人熟悉这方面的知识,并有任何建议如何正确设置,使其非常快速且无故障(假设我的代码没有错误)?
更新:根据其他帖子的建议,我想分享更多细节:
- I'm using Forge as the setup tool with AWS EC2 servers with 2G of RAM.
Each of the three clones has the following worker configuration:
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
The database is on Amazon RDS.
我想知道Laravel缓存是否能与队列系统一起工作。有些队列脚本的元素在每次运行时都是相同的,因此如果从开始就将这些数据排队可能会节省一些时间。但我不确定它会有很大的改进。
beanstalkd
作为消息队列,每小时愉快地执行了数百万个任务。如果执行10,000个任务需要几个小时的时间,也许你的匹配算法太复杂或者性能不够好? - rickdenhaanqueue:work
上使用了--timeout=30
,这意味着作业将在30秒后中止。如果在一个盒子上同时运行大量繁重的作业(100似乎有点高),它们可能会超时。 - Cy Rossignol