Задания базы данных Laravel на нескольких серверах - PullRequest
0 голосов
/ 07 марта 2019

В нашем случае мы помещаем задания в очередь с фиксированными именами очереди (например, app_data_pull, period_data_sync и т. Д.). Каждый сервер в кластере имеет 1 или более рабочих потоков (управляемых супервизором), которые контролируют эти очереди, поэтому в любой момент у нас может быть более 10 мастеров, которые все слушают одну очередь. Кажется, что механизм очереди Laravel пытается синхронизировать и блокировать задания, чтобы предотвратить одновременное получение несколькими потоками одного и того же задания. Но иногда я видел одновременное выполнение одной и той же работы.

Кто-нибудь знает, как (или даже если) работники очереди Artisan обрабатывают синхронизацию? Существуют ли какие-либо конкретные инструкции по обработке сигналов, обеспечивающие упорядоченное выполнение заданий?

1 Ответ

0 голосов
/ 07 марта 2019

Вам следует проверить методы pop и getNextJob из определенного класса Queue. Различные очереди используют разные методы для блокировки работы. Например, DatabaseQueue помечает задание как зарезервированное путем вызова:

$this->database->table($this->table)->where('id', $job->id)->update([
    'reserved_at' => $job->touch(),
    'attempts' => $job->increment(),
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...