おい。バックグラウンド処理にはdelayed_jobを使用しています。8 つの CPU サーバー、MySQL があり、7 つのdelayed_job プロセスを開始します
RAILS_ENV=production script/delayed_job -n 7 start
Q1: 2 つ以上のdelayed_job プロセスが同じプロセス (データベースdelayed_jobs の同じレコード行) の処理を開始する可能性があるかどうか疑問に思っています。delayed_job プラグインのコードを確認しましたが、あるべき方法でロック ディレクティブを見つけることができません (ロック テーブルまたは SELECT...FOR UPDATE がありません)。
各プロセスは、lock_by 列で UPDATE を実行する前にデータベース テーブルをロックする必要があると思います。locked_by フィールドを更新するだけでレコードをロックします (UPDATEdelayed_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: 8CPU サーバーの場合、delayed_jobs の 7 は適切な数ですか? はい/いいえ。
10倍!