4

私は現在、バックエンドでいくつかの高価なデータインポートジョブを実行するためにGearmanを評価しています。これまでのところ、これは非常に有望に見えます。しかし、私が情報を見つけることができないように見える1つの部分が欠けています。Gearmanからスケジュールジョブのリストを取得するにはどうすればよいですか?

管理プロトコルを使用して、各関数の現在キューに入れられているジョブの数を取得できることはわかっていますが、実際のジョブに関する情報が必要です。永続キュー(MySQLなど)を使用してデータベースにジョブを照会するオプションもありますが、この種の情報についてGearmanを回避することは私にはかなり間違っていると感じています。それ以外は、私はアイデアがありません。

おそらく私はこれをまったく必要としません:)それで、私がやりたいことについてのもう少しの背景があります、私はより良い提案のためにすべて開いています。クライアントとワーカーの両方がPHPで実行されます。管理インターフェースでは、管理者はクライアントの新しいインポートをトリガーできます。インポートはバックグラウンドタスクとして開始されるのに時間がかかるためです。答えたい簡単な質問です。このクライアントの最後のインポートはいつ実行されましたか?このクライアントのインポートはすでにキューに入れられていますか(その場合、新しいインポートをトリガーしても効果はありません)?ありがたいこと:このジョブはキューのどの位置にありますか(実行されるタイミングを見積もることができます)?

ありがとう!

4

2 に答える 2

3

Admin プロトコルは通常使用するものですが、ご存知のように、キュー内の実際のタスクは一覧表示されません。アプリケーション層で開始した現在のタスクを追跡し、タスクが終了したときにアプリケーションに通知するコールバックをワーカーに設定することで、これを解決しました。これにより、タスクが終了したときにクリーンアップや通知などを実行でき、このロジックをワーカー自体ではなくアプリケーションに保持できます。

進行に関連する最良の方法は、Gearman 自体に組み込まれている進行メカニズムを使用することです。PHP モジュールでは、 を使用してこれを呼び出すことができます$job->sendStatus(percentDone, 100)。クライアントは、タスク ハンドル (ジョブの開始時に返される) を使用して、サーバーからこの値を取得できます。これにより、インターフェイスで現在の進行状況をユーザーに表示できます。

アプリケーションで現在実行中のタスクがある限り、それを使用して、類似のタスクが既に実行されているかどうかを調べることができますが、gearman の組み込みジョブの合体 / 重複排除を使用することもできます。タスクを追加するときは、$unique パラメータを参照してください。

現在のキューの位置は Gearman からは取得できないため、アプリケーションでもこれを行う必要があります。この情報を Gearman 永続化レイヤーに要求することは避けたいと思います。

于 2012-06-25T14:21:25.067 に答える
1

DBRMS (MySQL または Postgres) を永続化バックエンドとして使用し、gearman_queue テーブルにクエリを実行します。

たとえば、ハイブリッド ソリューションを開発しました。ジョブの一意の ID を生成して渡し、それを 3 番目のパラメーターとして doBackground() ( http://php.net/manual/en/gearmanclient.dobackground.php ) にキューイング時に渡します。仕事。

次に、この ID を使用して Gearman テーブルにクエリを実行し、「unique_key」テーブル フィールドを参照してジョブのステータスを確認します。レコードが既に注文されているため、キューの位置を取得することもできます。

プロボーナス: ワーカー内で例外もキャッチします。ジョブが失敗した場合、ジョブ ペイロード (JSON シリアル化されたオブジェクト) をファイルに書き込み、ファイルを取得して cronjob を介してジョブを再キューイングし、「再試行」内部カウンターをインクリメントして、1 つのジョブを最大 3 回再試行します。それでも失敗する場合は、後でジョブを検査します。

于 2014-10-15T13:20:29.237 に答える