Предотвращает ли Laravel Queue дублирующиеся записи, вставленные параллельными запросами? - PullRequest
0 голосов
/ 27 апреля 2018

У нас есть Laravel API с базой данных MariaDB, где у нас возникает проблема дубликатов записей в базе данных, которые создаются по параллельным запросам.

Мы предполагали, что реализация очереди решит эту проблему, обрабатывая по одному запросу за раз. Но у нас все еще есть проблема дубликатов записей.

В приложении есть проверка, которая ищет дубликаты, но, конечно, она не будет работать для одновременных запросов, которые будут создавать одну и ту же запись в одно и то же время.

Мы не можем использовать уникальное ограничение на уровне базы данных, частично из-за механизма мягкого удаления Laravel, а частично из-за сложной бизнес-логики, которая должна допускать дублирование, если значение одного из полей соответствует определенному набору значений.

Мы используем Redis в качестве драйвера очереди.

Мы ошибаемся, думая, что очередь должна предотвратить эти проблемы? Или мы где-то допустили ошибку при реализации очереди?

Это упрощенная версия контроллера:

class CreateRecordJob extends Job implements SelfHandling
{

    public function __construct(array $data)
    {
        $this->data = $data;
    }

    public function handle()
    {
        $data = $this->data;

        // check if we have this record in the database already
        if(!$this->hasDuplicate($data)) {
            $this->createRecord();
        }
    }
}

В config / queue.php мы установили Redis в качестве драйвера очереди по умолчанию:

'default' => env('QUEUE_DRIVER', 'redis'),

А также в config / queue.php у нас есть это для подключения redis:

'redis' => [
    'driver'     => 'redis',
    'connection' => 'default',
    'queue'      => 'default',
    'expire'     => 60,
],

1 Ответ

0 голосов
/ 27 апреля 2018

в основном - не
вы можете найти реализацию FIFO-совместимых драйверов очереди В laravel для этих целей имеется интерфейс Illuminate \ Console \ Scheduling \ Mutex, но для его использования необходимо расширить queueManager

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...