发布/订阅模型介绍
发布/订阅(pub/sub)模型是一种消息传递模式,其中发布者将消息发送给消息代理,而订阅者则表达接收特定消息的兴趣。消息代理负责将这些消息传递给已订阅的客户端。
在使用发布/订阅模型时,发布者向消息代理提供消息,而订阅者则表明其接收特定消息的兴趣。将消息传递给已订阅的客户端是消息代理的职责。
在发布/订阅范式中,发布者和订阅者是相互分离的,因此它们可以在互不知晓对方存在的情况下进行通信。由于可以在不影响其他组件的情况下添加或删除发布者和订阅者,这使得系统能够更加灵活和可扩展。
我们可以使用多种技术来构建发布/订阅系统,例如消息队列、事件总线以及基于主题的发布/订阅系统。它们常用于事件驱动架构、分布式系统和微服务架构中。
在本教程中,我们将通过实例学习如何在 Python 中实现发布/订阅模式。
发布/订阅中的主题
在发布/订阅系统中,主题用于对消息进行分类,并允许订阅者表达对特定类型消息的兴趣。
在基于主题的发布/订阅系统中,发布者将消息发送到特定的主题,而订阅者则对一个或多个主题表达兴趣。消息代理负责将消息传递给已订阅的客户端。
例如,在一个新闻发布系统中,可能会有不同新闻类别的主题,如政治、体育和娱乐。订阅者可以选择接收特定主题上的消息,例如仅接收体育和娱乐新闻。当发布者发送体育主题的消息时,该消息将被传递给所有对该主题感兴趣的订阅者。
使用主题允许对传递给订阅者的消息进行更细粒度的控制,因为他们可以选择仅接收与自身相关的消息。这也使系统更具可扩展性,因为发布者和订阅者不需要知道彼此的具体身份。
!image主题
发布/订阅中的事件
事件是由发布者发布并传递给订阅客户端的消息。事件通常是对已发生或即将发生的事情的通知。它可以包含有关事件的数据,例如事件类型、描述以及任何相关细节。在事件驱动架构中,事件用于触发系统中其他部分的操作或行为。例如,事件可用于通知服务有新用户注册,或支付已处理。然后,服务可以通过执行某些操作(如发送欢迎电子邮件或更新数据库)来响应事件。使用事件可以实现更灵活、可扩展的系统,因为发布者和订阅者不需要直接耦合,并且可以异步通信。这也使系统更加解耦和模块化,因为组件可以响应事件而无需知道发布者的具体身份。
事件总线
事件总线是一种允许发布者向订阅者发送事件的消息传递系统。它是发布/订阅系统的一种,常用于事件驱动架构中。
在事件总线中,事件被发布到中央消息代理,该代理负责将事件传递给订阅的客户端。订阅者通过向事件总线注册并指定他们想要接收的事件列表,来表达接收事件的兴趣。
!image事件总线
实例
实例1:
使用Python内置队列模块实现的基本发布/订阅模型:
在这里,Publisher类有一个消息队列和一个订阅者列表。当使用发布方法发布消息时,它会被添加到队列中,并通过调用订阅者的接收方法传递给所有已订阅的客户端。Subscriber类有一个接收方法,该方法简单地打印接收到的消息。
“`python
import queue
class Publisher:
def init(self):
self.message_queue = queue.Queue()
self.subscribers = []
def subscribe(self, subscriber):
self.subscribers.append(subscriber)
def publish(self, message):
self.message_queue.put(message)
for subscriber in self.subscribers:
subscriber.receive(message)
class Subscriber:
def init(self, name):
self.name = name
def receive(self, message):
print(f"{self.name}"+"received message:"
+f"{message}")
publishe