0

Azure での PUBSUB の使用に問題があります。

Azure ファイアウォールは、一定時間アイドル状態の接続を閉じます。時間の長さについては多くの議論がありますが、人々は約 5 ~ 15 分だと考えています。

Redis をメッセージ キューとして使用しています。これを行うために、ServiceStack.Redis ライブラリは、次のチャネルにサブスクライブする RedisMqServer を提供します。

mq:topic:in

バックグラウンド スレッドでは、ソケットからのデータの受信をブロックし、Redis からのメッセージの受信を待機します。問題は:

Redis メッセージを待機しているソケットが一定時間アイドル状態の場合、Azure ファイアウォールは接続をサイレントに閉じます。私のアプリケーションは、現在閉じられた接続を待機しているため、認識していません (関係する限り、開いています)。バックグラウンド スレッドは効果的にハングします。

メッセージを 1 分間待機するキープ アライブを実装することを考えていましたが、メッセージが受信されない場合は、次の 2 つの目標でサーバーに PING を実行します。

  1. この接続がまだ使用されていることを Azure に伝えて、接続を開いたままにします。
  2. 接続が閉じられているかどうかを確認し、閉じている場合は最初からやり直して再登録してください。

しかし、これを実装したところ、サブスクライブしている間は PING コマンドを使用できないことがわかりました?? これがなぜなのかはわかりませんが、誰かが別の解決策を持っていますか?

メッセージを見逃す可能性があるため、定期的に購読を解除して再購読したくありません。

次の記事を読みました: http://blogs.msdn.com/b/cie/archive/2014/02/14/connection-timeout-for-windows-azure-cloud-service-roles-web-worker.aspxこれは、Azure Load Balancer が 4 分後に接続を切断する方法について説明しています。しかし、接続を維持できたとしても、別の理由で接続が切断された場合 (redis ノードがダウンした場合)、サブスクリプションを再開するという 2 番目の目標を達成する必要があります。

4

3 に答える 3

1

これは、Azure で Redis をホストするときの keepAlive パケットの処理に起因する問題です。これはまもなく修正されます。

また、上記で提案したように、ping を実行して手動で接続を維持することもできます。サブ/パブ接続の場合、今日使用できるハックは、ランダム チャネルへのサブスクライブ解除を呼び出すことです。(これが StackExchange.Redis の機能です)

于 2014-07-20T18:43:09.063 に答える