Redis pubsubチャネルを使用して、ワーカープロセスのプールからASP.NETアプリケーションにメッセージを送信しています。メッセージが受信されると、アプリケーションはSignalRを使用してメッセージをクライアントのブラウザに転送します。Booksleeveで開いているRedis PubSubサブスクリプションを維持する
Redisへのオープン接続を維持するためにthis solutionが見つかりましたが、接続を再作成するときにサブスクリプションを考慮していません。
私は現在、私のGlobal.asaxファイルにRedisのpubsubにメッセージを処理しています:
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
を使用して再サブスクライブすることです。ただし、接続のリセット中にチャネルに公開されたメッセージは失われます。
この状況を処理するための推奨される方法の例はありますか?
私の解決策は、既に開いている場合はRedis接続を返し、そうでない場合はRedis接続を開きます。私は、「従来の使用」では接続が開いたままであり、PubSubスキーマで接続が切断されることはないと考えています。接続が何らかの理由で閉じられているまれなケースでは、新しいものを取得し、接続がリセットされている間にチャネルに公開されたメッセージが失われます。しかし、それは非常に短期間であり、定期的に起こるとは考えていません。とにかく、BookSleeveの作者がこれに注目してみましょう(CC @ marcgravell)。 –
@OferZeligありがとうございます。しかし、私がすでに投稿に何らかの形で関わっていない限り、 '@ someone'は動作しません; p –
@MarcGravell私はそれを知らなかった。とにかく:1)誰かが何かに注意を喚起するためにどのように他のSEユーザとコミュニケーションをとることができますか?つまり、SEサイト内では、プロフィールをチェックしたり、ブログなどに行ったりしません。 2)SEには、これとアラートを識別する機能( xxxパターン、xxxは既知のSEユーザ名)を実装できます。ありがとう! –