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