6

Redis に裏打ちされた PUB/SUB システムを構築しています。

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

ひねりがありますが、バックログをいくつかの数に制限したいと思います。つまり、障害のあるサブスクライバーは最大 N 個のメッセージのみを回復できる必要があります。

簡単な解決策は次のとおりです。

  1. パブリッシャーがメッセージ X をパブリッシュする
  2. X はリストにプッシュされますRPUSH list message
  3. メッセージは、リストにインデックスを含めるようにエンコードされます
  4. メッセージは消費者に発行されます (インデックスが埋め込まれています)PUBLISH channel encoded

コンシューマーが再確立する必要がある場合:

  1. インデックスの後にリスト内のすべての値をredisに要求し、PSUBSCRIBEアトミックに実行します

ここまではみんな元気です。

私の大きな質問は、バックログ リストの上限を N 個にしたい場合はどうすればよいかということです。

増え続けるインデックスとキャップされたバックログをリストに保持する方法はありますか?

4

1 に答える 1

6

これはどう?メッセージを公開するには、

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

pub / sub経由でメッセージを受信するとき、および起動するとき、クライアントは最新のインデックス(これは、redisまたは他の場所に保持することもできます)をglobal_indexと比較し、リストからmin(global_index --my_index、N)メッセージを読み取る必要があります。追いつく(基本的にLRANGE list 0 (global_index - my_index))。

于 2012-12-13T23:07:28.810 に答える