6

私のチーム メンバーの 1 人が PHP でキューイング プロセスを作成しているという問題があります。PHP スクリプトはコマンド ラインで実行され、各サイクルの後に再帰的に呼び出して、DB 内に処理待ちの項目があるかどうかを確認します。存在する場合は、それ自体をフォークし、キュー内のアイテムを処理して繰り返します。何もない場合は終了し、cron ジョブが 5 分ごとにキューを再起動します。

場合によっては、2 つのプロセスが同時に実行され、同じキューを取得し、互いに干渉することがあります。ウェイクアッププロセスにジッターを導入して、プロセスが開始するまでの時間がランダムになるようにすることを考えていました。

より良い方法はありますか?

4

3 に答える 3

4

ジッターは衝突の予測を難しくするだけです。

ディスクにミューテックスを配置します。2 サイクル前より古いかどうかを確認します。存在する場合は、無視して削除してください。墜落した何かによって取り残されました。それ以外の場合は、既に実行されているものがあるため、保釈します。

于 2012-10-29T21:57:55.527 に答える
2

キュー内のアイテムを順番に実行する必要がない場合は、このようなことを行い、両方のプロセスをそのままにして並行して実行することができます。

キューから次のジョブを選択します (明らかに構文はデータベースに依存します)

LOCK TABLE queue;

SELECT * FROM queue WHERE status <> 'INPROGRESS' ORDER BY id LIMIT 1

UPDATE queue SET status = 'INPROGRESS' WHERE id = ?

UNLOCK TABLES;

ジョブを実行してから、ジョブを完了としてマークするか、キューから削除します

行き詰まったジョブを見つけたい場合は、ジョブ開始のタイムスタンプを保存し、それが x 分以上存在する場合はキューに戻すことができます。

于 2012-10-29T22:04:03.560 に答える