3

ソケットを使用してリアルタイムの無効化を行うアプリケーションを構築していますが、何かが機能している間、サーバーを再起動すると動作が停止するようです (ハートビートが送信されなくなりました)。治療法を見つけようとする過程で、全体の概念を完全には理解していないことに気付いたので、ここにいくつかの質問を投稿することにしました。

  1. 再接続の責任者は誰ですか? それはクライアントですか?
  2. 再接続メカニズムをサポートするために、両側 (クライアントとサーバー) で何かを行う必要がありますか?
  3. これはおまけの質問です。ソケットの冗長性 (複数のサーバーを使用する機能) を実現するにはどうすればよいですか? すべての接続をセッション ストア (redis) に保持する必要がありますか? このシナリオで再接続を処理するにはどうすればよいですか?

この質問は一般的なものにするようにしていますが、興味がある場合のために、私のアプリケーションは Flex で書かれており、FlashSocket.IO を使用してサーバーに接続しています (Tornado + Tornadio2 + tornadoredis)。

4

3 に答える 3

0

これに遭遇した人にとって、ソケットが閉じられたかどうかを知る最も簡単な方法は、send() または recv() が 0 (または -1) を返すときです。ただし、0 バイトを send() することも可能だと思います。その時点で、recv() は技術的には 0 を返すことができますが、開いたままになります。

数秒待ってから send() を再試行することで、その状況を処理できると思います。それが実際に閉じられていて、ソケットにデータを送信しようとすると、-1 が返されます。それが再びゼロだった場合、recv()ing の最後には、バッファが何かを受け入れるためのメモリがなかったことを意味します。

于 2014-04-22T19:41:59.887 に答える
-1

通常、クライアントは必要に応じて検出と再接続を担当します。クライアントとサーバー間で共有される状態に応じて、両方に「再起動」回復手順がある場合があります。たとえば、クライアントがサーバーのロックを保持している場合、サーバーはクライアントの切断時にロックを解放する必要があり、クライアントは新しいロックを取得する必要があります。これは、クライアントとサーバーの動作に大きく依存します。分散/クラスター化されたサービスが必要な場合でも、上記のほとんどは当てはまります。サーバーの状態はサーバー間で共有され、同期する必要があるため、さらに複雑になります。おそらく、これを自分で実装して、既存のソリューションの 1 つ (redis、mongodb、apache-zookeeper など) を使用したくないでしょう。

于 2013-05-23T06:46:41.250 に答える