发布订阅模式(pub/sub)是一种设计模式,消息发布者将消息按类别发布,不同订阅者根据自身需求去订阅所需的消息。这种设计思路主要是考虑到功能的解耦与更为动态的网络拓扑。
对于发布者和订阅者而言,它们并不感知具体的网络拓扑,甚至不必去了解对方的存在形式。大多数情况下,会有一个中间代理人(broker)的角色来处理发布者和订阅者之间消息频道的协调工作。发布者将消息推至中间代理人处,对应的,订阅者从中间代理人处订阅消息。而中间代理人通常是一个消息队列(Message Queue),少数情况下,Redis也可以充当代理人的角色。常见的MQ有:RabbitMQ, RocketMQ,Kafka等等。
而Python中也有相关的模块(blinker, python-message等)实现了较为健全的发布/订阅功能。
import message
def foo(msg):
print 'I get a message from pub:{msg}!'.format(msg=msg)
msg.sub('msg', foo)
msg.pub('msg', 'Eureka')
#output
I get a message from pub:Eureka!
上面是一个最简单的例子。除此之外,python-massage
还对订阅者支持取消订阅功能,和在上下文中进行终止消息传递的操作。内部通过队列来保证消息的全局顺序,但在sub时进行插队。