私の全体的な質問は次のとおりです。PubSub に Redis を使用する場合、サブスクライバーがメッセージを読み取る速度よりもパブリッシャーがメッセージをチャネルにプッシュすると、メッセージはどうなりますか?
たとえば、私が持っているとしましょう:
- 2 メッセージ/秒の速度でメッセージをパブリッシュする単純なパブリッシャー。
- 1 msg/sec の速度でメッセージを読み取る単純なサブスクライバー。
私の素朴な仮定は、サブスクライバーは Redis に公開されたメッセージの 50% しか見ることができないということです。この理論をテストするために、次の 2 つのスクリプトを作成しました。
pub.py
queue = redis.StrictRedis(host='localhost', port=6379, db=0)
channel = queue.pubsub()
for i in range(10):
queue.publish("test", i)
time.sleep(0.5)
sub.py
r = redis.StrictRedis(host='localhost', port=6379, db=0)
p = r.pubsub()
p.subscribe('test')
while True:
message = p.get_message()
if message:
print "Subscriber: %s" % message['data']
time.sleep(1)
結果
- 最初にを実行した
sub.py
直後に を実行すると、実際にはすべてのメッセージ (1 ~ 10) が 1 秒間隔で次々に表示されるpub.py
ことがわかりました。sub.py
私の最初の仮定は間違っていました。Redis はメッセージをキューに入れています。さらにテストが必要です。 - 最初に実行してから
pub.py
5 秒待ってから実行すると、メッセージの後半 (5-10) しか表示されないsub.py
ことがわかりました。sub.py
当初はこれを想定していましたが、以前の結果を考えると、メッセージがキューに入れられていると考えていたため、次の結論に至りました...
結論
- Redis サーバーは、クライアントごと、チャネルごとにメッセージをキューに入れているように見えます。
- クライアントがリッスンしている限り、メッセージの読み取り速度は重要ではありません。接続されている限り、メッセージはそのクライアント、そのチャネルのキューに入れられたままになります。
残りの質問
- これらの結論は有効ですか?
- その場合、クライアント/チャネル メッセージはどのくらいキューに入れられたままになりますか?
- もしそうなら、
redis-cli info
(各クライアント/チャネルごとに)キューに入れられているメッセージの数を確認するコマンドはありますか?