发布订阅模式:观察者模式的一种变体

发布-订阅模型(Publish-Subscribe Model)的底层机制通常基于观察者模式。

发布-订阅模型是观察者模式的一种变体。

在观察者模式中,主题(或被观察者)维护了一组观察者,当主题的状态发生变化时,观察者会被通知并执行相应的更新操作。发布-订阅模型扩展了这个思想,引入了一个称为消息代理或事件通道的中介,允许发布者发布消息(事件)到通道,而订阅者则通过订阅这个通道来接收消息。

发布订阅和观察者的区别:

  1. 发布订阅模式引入一个消息通道中介,发布者发布到通道,订阅者通过订阅这个通道来接收消息。
  2. 订阅者可以订阅多个消息通道,发布者可以在多个通道发送消息。
  3. 发布订阅模式由通道将消息推送给订阅者。
    在这里插入图片描述

什么时候不合适用发布者订阅者模式:

少量订阅者: 如果你的程序只有很少的订阅者,而且它们之间的关系相对简单,引入发布/订阅模式可能显得过于复杂。在这种情况下,直接的调用或其他简单的通信方式可能更加合适。

实时交互: 如果你的系统需要与子系统进行实时的同步交互,而不是通过异步的事件通知,那么发布/订阅模式可能不是最佳选择。在实时交互的场景中,直接的方法调用或请求-响应模式可能更为合适。

复杂性超出需要: 发布/订阅模式引入了一定的复杂性,特别是在处理订阅和发布的中介机制时。如果你的应用程序相对简单,且没有复杂的通信需求,那么引入这样的模式可能显得不必要。

高频率的消息通信: 如果你的系统要求高频率的消息通信,而且消息的发布和订阅操作开销较大,那么可能需要考虑其他更为高效的通信机制,以避免性能问题。

单一应用内部通信: 如果你的应用程序是一个单一的、独立的应用,而且内部组件之间的通信相对简单,那么引入发布/订阅模式可能显得过度。

是么时候合适:

广播信息给大量消费者: 如果你的应用程序需要向大量的消费者广播信息,例如微信订阅号向订阅者广播消息,发布/订阅模式是一种适用的模式。它允许消息的发布者将信息发送给所有订阅者,而不需要知道具体有多少订阅者。

多个独立应用程序或服务通信: 当应用程序需要与独立开发的应用程序或服务通信,尤其是这些应用程序可能使用不同的平台、编程语言和通信协议时,发布/订阅模式提供了一种解耦的方式,让它们能够独立演进而不影响彼此。

非实时响应: 如果应用程序需要向消费者发送信息,而不需要实时响应,发布/订阅模式是一种合适的选择。消费者可以异步地处理它们接收到的信息,而不会阻塞发布者。

集成系统最终一致性: 如果系统被设计为支持最终一致性模型,即允许一段时间内的不一致,发布/订阅模式可以满足这种设计要求。每个订阅者在自己的时间表上处理消息,而不需要实时一致性。

满足不同可用性和运行时间计划的消费者: 如果需要将信息传递给多个消费者,并且这些消费者具有不同的可用性要求或正常运行时间计划,发布/订阅模式提供了一种异步的方式来满足这些不同的需求。

使用消息中间件是发布/订阅模式的一种常见选择,而不是手动实现整个机制。

相关推荐

  1. 发布订阅模式观察模式详解

    2024-02-23 20:06:03       36 阅读
  2. 观察模式发布-订阅模式有什么异同

    2024-02-23 20:06:03       21 阅读
  3. 如何实现观察模式发布-订阅模式

    2024-02-23 20:06:03       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-23 20:06:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-23 20:06:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-23 20:06:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-23 20:06:03       20 阅读

热门阅读

  1. 备战蓝桥杯 Day11(滚动数组优化+完全背包)

    2024-02-23 20:06:03       27 阅读
  2. c++无条件转移语句goto的介绍

    2024-02-23 20:06:03       25 阅读
  3. ERC721解读

    2024-02-23 20:06:03       31 阅读
  4. 计算机网络中的与或非运算

    2024-02-23 20:06:03       36 阅读
  5. Redis之缓存雪崩问题解决方案

    2024-02-23 20:06:03       29 阅读
  6. 使用Python创建一个简单的Discord机器人

    2024-02-23 20:06:03       33 阅读
  7. 2.22号qt

    2024-02-23 20:06:03       28 阅读
  8. 【Git】 删除远程分支

    2024-02-23 20:06:03       34 阅读
  9. 在C++程序中给视频添加文字水印

    2024-02-23 20:06:03       28 阅读
  10. win7 使用openssh

    2024-02-23 20:06:03       32 阅读