发布-订阅模型(Publish-Subscribe Model)的底层机制通常基于观察者模式。
发布-订阅模型是观察者模式的一种变体。
在观察者模式中,主题(或被观察者)维护了一组观察者,当主题的状态发生变化时,观察者会被通知并执行相应的更新操作。发布-订阅模型扩展了这个思想,引入了一个称为消息代理或事件通道的中介,允许发布者发布消息(事件)到通道,而订阅者则通过订阅这个通道来接收消息。
发布订阅和观察者的区别:
- 发布订阅模式引入一个消息通道中介,发布者发布到通道,订阅者通过订阅这个通道来接收消息。
- 订阅者可以订阅多个消息通道,发布者可以在多个通道发送消息。
- 发布订阅模式由通道将消息推送给订阅者。
什么时候不合适用发布者订阅者模式:
少量订阅者: 如果你的程序只有很少的订阅者,而且它们之间的关系相对简单,引入发布/订阅模式可能显得过于复杂。在这种情况下,直接的调用或其他简单的通信方式可能更加合适。
实时交互: 如果你的系统需要与子系统进行实时的同步交互,而不是通过异步的事件通知,那么发布/订阅模式可能不是最佳选择。在实时交互的场景中,直接的方法调用或请求-响应模式可能更为合适。
复杂性超出需要: 发布/订阅模式引入了一定的复杂性,特别是在处理订阅和发布的中介机制时。如果你的应用程序相对简单,且没有复杂的通信需求,那么引入这样的模式可能显得不必要。
高频率的消息通信: 如果你的系统要求高频率的消息通信,而且消息的发布和订阅操作开销较大,那么可能需要考虑其他更为高效的通信机制,以避免性能问题。
单一应用内部通信: 如果你的应用程序是一个单一的、独立的应用,而且内部组件之间的通信相对简单,那么引入发布/订阅模式可能显得过度。
是么时候合适:
广播信息给大量消费者: 如果你的应用程序需要向大量的消费者广播信息,例如微信订阅号向订阅者广播消息,发布/订阅模式是一种适用的模式。它允许消息的发布者将信息发送给所有订阅者,而不需要知道具体有多少订阅者。
多个独立应用程序或服务通信: 当应用程序需要与独立开发的应用程序或服务通信,尤其是这些应用程序可能使用不同的平台、编程语言和通信协议时,发布/订阅模式提供了一种解耦的方式,让它们能够独立演进而不影响彼此。
非实时响应: 如果应用程序需要向消费者发送信息,而不需要实时响应,发布/订阅模式是一种合适的选择。消费者可以异步地处理它们接收到的信息,而不会阻塞发布者。
集成系统最终一致性: 如果系统被设计为支持最终一致性模型,即允许一段时间内的不一致,发布/订阅模式可以满足这种设计要求。每个订阅者在自己的时间表上处理消息,而不需要实时一致性。
满足不同可用性和运行时间计划的消费者: 如果需要将信息传递给多个消费者,并且这些消费者具有不同的可用性要求或正常运行时间计划,发布/订阅模式提供了一种异步的方式来满足这些不同的需求。