2012-04-09 7 views
7

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を使用して再サブスクライブすることです。ただし、接続のリセット中にチャネルに公開されたメッセージは失われます。

この状況を処理するための推奨される方法の例はありますか?

+0

私の解決策は、既に開いている場合はRedis接続を返し、そうでない場合はRedis接続を開きます。私は、「従来の使用」では接続が開いたままであり、PubSubスキーマで接続が切断されることはないと考えています。接続が何らかの理由で閉じられているまれなケースでは、新しいものを取得し、接続がリセットされている間にチャネルに公開されたメッセージが失われます。しかし、それは非常に短期間であり、定期的に起こるとは考えていません。とにかく、BookSleeveの作者がこれに注目してみましょう(CC @ marcgravell)。 –

+0

@OferZeligありがとうございます。しかし、私がすでに投稿に何らかの形で関わっていない限り、 '@ someone'は動作しません; p –

+0

@MarcGravell私はそれを知らなかった。とにかく:1)誰かが何かに注意を喚起するためにどのように他のSEユーザとコミュニケーションをとることができますか?つまり、SEサイト内では、プロフィールをチェックしたり、ブログなどに行ったりしません。 2)SEには、これとアラートを識別する機能( xxxパターン、xxxは既知のSEユーザ名)を実装できます。ありがとう! –

答えて

7

はい、接続が切断された場合(ネットワークの不安定性、再マスタリングなど)、作成したサブスクリプションを再度適用する必要があります。再接続して再登録するイベントはかなり普通ですが、ここでSE/SOで使用するものとあまり変わりません(より細かいサブスクリプションを追跡し、すべてを処理するラッパーコードがあります)。

はい、接続が切断されている間に公開されたイベントはなくなりました。それはredis pub/subの性質です。切断されたクライアントへの配信を保証するものではありません。 がこれを約束するツールを使用するか、代わりにキューを駆動するためにredisを使用してください。リストの両端にプッシュ/ポップするのは通常は妥当な選択肢です。何も失われないことを保証します(ソフトウェアが 'それをリストからポップした後にドロップします)。それが役に立ったら、私はリストにブロッキング・ポップ・メソッドを追加する要求を持っています。マルチプレクサの意図を完全に破壊しますが、いくつかのケースでは本物の使い方をしています。

+0

私はAPIに追加されたブロッキングポップのメソッドを見ても構いません。現在私のWebプロジェクトはBooksleeveを使用していますが、私のWebアプリケーションにサービスを提供するワーカーは、ブロッキング・ポップAPIのServiceStack.Redisに依存しています。 –

+1

@Justinそれが追加されます - うまくいけば今週 –

+0

それは素晴らしいだろう!ありがとう! –

関連する問題