Laravel ShouldBeUnique 并不能让工作变得独一无二

rel*_*89n 6 php queue redis laravel

我预计标有ShouldBeUnique接口的作业不会被多次调度。然而,所有工作都像平常一样调度。

在我的 .env 文件中,redis 设置为用于队列连接以及缓存驱动程序:

QUEUE_CONNECTION=redis
CACHE_DRIVER=redis
Run Code Online (Sandbox Code Playgroud)

我有两个正在运行的队列工作人员,它们竞争队列中的作业。

要推送作业,有控制台命令:

QUEUE_CONNECTION=redis
CACHE_DRIVER=redis
Run Code Online (Sandbox Code Playgroud)

作业类如下所示(注意uniqueId是相同的):

class TestUnique extends Command
{
    protected $signature = 'test:unique';
    protected $description = 'Command description';

    private Dispatcher $dispatcher;

    public function __construct(Dispatcher $dispatcher)
    {
        parent::__construct();
        $this->dispatcher = $dispatcher;
    }

    public function handle()
    {
        $this->dispatcher->dispatch(new SomeJob(1));
        $this->dispatcher->dispatch(new SomeJob(2));
        $this->dispatcher->dispatch(new SomeJob(3));
        $this->dispatcher->dispatch(new SomeJob(4));
        $this->dispatcher->dispatch(new SomeJob(5));

        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

一旦我们运行控制台命令来调度作业,所有这些作业都会像通常没有ShouldBeUnique. 日志:

queue_worker_2       | [2021-10-04 08:07:44][p0j7QmQt7JNFEWUoxdaEOuheJiPFTYrh] Processing: App\Console\Commands\SomeJob
queue_worker_2       | string(14) "start handle 1"
queue_worker_1       | [2021-10-04 08:07:44][DxFLi5V1UC7HfzpDFMmwv6po3Mh7Weap] Processing: App\Console\Commands\SomeJob
queue_worker_1       | string(14) "start handle 2"
queue_worker_2       | string(15) "finish handle 1"
queue_worker_2       | [2021-10-04 08:07:49][p0j7QmQt7JNFEWUoxdaEOuheJiPFTYrh] Processed:  App\Console\Commands\SomeJob
queue_worker_1       | string(15) "finish handle 2"
queue_worker_1       | [2021-10-04 08:07:49][DxFLi5V1UC7HfzpDFMmwv6po3Mh7Weap] Processed:  App\Console\Commands\SomeJob
queue_worker_1       | [2021-10-04 08:07:49][6sZoEH3WMsCMxYAmupy5RezlQezaAYag] Processing: App\Console\Commands\SomeJob
queue_worker_1       | string(14) "start handle 3"
queue_worker_2       | [2021-10-04 08:07:49][jQQNCm6MrsyxkxSClDsBNIfQezQIfBV1] Processing: App\Console\Commands\SomeJob
queue_worker_2       | string(14) "start handle 4"
queue_worker_1       | string(15) "finish handle 3"
queue_worker_1       | [2021-10-04 08:07:54][6sZoEH3WMsCMxYAmupy5RezlQezaAYag] Processed:  App\Console\Commands\SomeJob
queue_worker_2       | string(15) "finish handle 4"
queue_worker_2       | [2021-10-04 08:07:54][jQQNCm6MrsyxkxSClDsBNIfQezQIfBV1] Processed:  App\Console\Commands\SomeJob
queue_worker_1       | [2021-10-04 08:07:54][iGt3kbZTqj6lrXgm0SFFcaqVjbQ5tUqs] Processing: App\Console\Commands\SomeJob
queue_worker_1       | string(14) "start handle 5"
queue_worker_1       | string(15) "finish handle 5"
queue_worker_1       | [2021-10-04 08:07:59][iGt3kbZTqj6lrXgm0SFFcaqVjbQ5tUqs] Processed:  App\Console\Commands\SomeJob
Run Code Online (Sandbox Code Playgroud)

这与缓存代码无关,因为服务定义使用queue:listen

final class SomeJob implements ShouldQueue, ShouldBeUnique
{
    public function __construct(private int $id) { }

    public function handle(): void
    {
        var_dump("start handle $this->id");
        sleep(5);
        var_dump("finish handle $this->id");
    }

    public $uniqueFor = 3600;

    public function uniqueId()
    {
        return 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

谁能说出它的ShouldBeUnique用途以及当前代码有什么问题吗?