2016-11-01 2 views

ответ

0

Я несколько раз боролся с этой проблемой, поэтому я раскрываю свои выводы для будущих новичков в этом кошмаре.

Есть несколько вопросов, открываемые в проект DelayedJobs относительно к этому вопросу:

Проблема заключается в DelayedJob запроса используется в Эйвери рабочего прогона:

UPDATE `delayed_jobs` SET `locked_at` = '2014-04-17 22:32:20', `locked_by` = 'host:b38f770a-f3f3-4b2a-8c66-7c8eebdb7fea pid:2' WHERE ((run_at <= '2014-04-17 22:32:20' AND (locked_at IS NULL OR locked_at < '2014-04-17 18:32:20') OR locked_by = 'host:b38f770a-f3f3-4b2a-8c66-7c8eebdb7fea pid:2') AND failed_at IS NULL) ORDER BY priority ASC, run_at ASC LIMIT 1 

Это ca n занимает почти 1 секунду, в моем случае, менее 1000 рабочих мест .. и экспоненциально возрастает по мере того, как ожидается ожидание работы.

Единственное решение, которое я нашел это один выставляет в this blog, в двух словах: Поскольку проблема является отсутствие надлежащего индекса для первоначального запроса, решение разделить таблицу в партиях:

-- stop workers 
select max(id) from delayed_jobs; -- -> 10010 
create table delayed_jobs_backup like delayed_jobs; 
insert into delayed_jobs_backup select * from delayed_jobs where id < 10010; 
delete from delayed_jobs where id < 10010; 
-- start workers 
-- while jobs in delayed_jobs_backup do 
    -- wait until the batch have been processed 
    insert into delayed_jobs select * from delayed_jobs_backup limit 1000; 
    delete from delayed_jobs_backup limit 1000; 
-- end 
+0

бы добавление надлежащего индекса к основной базе данных не разрешите это без необходимости обработки выше? – mcfinnigan

+0

@mcfinnigan похоже, что это не так просто, в упомянутом сообщении в блоге и в вопросах github есть много попыток решить это элегантным способом, и никто из них не работал. – fguillen

+0

В качестве теста я добавил 500 000 заданий в свою БД, и я не вижу никаких проблем с производительностью, использующих postgres, рабочие задания заканчиваются через .00x секунд. Есть ли какое-то конкретное условие вашей работы, которое усугубляет проблему? – Tallboy

0

Задержка работы не оптимизирована для очень большого количества рабочих мест. Чем дольше срок решение перейти на что-то вроде sidekiq (https://github.com/mperham/sidekiq), но за короткий срок вы можете использовать стратегию ниже, чтобы очистить очередь delayed_job:

http://aawaara.com/post/61798959791/break-it-down

Смежные вопросы