Python Redis-Pubsub与消息队列
我的总体问题是:使用Redis for PubSub,当发布者将消息推送到频道的速度超过订阅者的阅读速度时,消息会发生什么变化 例如,假设我有:Python Redis-Pubsub与消息队列,python,redis,redis-cli,Python,Redis,Redis Cli,我的总体问题是:使用Redis for PubSub,当发布者将消息推送到频道的速度超过订阅者的阅读速度时,消息会发生什么变化 例如,假设我有: 一个简单的发布者以2 msg/秒的速度发布消息 一个简单的订阅者以每秒1 msg的速率读取消息 我天真的假设是订阅者只能看到50%的消息发布到Redis上。为了验证这个理论,我写了两个脚本: pub.py queue = redis.StrictRedis(host='localhost', port=6379, db=0) channel = q
- 一个简单的发布者以2 msg/秒的速度发布消息李>
- 一个简单的订阅者以每秒1 msg的速率读取消息
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)
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
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)
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
实际上显示了所有消息(1-10),一个接一个,中间有1秒的延迟。我最初的假设是错误的,Redis正在排队等待消息。需要更多的测试sub.py
- 当我先运行
,然后在运行pub.py
之前等待5秒时,我发现sub.py
只显示了消息的后半部分(5-10)。我本来会假设这一点,但考虑到我之前的结果,我会认为消息是排队的,这导致我得出以下结论sub.py
- Redis server似乎为每个客户端、每个通道的消息排队李>
- 只要客户机在侦听,它读取消息的速度就无关紧要。只要它是连接的,消息将保持排队等待该客户机,该通道
- 这些结论有效吗
- 如果是,客户端/通道消息将保持排队多长时间
- 如果是,是否有
命令来查看队列中有多少消息(针对每个客户端/通道)redis cli info
对于套接字缓冲区,没有Redis命令。但是,在Linux上,可以构建一个脚本来解释/proc/net/tcp文件的内容。请看一个例子。此脚本可能需要根据您的系统进行调整。“问题有新答案-请单击此处加载”-您键入的速度比我快,并给出了一个惊人的答案:)抱歉:-)我被问题所激励!回答得很好!是否可以完全禁用Redis缓冲区,仅接收新事件的实际数据(例如,证券交易所市场更新),即使之前的数据有所丢失,也可以确保数据是最新的?不,不可能。缓冲区中的内容已经在Redis协议中编码,不能在任意位置任意剪切。它可能需要重新分析缓冲区的内容。@Didier Spezia,Redis 4.0.7中的“C”源代码文件包含控制1)TCP何时会阻止通信并阻止Redis在套接字中推送更多信息的逻辑。2) 如果订阅者的速度实在太慢,并且积累了大量数据,Redis何时最终会关闭与订阅者的连接?非常感谢。