上篇教程我们看到了将单个耗时队列任务拆分成多个子任务的好处:
但是这也引入了新的问题,如果使用 Redis 作为队列驱动,会存在多次执行 Redis 命令推送队列任务的问题,而每次执行 Redis 命令都要建立网络连接,IO 开销很大。
批处理推送
为此,我们可以通过 Laravel 消息队列提供的批处理功能一次性推送多个任务来提升队列性能。
以退款业务为例,我们可以把之前通过 each
函数遍历所有参会者,然后在闭包中依次推送 RefundAttendee
队列任务操作调整为通过 map
函数将所有有效的 RefundAttendee
队列任务实例组合成一个 jobs
集合,然后通过 Bus::batch($jobs)->dispatch()
批量推送 $jobs
集合中的所有任务到消息队列执行:
为了让 RefundAttendee
任务类支持批处理的所有功能,可以在该类中引入 Batchable
Trai