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