Redis队列,如何实现一个用户一个队列,队列里边的任务依次执行,不能并发

黄粱一梦

问题描述

我需要处理用户的一系列数据处理,后边的任务依赖于前边的执行结果,所以要求不能存在并发,(一个调用发送成功后,再调用下一个事件消费)。

用户的数量是不断增加的,这种情况应该怎么实现呢

377 5 0
5个回答

TM

之前好像看你发过帖子,你这样涉及了动态增加消费者了,后期服务器也顶不住吧。可以去大群咨询一下

  • yingzi1990 2026-02-28

    结合event来,比如用户的事件A-->B-->C-->D顺序执行,执行完A事件发个B事件依次类推

ichynul

队列随用户不断增加怕不好弄,只能开尽可能多的进程,然后把用户分配到不同的进程去。

$threadTotal = $worker->count; //总进程数量 n
$threadId = $worker->id; //当前进程编号 0 ~ (n-1)

if ($data['user_id'] % $threadTotal != $threadId) {
    return;
}
//处理
  • TM 2026-02-26

    他这样后期用户越多进程越多,内存感觉要爆炸了

  • ichynul 2026-02-26

    进程数量不变是配置里面的count
    他的需求就两个点:
    1、进程要多:因为用户多。
    2、不能并发:只用用一个用户的任务始终分配到同一编号的进程,就不存在并发。

  • TM 2026-02-26

    对啊,后面用户越多不是要继续增加进程吗

小天天天天

要解耦,不要从用户层面拆分队列,而是从任务层面拆分队列,

执行A成功->投递B->执行B成功->投递C->执行C成功->投递D->执行D,

任何用户只需要投递A任务,比如:{"uid":1,"task":"xxx"},剩下的BCD就会自动的按照顺执行,

如果将来用户量大了,你只需要增加ABCD的消费者即可

每一个用户一个队列的方案是不合理的.

  • 暂无评论
evilk
  1. 如果任务, 一共是4个, A | B | C | D
  2. 那么, 开启4个队列, 每个队列, 设置合适数量的进程
  3. 用户1,进来了, 先交给队列A, 队列A执行完毕后, 再交给队列B, 队列B执行完毕后, 再交给队列C,以此类推
  4. 后面不管有多少用户进来, 全部按照这个思路和逻辑去执行
  • 暂无评论
aphper

参考laravel的作业链,自己写一个驱动,webman没用自带这种功能

  • 暂无评论
🔝