2012-12-13 11 views
6

私はRedisに裏打ちされたPUB/SUBシステムを構築しています。リカバリ可能なPUB/SUB

私は1つのパブリッシャーと多数のサブスクライバーを持っています。加入者は信頼できるものではなく、いつでも接続を失い、接続が失われても「回復」できる必要があります。

私のバックログにはいくつかの数字が表示されています。つまり、障害のあるサブスクライバはまでNメッセージまでを回復できるはずです。

自明な解は、次のとおり

  1. パブリッシャがメッセージX
  2. XがRPUSH list message
  3. メッセージを
  4. メッセージを消費者に公開されたリスト内のインデックスを含むように符号化されているリストにプッシュされ、パブリッシュ(インデックスが埋め込まれている)PUBLISH channel encoded

消費者再確立するためのds:

  1. それは我々がすべて良いですここまでPSUBSCRIBEアトミック

があり、実行インデックスの後、リスト内のすべての値のRedisのを要求します。

私の大きな疑問は、バックログリストをN個のアイテムに制限したいのですが?

インデックスが増え、リストに表示されているバックログを保持できる方法はありますか?

答えて

6

これはいかがですか?メッセージを公開するには、起動時に、クライアントはglobal_indexで、最新のインデックスを(これはまた、Redisの中に保管、またはどこか他のことができる)を比較する必要があります

LPUSH list message 
LTRIM list 0 N 
INCR global_index 
PUBLISH channel global_index 

パブ/サブとオーバーメッセージを受信しませんし、リストからmin(global_index - my_index、N)個のメッセージを読み取ってキャッチアップします(基本的にLRANGE list 0 (global_index - my_index))。

+0

はい、私はこの解決策が大好きです –

+0

私はこれを実装しました。https://gist.github.com/4385544私の時計とマルチの使用は完全ではありません。 –

関連する問題