0

私はbeanstalkdを使用して、一部の作業を他のマシンにオフロードしています。セットアップは少し珍しいです、サーバーはインターネット上にあります(パブリックIP)が、消費者はいくつかの人々の家のadslラインの後ろにいます。そのため、クライアントとしてLinuxサーバーが動的IPを介して送信され、サーバーに接続してジョブを取得します。それはすべてPHPであり、私はpheanstalkライブラリを使用しています。

しばらくの間、すべてがスムーズに実行されますが、その後、adslはIPを変更します(プロバイダーが24時間ごとに切断-再接続を強制します)。クライアントはハングし、「予約」から外れることはありません。

リザーブにタイムアウトを設定すると役立つと思いましたが、そうではありませんでした。どうやら、クライアントはコマンドを発行してブロックし、タイムアウトをチェックすることはありません。(単純な予約ではなく)タイムアウト付きの予約を発行するだけであり、タイムアウトが発生したときにTIME_OUTを返すのはサーバーの責任です。問題は、接続が切断され(ただし、TCP / IPは、いずれかの側が相手側と通信しようとするまで、そのことをまだ認識していません)、クライアントが読み取りをブロックした場合、接続が戻らないことです。

ライブラリは、ローカルで(たとえば、サーバーに接続しようとしたときの)ある種のタイムアウトをサポートしているようですが、このシナリオを想定していないようです。

失効した接続を検出して強制的に再接続するにはどうすればよいですか?プロトコル(およびpheanstalk自体)に何らかのキープアライブがありますか?

ありがとう!

4

2 に答える 2

1

リクエストが応答された直後に各接続を閉じて、毎回新しい接続を再開することができます。

機能はありませんclose()が、 Pheanstaly Object を削除するunset($pheanstalk)と閉じます。

この説明は非常に役に立ちます: Pheanstalk (beanstalk の PHP クライアント) - 接続はどのように機能しますか?

于 2012-10-25T06:04:24.177 に答える
0

まだ試していませんが、SSH トンネル経由で Beanstalk サーバーに接続するというアイデアを思いつきました。ネットワークまたはサーバーの障害によってトンネルが閉じられるように、トンネルでServerAliveCountMaxおよびオプションを有効にすることができます。ServerAliveIntervalこれにより、pheanstalk クライアントがエラーを報告するようになります。

于 2012-10-25T06:14:32.863 に答える