Laravel Redis 多个进程同时取队列问题

开启多个进程处理队列会重复读取 Redis 中队列吗?是否因此导致重复执行任务?

使用 Supervisor 监听 Laravel 队列任务,其中 Supervisor 的配置如下:

注意 numprocs = 8,代表开启 8 个进程来执行 command 中的命令。

如下:

Laravel 多进程读取队列内容是否会重复

在 Laravel 的某个控制器方法,一次放入多个任务队列:

在队列处理的方法打印日志,打印处理的队列的 ID:

app/Jobs/SendFile3.php

Laravel 使用 Redis 的 list 作为队列的数据结构,并会为每个队列分配一个 ID,数据结构如下:

请求这个控制器路由(或者命令行方式),就可以看到 Redis 中多了很多队列任务了,如图:

这个时候开启 Supervisor 处理队列任务,并查看日志:

这 8 个进程并发处理队列,但从打印的日志看,没有出现同样的 ID. 我们再看一下 Laravel 如何使用 Redis 处理队列的。

分析一下 Laravel 队列的处理

Laravel 中入队列方法

用的是 Redis 的 rpush 命令。

Laravel 中取队列方法

这里用的是 lua 脚本取队列,如下:

那么结论是:从 Laravel 的处理方式和打印的日志结果看,即使多个进程读取同一个队列,也不会读取到一样的数据。

参考文章:

关于 Laravel 入队列和消费队列的具体过程可以看这篇文章,讲得非常详细

打赏