2016-11-01 17 views

答えて

0

私はこの問題に何度も苦労していますので、私はこの悪夢に将来の新人のための私の発見を公開します。問題は、クエリDelayedJobである

エイブリィワーカーの実行に使用しています:

は、この問題に係るDelayedJobsプロジェクトに開かれたいくつかの問題があります

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私の場合、1000ジョブ未満で約1秒かかる。また、より多くのジョブが保留になると指数関数的に増加する。

私が見つけた唯一の解決策は、1は一言で言えば、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

テストとして私は私のDBに500,000のジョブを追加しました。私はpostgresを使ってパフォーマンスの問題を見ていません。ジョブは0.00秒で完了しています。問題を悪化させる仕事の特定の条件はありますか? – Tallboy