2016-04-16 1 views
0

Redisは、配送が保証された送信者/受信者モデルを許可するBRPOPを提供します。2人のクライアントが同時にRedisに値が存在するのを待つべきですか?

送信者:LPUSH foo_key bar_value
受信機:BRPOP foo_key ### => 'bar_value'

###は間隔を任意の有効期限が切れている場合は、15秒と言います。

ただし、メッセージの受信者が2つある場合はどうすればよいですか。私は、次のオプションについて考えてきました:

  1. /をPUBLISHはをSUBSCRIBEが、受信機がチャネルに秒SUBSCRIBE前に、送信者が ESメッセージを公開する場合、これは競合状態につながります。
  2. 送信者は、値が存在するまでSET +キーでを期限切れにし、受信機のポーリングキーを呼び出し、その後、 sの値を取得します。データは最終的にEXPIREタイムアウトに基づいて削除されます。私はこのオプションが気に入らないのは、多くのクライアントが同時にそれをやっていると、レディスをポーリングするとパフォーマンスが低下する可能性があり、レスポンスはリアルタイムではないからです。

リアルタイムで保証された配信でマルチクライアント受信機モデルを設定するにはどうすればよいですか?

スキーマ内の特定のキーに対して1つのメッセージしか送信されないため、クライアントが誤って同じメッセージを2回受信する危険性はありません。

答えて

0

これを実現するには、BRPOPLPUSHを使用できることがわかりました。

を送信者:LPUSH foo_key bar_valueEXPIRE foo_key ###
レシーバ続い:BRPOPLPUSH foo_key foo_key ### =>bar_value前のように、各###がある任意の期限切れ間隔は、

は、15秒を言います。

+0

あなたは受信者がプッシュするリストの名前、あなたは同じ 'foo_key'を意味すると思います。その場合、タイムアウト前にジョブが終了して「BRPOPLPUSH」に戻ると、受信者は値の処理を複数回終了する可能性があります。 –

+0

ありがとう、私は投稿を編集しました。それは 'BRPOPLPUSH foo_key foo_key ###' – sffc

+0

でなければなりません。異なるリスナーに異なるキューを使用し、必要に応じてすべて/一部/複数にプッシュします。 –

2

送信者は、2つのキューに値をプッシュすることができます。各キューのキューは1つです。

各受信者は、構成ファイルにそのキューの名前を持つことができます。レシーバはブロッキングポップを使用する可能性があるため、ポーリングは必要ありません。

もちろん、このアプローチでは、受信者の1人が処理を停止すると、検出が容易になります。

+0

Redisの著者は、「Redisをジョブキューとして」ユースケースとしてさらに探求するための新しいプロジェクトを作成したことを知りたいと思うかもしれません:https://github.com/antirez/disque –

関連する問題