Redis pubsubチャネルを使用して、ワーカープロセスのプールからASP.NETアプリケーションにメッセージを送信しています。メッセージを受信すると、アプリケーションはそのメッセージをSignalRを使用してクライアントのブラウザーに転送します。
Redisへのオープン接続を維持するためのこのソリューションを見つけましたが、接続を再作成するときにサブスクリプションは考慮されません。
現在、Global.asaxファイルでRedispubsubメッセージを処理しています。
public class Application : HttpApplication
{
protected void Application_Start()
{
var gateway = Resolve<RedisConnectionGateway>();
var connection = gateway.GetConnection();
var channel = connection.GetOpenSubscriberChannel();
channel.PatternSubscribe("workers:job-done:*", OnExecutionCompleted);
}
/// <summary>
/// Handle messages received from workers through Redis.</summary>
private static void OnExecutionCompleted(string key, byte[] message)
{
/* forwarded the response to the client that requested it */
}
}
この問題は、現在のRedisConnectionが何らかの理由で閉じられたときに発生します。RedisConnectionGateway
問題の最も簡単な解決策は、接続がリセットされたときにクラスからイベントを発生させ、新しいを使用して再サブスクライブすることRedisSubscriberChannel
です。ただし、接続のリセット中にチャネルに公開されたメッセージはすべて失われます。
この状況を処理するための推奨される方法の例はありますか?