Очередь Laravel (независимо от водителя) обрабатывает задание только после того, как следующее помещено в очередь - PullRequest
0 голосов
/ 31 октября 2018

Вчера я заметил это действительно странное поведение очереди Laravel, когда очередь всегда ожидает запланированного задания NEXT для обработки ранее запланированного задания. Пожалуйста, помогите мне понять, что происходит.

$ laravel new test
$ cd test
$ php artisan make:job TestQueue

Вставьте следующее в класс TestQueue. Ничего особенного, на самом деле:

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Log;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class TestQueue implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $id;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($id)
    {
        Log::info('Creating ' . $id);
        $this->id = $id;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        Log::info('Running ' . $this->id);
    }
}

Теперь, независимо от QUEUE_CONNECTION env var (redis, beanstalkd, даже sync!), Я получаю следующее поведение:

Обратите внимание: у меня php artisan queue:work работает в отдельном терминале.

$ php artisan tinker

>>> App\Jobs\TestQueue::dispatch(1)

журналы:

[2018-10-30 22:38:01] local.INFO: Creating 1

>>> App\Jobs\TestQueue::dispatch(2)

журналы:

[2018-10-30 22:38:04] local.INFO: Creating 2
[2018-10-30 22:38:06] local.INFO: Running 1

>>> App\Jobs\TestQueue::dispatch(3)

журналы:

[2018-10-30 22:38:22] local.INFO: Creating 3
[2018-10-30 22:38:24] local.INFO: Running 2

Я считаю, что не только очередь, независимо от драйвера, должна забирать первое задание и обрабатывать его всякий раз, когда очередь готова, но драйвер синхронизации должен немедленно обрабатывать каждое задание в очереди (вызывая его метод handle()).

Мне кажется, что кто-то пытается доказать мне 1 + 1 = 3, и я просто не вижу, что я делаю неправильно. Я уверен, что это не ошибка в фреймворке, потому что об этом бредит интернет, а это не так.

Спасибо за ваше время.

Laravel Framework 5.7.12

Редактировать: локальная среда, конфигурация не кэшируется

1 Ответ

0 голосов
/ 31 октября 2018

Как уже упоминалось в комментарии, я думаю, что это всего лишь артефакт использования тинкера вместо веб-интерфейса. Я также могу воспроизвести это с помощью повозки, но не при выполнении этого в контексте веб-запроса.

Я не уверен, почему это происходит, хотя тинкер очень полезен для целей отладки, он может быть не полностью способен обрабатывать такие операции, как организация очередей.

Вы можете отправить сообщение об ошибке в Laravel или непосредственно в проекте тинкера Laravel по адресу https://github.com/laravel/tinker

...