我的总体问题是:将 Redis 用于 PubSub,当发布者将消息推送到频道中的速度超过订阅者能够读取它们的速度时,消息会发生什么?
例如,假设我有:
- 一个简单的发布者以 2 msg/sec 的速率发布消息。
- 一个简单的订阅者以 1 msg/sec 的速度阅读消息。
我天真的假设是订阅者只会看到发布到 Redis 上的 50% 的消息。为了测试这个理论,我写了两个脚本:
发布.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)
子.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
第一个运行时,紧接着是pub.py
,我发现sub.py
实际上显示了所有消息(1-10),一个接一个,中间有 1 秒的延迟。我最初的假设是错误的,Redis 正在排队消息。需要更多的测试。 - 当我
pub.py
先运行,然后在运行前等待 5 秒时sub.py
,我发现sub.py
只显示了消息的后半部分(5-10)。我最初会假设这一点,但鉴于我之前的结果,我会认为消息已排队,这导致我得出以下结论......
结论
- Redis 服务器似乎为每个客户端、每个通道的消息排队。
- 只要客户端在监听,它读取消息的速度有多快都没有关系。只要它已连接,消息就会一直为该客户端、该通道排队。
剩下的问题
- 这些结论有效吗?
- 如果是这样,客户端/通道消息将排队多长时间?
- 如果是这样,是否有
redis-cli info
命令查看排队的消息数量(对于每个客户端/通道)?