Вопрос

Привет. Я использую delayed_job для фоновой обработки. У меня есть 8 серверов CPU, MySQL и я начинаю 7 задержки_JOB процессов

RAILS_ENV=production script/delayed_job -n 7 start 

Q1:Я задаюсь вопросом, возможно, возможно, что 2 или более процессы задержки_JOB начнут обрабатывать тот же процесс (одинаковую запись в базе данных delayed_jobs). Я проверил код плагина HELDEDED_JOB, но не могу найти Директиву блокировки таким образом, чтобы она была (без таблицы блокировки или выбора ... для обновления).

Я думаю, что каждый процесс должен заблокировать таблицу базы данных перед выполнением обновления в столбце LOCK_BY. Они блокируют запись просто путем обновления поля LOCKED_BY (обновление Delayed_jobs Set Locked_by ...). Это действительно достаточно? Не требуется блокировка? Почему? Я знаю, что обновление имеет более высокий приоритет, чем выбрать, но я думаю, что это не имеет эффекта в этом случае.

Мое понимание многопоточной ситуации:

Process1: Get waiting job X. [OK]
Process2: Get waiting jobs X. [OK]
Process1: Update locked_by field. [OK]
Process2: Update locked_by field. [OK]
Process1: Get waiting job X. [Already processed]
Process2: Get waiting jobs X. [Already processed]

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

Q2: 7 задержка_JOBS Хороший номер для сервера 8CPU? Почему да / нет.

THX 10x!

Это было полезно?

Решение

Я думаю, что ответ на ваш вопрос входит в строку 168 'lib / delayed_job / job.rb':

self.class.update_all(["locked_at = ?, locked_by = ?", now, worker], ["id = ? and (locked_at is null or locked_at < ?)", id, (now - max_run_time.to_i)])

Здесь обновление ряд выполняется только, если ни один другой рабочий уже не заблокирован работой, и это проверяется, обновляется ли таблица. Табличный замок или аналогичный (который, кстати, будет массивно снижать производительность вашего приложения), не требуется, поскольку ваша СУБД гарантирует, что выполнение одного запроса выделяется из эффектов от других запросов. В вашем примере Process2 не может получить замок для работы X, так как он обновляет таблицу рабочих мест, если и только если она не была заблокирована ранее.

Вашему второму вопросу: это зависит. На 8 сервере CPU. Что предназначена для этой работы, 8 работников являются хорошей отправной точкой, поскольку работники являются одиночными резьбой, вы должны запускать один для каждого ядра. В зависимости от вашей установки больше или меньше рабочих лучше. Это тяжело зависит от вашей работы. Возьмите вашу работу в пользу номеров Mutiple? Или ваша работа ждет большую часть времени для внешних ресурсов? У вас есть эксперимент с разными настройками и посмотрим на все вовлеченные ресурсы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top