Эй. Я использую delayed_job для фоновой обработки. У меня 8 серверов процессора, MySQL и я запускаю 7 процессов delayed_job.
RAILS_ENV=production script/delayed_job -n 7 start
Q1: Мне интересно, возможно ли, что два или более процесса delayed_job начнут обрабатывать один и тот же процесс (одна и та же запись в базе данных delayed_jobs). Я проверил код плагина delayed_job, но не могу найти директиву блокировки так, как это должно быть (таблица блокировки или SELECT... FOR UPDATE).
Я думаю, что каждый процесс должен блокировать таблицу базы данных перед выполнением столбца UPDATE on lock_by. Они блокируют запись, просто обновив поле locked_by (UPDATE delayed_jobs SET locked_by...). Это действительно достаточно? Не требуется блокировка? Зачем? Я знаю, что UPDATE имеет более высокий приоритет, чем SELECT, но я думаю, что это не имеет эффекта в этом случае.
Мое понимание многопоточной ситуации:
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 delayed_jobs хорошим числом для сервера 8CPU? Почему да/нет.
спасибо 10x!