一、什么是发布订阅
在软件架构中,发布订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话)可能存在。同样的,订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息,无需了解哪些发布者(如果有的话)存在。
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(publish)发送消息,订阅者(subscribe)接收消息。
发布订阅也叫生产者消费者模式,是实现消息队列的一种方式:
- 消息队列的三要素
- 1、生产者producer
- 2、消费者consumer
- 3、消息服务broker
发布订阅关系图
- A:生产者/发布
- Message:消息队列
- B:消费者/订阅
Redis发布图和订阅图:
channel1就是消息队列
二、如何实现发布订阅
1、命令行实现
开启4个redis客户端,如一节的上图,3个客户端作为消息订阅者,1个为消息发布者:./redis-cli
让3个消息订阅者订阅某个频道主题:subscribe newspaper
- 如果是订阅匹配模式的频道主题:psubscribe chan* (表示匹配以chan开头的频道主题)
注意命令是psubscribe,有个p字母
让1个消息发布者向频道主题上发布消息:publish channel message
然后观察消息的发布和订阅情况
订阅获取的有三条信息
- type:message #类型为message
- channel:newspaper #频道为newspaper
- data:xxxxxx #数据为xxxxxx
2、Python实现Redis发布和订阅
先介绍一下redis的pub/sub功能:
Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能。基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件;发布者(如服务器)可将订阅者感兴趣的事件随时通知相关订阅者。
通俗来讲,就是说我sub端(订阅者)一直监听着,一旦pub端(发布者)发布了消息,那么我就接收过来,举个例子,先是发布者:
#coding:utf-8
import time
from redis import StrictRedis
info_list = ['hello', 'world', 'love', 'python']
redis = StrictRedis(host='***', port='6379', db=3, password='********')
for i in info_list:
redis.publish("newschannel", i) #发布消息到newschannel
接着我们来看看订阅者:
#coding:utf-8
import time
from redis import StrictRedis
redis = StrictRedis(host='****', port='6379', db=3, password='******')
ps = redis.pubsub()
ps.subscribe('newschannel') #从newschannel订阅消息
for item in ps.listen(): #监听状态:有消息发布了就拿过来
if item['type'] == 'message': #如果信息类型为message
print item['channel'] #打印频道和信息内容
print item['data']
关于数据结构,也就是item,
是类似于:{'pattern': None, 'type': 'message', 'channel': 'newschannel', 'data': 'hello'}这样的
所以可以通过channel来判断这个消息是属于哪一个队列里的。(运行程序的时候,先运行订阅者,在运行发布者程序)
总结,要点有两个:
- 一是连接方式。使用python连接redis有三种方式:
- 使用库中的Redis类(或StrictRedis类,其实差不多);
- 使用ConnectionPool连接池(可保持长连接);
- 使用Sentinel类(如果有多个redis做集群时,程序会自己选择一个合适的连接)。
- 二是订阅方法。这里使用的是StrictRedis类中的pubsub方法。连接好之后,可使用subscribe或psubscribe方法来订阅redis消息。其中subscribe是订阅一个频道,psubscribe可订阅多个频道(这样写的时候,作为参数的频道应该是一个列表)。之后就可以开始监听了。
三、应用与总结
发布订阅是消息队列的一种方式,基于消息队列的方式,可以实现系统解耦、削峰填谷,顶住流量洪峰(高并发)
常用的流行的消息队列有:ActiveMQ、RabbitMQ等