redis的订阅发布服务 api简单易用 性能好于icestorm
icestorm的订阅发布服务在我们公司使用了好几年了,使用的也非常稳定成熟了.
?
?
今天在本地的服务器上分别对redis的订阅发布服务 和 icestorm进行了压力测试.
redis的订阅发布服务性能比icestorm要高一些.
这次的压力测试主要分为两大块,"消息的接收能力" 和 ?"接收到消息后的分发能力"
?
测试的单条消息数据为20个字节
?
接收能力:
? ? redis ? ? ? ? ? ?15000次/秒
? ? icestorm: ? ? ? ?10000次/秒
?
分发能力:
? ? 订阅者个数 ? redis ? ? ? ? icestorm
? ? 3 ? ? ? ? ? ?5000次/秒 ? ? ?3000次/秒
? ? 6 ? ? ? ? ? ?5000次/秒 ? ? ?2900次/秒
? ? 9 ? ? ? ? ? ?5000次/秒 ? ? ?2900次/秒
?
?
不过redis没提供集群的功能,而icestorm支持集群.
?
api介绍:
?
消息发布端:
? ? php:
? ? ? ? <?php
? ? ? ? ? ? $redis = new Redis();
? ? ? ? ? ? //连接redis server
? ? ? ? ? ? $redis->connect('192.168.0.235',6379);
? ? ? ? ? ? //第一个参数是你发送消息的channel,有的地方叫做topic,就像对讲机有不同的频率和频道
? ? ? ? ? ? //第二个参数是你对这个channel发送消息的具体内容 只能是string类型的
? ? ? ? ? ? $redis->publish('channel','i am publishing message');
? ? ? ? ?>
?
? ? python:
? ? ? ? import redis
? ? ? ? #连接redis server
? ? ? ? REDIS_CONN = ?redis.Redis(host='192.168.0.235',port=6379)
? ? ? ? #第一个参数是你发送消息的channel,有的地方叫做topic,就像对讲机有不同的频率和频道
? ? ? ? #第二个参数是你对这个channel发送消息的具体内容 只能是string类型的
? ? ? ? REDIS_CONN.publish('channel_1', 'i am publishing message')
?
?
消息订阅端:
? ? python:
?
? ? ? ? import redis
?
? ? ? ? #连接redis
? ? ? ? redis_conn = redis.Redis(host='192.168.0.235',port=6379)
? ? ? ? #实例化一个 pubsub 对象
? ? ? ? pubsub_ins = redis_conn.pubsub()
? ? ? ? #订阅你关心的channel
? ? ? ? #
? ? ? ? # api中提供了一种批量订阅的方法
? ? ? ? # pattern为 "ESUN*" 则表示订阅所有ESUN开头的channel
? ? ? ? # pubsub_ins.psubscribe(pattern);
? ? ? ? #
? ? ? ? pubsub_ins.subscribe('channel_1')
? ? ? ? #listen 开始收听该channel的消息 加上这句以后 redis server就会将你订阅的channel的消息发送过来了
? ? ? ? #它将消息存储在 listen2 ?listen2是一个 yield?
? ? ? ? listen2 = ?pubsub_ins.listen()
? ? ? ? while 1:
? ? ? ? ? ? #next操作就会将yield中的消息一条一条的取出来了 ?没有消息会一直阻塞
? ? ? ? ? ? msg = listen2.next()
? ? ? ? ? ? print msg