redis消费者队列的快慢消费进程,不是隔离的吗,打印信息显示会混用

kidly

问题描述

按手册启动2组消费者
fast组有2个进程
slow组有1个进程

理想状态,fast组独享2个进程处理, slow只使用自己的1个进行处理
打印信息显示,slow组去占用了fast组的进程导致侵占的其他组的进程数
(相当于所有consumer公用了线程池,没有隔离,慢的会慢慢的把所有进程数沾满)

从打印的进程id就可以看出slow的1个进程id一直在变,在只分配了1个进程处理的情况下并行了(站了fast的进程在执行)

程序代码或配置

<?php
return [
    'consumer'  => [
        'handler'     => Webman\RedisQueue\Process\Consumer::class,
        'count'       => 2, // 可以设置多进程同时消费
        'constructor' => [
            // 消费者类目录
            'consumer_dir' => app_path() . '/queue/redis'
        ]
    ],
    'consumer_2'  => [
        'handler'     => Webman\RedisQueue\Process\Consumer::class,
        'count'       => 1, // 可以设置多进程同时消费
        'constructor' => [
            // 消费者类目录
            'consumer_dir' => app_path() . '/queue/redis/slow'
        ]
    ]
];

重现问题的步骤

截图

...............................................

如1楼评论所说,在consumer调用onWorkerStart绑定事件的时候用的是RecursiveDirectoryIterator做递归遍历,所以所有的配置是不能有包含关系的否则会在配置1的时候被包一次,第二次再被包一次

会因递归的关系混在一起
截图

211 1 0
1个回答

latin

文档里是
'/queue/redis/fast'
'/queue/redis/slow'
两个完全独立的目录
而你的是
'/queue/redis'
'/queue/redis/slow'
二者是包含关系,所以会混在一起吧。

  • kidly 2024-09-26

    你说的对,我把图编辑到问题里了,因为用了RecursiveDirectoryIterator, 棒棒的

×
🔝