У нас есть 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,
],