多用户环境下的 Laravel 队列

6
我正在使用Laravel 5.1,并且有一个任务需要大约2分钟来处理,这个任务是生成报告...
现在,很明显我不能让用户在我获取用户输入的同一页等待2分钟,相反,我应该在后台处理此任务并稍后通知用户任务完成...
为了实现这一点,Laravel提供了 "Queues",它在后台运行任务(如果我没有误解的话)。对于多用户环境,即如果超过一个用户要求生成报告(例如有4个用户),那么作为名为“Queues”的功能,它是否意味着任务将一个接一个地执行(也就是当4个用户依次要求生成报告时,只有在第3个用户生成报告后,第4个用户的报告才会被生成)?
如果 "Queues" 逐个完成它们的任务,那么是否有任何方法可以立即在用户请求时在后台处理任务,并在任务完成后稍后通知用户?

是的,队列将一个接一个地处理,但在我的情况下可能会出现队列实例,我使用监管者来管理队列,每当我看到单个队列的4个以上实例时,我不确定如何或为什么,但这可能是由于多核CPU。 - Khan Shahrukh
@KhanShahrukh 根据我所学到的知识,导致你有4个单队列实例的原因可能是你所说的多核CPU,但更可能的原因是你在监管者laravel-worker.conf中设置的进程数量(根据文档)。此文件可以有一个称为numprocs的参数,该参数定义任何队列的工作程序数量或队列实例数量... - Nikhil Bhatia
2个回答

0

基于队列的架构比较复杂。看看队列提供了一个接口,可以连接到不同的消息实现,如rabbitMQ、beanstalkd。
在代码的任何时候,您都可以将消息发送到队列中,这在此上下文中被称为JOB。现在,您的队列将有多个作业,这些作业准备按照FIFO顺序出队。

根据您的问题,有工作进程监听队列,它们获取作业并执行它们。您可以决定要多少个工作进程。如果您只有一个工作进程,则任务将一个接一个地执行;工作进程越多,就会有更多的并行进程。

使用Laravel命令行界面Artisan启动工作进程。每个进程表示一个工作进程。您可以使用supervisor启动多个工作进程。


所以,简单来说,我理解的是,这些工作进程是处理限制,工作进程越多,就能进行更多的并行处理,对吗?另外,在Laravel队列文档中,我对队列监听器、队列守护进程和你的回答感到困惑...这些工作进程到底是什么?我如何配置和管理工作进程?我如何启动或增加更多的工作进程,你提到可以使用artisan的CLI命令实现,但具体怎么操作呢?你还提到可以使用监控程序supervisor启动多个工作进程,但是怎么做呢? - Nikhil Bhatia
据我所知,通过搜索可知,Supervisor是用于基于UNIX的操作系统的进程监视器工具,那么在Windows上该使用什么呢? - Nikhil Bhatia
我确认关于队列的文档有点模糊。 - Paranoid Android

0

既然您确定会在大约2分钟后向用户发送通知,我建议使用cron job每2分钟检查是否有报告需要生成,如果有,就可以向用户发送通知。这个检查将是一个简单的查询,所以不需要太担心性能问题。


谢谢回复,是的,我可以这样做,但是像你说的那样在后台“每2分钟检查是否有任何报告需要生成”需要一个特殊的表,类似于队列的“jobs”表,以维护已生成或待处理的报告记录... 因此,间接地,它导致了队列的概念... 而问题是,不是我将拥有较少或微不足道的报告生成请求,应用程序需要预计每天大约或超过100个报告生成... - Nikhil Bhatia
然而,我已经学会了队列的工作原理,但现在我卡在了如何在 Windows 平台(我目前正在开发的平台)中增加队列工作者的数量。 - Nikhil Bhatia
实际上,我也是一个 Laravel 开发者,但我不建议使用 Laravel 队列,因为它非常依赖于平台。也许你可以尝试一下 https://www.npmjs.com/package/kue KUE 队列,它使用 NodeJS 并且使用 Redis 数据库,你可以轻松地配置处理多少个作业。 - Ye Lwin Soe
哦...是啊,但事实确实如此,Laravel队列是平台相关的...但即使我不能使用Redis,因为我目前正在使用MySQL,并且在我的应用程序中,在某些点上,我还必须使用原始查询,所以从MySQL迁移到Redis将是一项耗时的任务... - Nikhil Bhatia
1
不需要将MySQL迁移到Redis,Redis仅用于管理队列作业,因此您仍然可以在PHP应用程序中使用MySQL,并且报告生成也可以使用PHP和MySQL。 Laravel队列还使用类似Redis的beanstalk,将数据存储在内存中。 - Ye Lwin Soe
哦...意思是,在Redis中使用另一个特殊用途的数据库来处理队列...我可以尝试一下...谢谢。 - Nikhil Bhatia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接