1

cURL を使用して、Gnip という会社が管理するサーバーに接続しています。(www.gnip.com) 最終的には、パイプライン json フィードを無期限に消費したいと考えています。

最初にソフトウェアをセットアップしたとき、接続を維持するために書かれた素敵な小さなクラスがありました。gnip を介してソーシャルから提供されました。

Gnip は、接続を行う必要がある方法を変更したため、クラスが壊れました。

サーバーには問題なく接続できます。何日も開いたままになることもあれば、数秒で接続が切断されることもあります。

すべてが機能する方法は次のとおりです。gnipに接続し、開いた接続を維持します。gnip はデータを json 文字列としてライブで (受信時に) 送り返します。30 秒以内にデータが送信されない場合、「キープ アライブ」信号を送信して、スクリプトがまだ接続されていることを知らせます。

理想的には、スクリプトは、2 つのサーバーのうちの 1 つがシャットダウンされたときにのみ切断されます。私はcronjobを介して自分の側でそれを処理しました。

問題は、接続が予期せず終了することがあるということです。gnip に連絡したところ、ログによると、切断は彼らのせいではありません。

これは私の通常の領域外です。curl が何らかのエラーを送信していることは確かですが、ログに記録するためにエラーを見つける方法がわかりません。

ここに私がこれまでに書いたコードのコピーがあります: http://pastebin.com/jpHzvbTF

「これが修正方法です」という直接的な回答が欲しいのですが、私自身の解決策につながるかもしれないいくつかの用語を読んで知りたいです.

Keep-alive in curl / phpを読んだことがありますが、これとは関連性がないことがわかりました。

4

1 に答える 1

2

私はGnipの顧客であり、あなたが使用しているのと同じ製品を使用している会社で働いています。私たちのコードはPHPではなくJavaであるため、私はあなたを大いに助けることができないかもしれませんが、これらのフィードを使って作業していたときに私が見つけたものは次のとおりです。

  1. ストリーミングHTTPは、それがすべてではありません。現在の場所とGnipのエンドポイントがホストされている場所の間で多くの問題が発生する可能性があります。
  2. 切断を検出して再接続を試みるためのロジックを構築する必要があります。繰り返しますが、cURLとPHPを使用してこれをどのように行うかはわかりません。Javaでは、入力ストリームの読み取りタイムアウトと例外を強制する接続タイムアウトが機能します。その後、接続をドロップして再試行しますが、これらにも注意する必要があります。TCP読み取りタイムアウトが短すぎると表示されます。絶えず再接続すると、GnipのUIで非常に奇妙な動作が発生します。ただし、このようなものを使用すると、Gnipがキープアライブ改行を送信できなかった状態をキャッチし、接続を適切に循環させることができます。
  3. Gnipはソフトウェアを定期的に更新し、これを用語で述べています。これらの更新中に、接続が切断される可能性があり()、再接続することが期待されます。バグがない限り、このドロップは通常正しく信号を送り、接続を悪い状態のままにすることはありません。したがって、ドロップされた接続を検出するために使用しているものはすべて起動し、再接続でき、すべてが順調です。

使用している特定のテクノロジーで発生している問題をどのように処理するかについて、より良いアドバイスを提供できればと思います。ストリーミングHTTP(またはキープアライブHTTPセッション)を少し掘り下げて、それがどこにも到達しないかどうかを確認します。任意のフレーバーの切断をトラップしてから再接続する方法を確実に理解してください。

Gnipは、再接続バックオフロジックを実装するように人々にアドバイスし始めました。つまり、再接続はすぐに開始され、再接続に失敗するたびに、n * 2 <10(たとえば)秒待ちます。ここで、nは接続の数です。再試行する前に、これまでに試行します。Twitter自体がストリーミングサービスの一部としてこれを要求しているのに対し、Gnipは単にそれを提案しているだけです(結局のところ、これは有料サービスです)が、Gnip UIが失敗した試行で乱雑にならないようにしたい場合は、それをお勧めします。

ほとんどの場合、Gnipでの私の経験はかなり良いものでした。しかし、ストリーミングHTTPは非常に不完全なテクノロジーです(私たちが見つけたように)。一度接続して、その後も幸せに暮らせるという、このやや素朴な概念があります。私も始めたときはそうだと思っていましたが、今は少し冷笑的です。もし私がドラザーを持っていたら、私は自分のネットワークの外にあるサービスでストリーミングHTTPの上に構築された本番システムをサポートすることは決してありませんでした。あなたが話しているかもしれない種類のボリュームでお尻の痛みであるすべてのために、私はむしろFTPドロップを手に入れたいです。残念ながら、それらはその製品ラインには提供されていません。

幸運を。

于 2012-07-07T20:14:47.040 に答える