Azure での PUBSUB の使用に問題があります。
Azure ファイアウォールは、一定時間アイドル状態の接続を閉じます。時間の長さについては多くの議論がありますが、人々は約 5 ~ 15 分だと考えています。
Redis をメッセージ キューとして使用しています。これを行うために、ServiceStack.Redis ライブラリは、次のチャネルにサブスクライブする RedisMqServer を提供します。
mq:topic:in
バックグラウンド スレッドでは、ソケットからのデータの受信をブロックし、Redis からのメッセージの受信を待機します。問題は:
Redis メッセージを待機しているソケットが一定時間アイドル状態の場合、Azure ファイアウォールは接続をサイレントに閉じます。私のアプリケーションは、現在閉じられた接続を待機しているため、認識していません (関係する限り、開いています)。バックグラウンド スレッドは効果的にハングします。
メッセージを 1 分間待機するキープ アライブを実装することを考えていましたが、メッセージが受信されない場合は、次の 2 つの目標でサーバーに PING を実行します。
- この接続がまだ使用されていることを Azure に伝えて、接続を開いたままにします。
- 接続が閉じられているかどうかを確認し、閉じている場合は最初からやり直して再登録してください。
しかし、これを実装したところ、サブスクライブしている間は 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 番目の目標を達成する必要があります。