私はこの質問から始めました: ギアマン: クライアントのリクエストとワーカーの受信の間に 3 秒。これは正常ですか?
環境:
- Ubuntu 12.04 デスクトップ
- PHP 5.3.10
- Gearman (libgearman 1.1.5 と PHP 拡張機能 1.1.1)
- LAN上の複数のサーバー
ワーカーの応答時間を 3 秒未満にすることができず、その理由がわかりませんでした。私が構築したラッパークラスに絞り込みました。次に、クラス内の特定のメソッドにさらに絞り込みました。簡単に言えば、実際の問題は、PHP 拡張機能の GearmanWorker の addServer メソッドにあるようです。
ラッパー クラスが 3 つの Gearman Job Server に接続しようとしていました。実際に稼働しているのは2つだけです。3つすべてに接続しようとすると、3番目が接続できないという警告が表示されます。また、ワーカーの応答時間は 3 秒です。現在ダウンしているジョブ サーバーに addServer の試行を削除すると、ワーカーの応答時間は約 0.003 秒になります。
ここで、接続先のサーバーのリストから停止中のサーバーを削除してみませんか?と尋ねるかもしれません。まず、常にダウンしているわけではありません。第 2 に、現在稼働中または 5 分前に稼働していたサーバーの 1 つがもはや稼働していない場合はどうなるでしょうか? すべてのジョブが最低 3 秒かかるようになりました。おそらく、そのタイムアウトを 1 秒に設定する方法があると思いますが、IMO のより良い解決策は、ワーカーがジョブを取得しようとしているサーバーのリストからデッド サーバーを削除する方法があることです。
私の研究では addServer メソッドがあります。そして addFunction メソッドがあります。次に、特定のワーカーのリストからワーカー機能を削除する unregister メソッドがあります。ただし、removeServer メソッドは表示されません。
では、GearmanWorker でジョブ サーバーのリストを選別する方法はありますか?それとも、オブジェクトを強制終了して再インスタンス化し、選別された新しい使用可能なジョブ サーバーのリストに再接続する必要がありますか? GearmanWorker を強制終了して再起動することは、理想とはほど遠いようです。
停止したジョブ サーバーに固有のタイムアウトを回避しながら、すべてのアクティブなジョブ サーバーをスキャン (および接続) する最良の方法は何ですか?
ありがとう