当前位置: 首页 > news >正文

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

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

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

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

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

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

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

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

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

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

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

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

是么时候合适:

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

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

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

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

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

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

http://www.lryc.cn/news/305535.html

相关文章:

  • TiDB离线部署、Tiup部署TiDB
  • 10GBase-T万兆电口模块助力数据中心实现高效数据传输
  • 使用Docker中部署GitLab 避坑指南
  • 我的NPI项目之设备系统启动(八) -- Android14的GKI2.0开发步骤和注意事项
  • 鼠标右键助手专业版 MouseBoost PRO for Mac v3.3.6中文破解
  • React学习计划-react-hooks补充
  • KTV点歌系统vue+springboot音乐歌曲播放器系统
  • vue video 多个视频切换后视频不显示的解决方法
  • 多态与代码屎山
  • Git基本操作(2)
  • 编程笔记 Golang基础 023 切片
  • qt 软件发布(Windows)
  • 《汇编语言》- 读书笔记 - 第11章-标志寄存器
  • 1.QT简介(介绍、安装,项目创建等)
  • 【服务器】服务器推荐
  • 信号系统之线性图像处理
  • uniapp腾讯地图JavaScript Api,H5端和原生APP端可用
  • MyBatisPlus:PG数组类型自动映射问题
  • Data-Shape制作UI节点简介
  • kubernetes负载均衡部署
  • NestJS入门6:日志中间件
  • CommonJS、require、moudle实现两个文件传参
  • 关于php、php-fpm的解释
  • 【CMake】(8)包含库文件
  • 【 JS 进阶 】Web APIs (二)
  • 解决弹性布局父元素设置高自动换行,子元素均分高度问题(align-content: flex-start)
  • 什么是负载均衡集群?
  • 【es6】的新特性
  • Java中的多线程是如何实现的?
  • C++知识点总结(22):模拟算法