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

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

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

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

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

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

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

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

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

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

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

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

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

是么时候合适:

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

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

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

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

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

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

相关文章:

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

发布-订阅模型(Publish-Subscribe Model)的底层机制通常基于观察者模式。 发布-订阅模型是观察者模式的一种变体。 在观察者模式中,主题(或被观察者)维护了一组观察者,当主题的状态发生变化时&#xff0c…...

TiDB离线部署、Tiup部署TiDB

先做tidb准备工作: 部署 TiDB 前的环境检查操作:TiDB 环境与系统配置检查 | PingCAP 文档中心 1.查看数据盘 fdisk -l (2,3)本人的分区已经是 ext4 文件系统不用分区,具体官方文档的分区: 4.查看数据盘…...

10GBase-T万兆电口模块助力数据中心实现高效数据传输

10GBase-T万兆电口模块一种高速、高效的网络连接解决方案,具有快速传输速度和稳定可靠的特点。它可以在数据中心中广泛应用,提供出色的网络性能和可扩展性,为数据中心的发展做出了重要的贡献。 一、10GBase-T万兆电口模块的特点与优势 高速传…...

使用Docker中部署GitLab 避坑指南

在容器化的世界中,Docker已经成为了我们部署和管理应用程序的首选工具。然而,在使用Docker部署GitLab时,我们可能会遇到一些问题,本文将为你提供一份详细的避坑指南。网上的教程有的都没说清楚,或者干脆是错的。摸索了…...

我的NPI项目之设备系统启动(八) -- Android14的GKI2.0开发步骤和注意事项

GKI是什么? Google为什么要推行GKI? GKI全称General Kernel Image。GKI在framework和kernel之间提供了标准接口,使得android OS能够轻松适配/维护/兼容不同的设备和linux kernel。 Google引入GKI的目的是将Framework和Kernel进一步的解耦。因…...

鼠标右键助手专业版 MouseBoost PRO for Mac v3.3.6中文破解

MouseBoost Pro mac版是一款简单实用的鼠标右键助手专业版,MouseBoost Pro for Mac只要轻点你的鼠标右键,就可以激活你想要的各种功能,让你的工作效率大幅度提高,非常好用。 软件下载:MouseBoost PRO for Mac v3.3.6中…...

React学习计划-react-hooks补充

React Hooks 1. 使用hooks理由 高阶组件为了复用,导致代码层级复杂生命周期的复杂 2. useState(保存组件状态) const [state, setstate] useState(initialState)3. useEffect(处理副作用)和useLayoutEffect(同步执行副作用) 使用方式: useEffect(…...

KTV点歌系统vue+springboot音乐歌曲播放器系统

目前现有的KTV点歌系统对于用户而言其在线点歌流程仍然过于繁琐,对于歌曲而言其系统安全性并不能保障。同时整套系统所使用的技术相对较为落后,界面不能动态化展示。相比较于其它同类型网站而言不能体现技术先进性。 1.2 项目目标 KTV点歌系统的后台开发…...

vue video 多个视频切换后视频不显示的解决方法

先说一下我这边的需求是视频需要轮播&#xff0c;一个人员有多个视频&#xff0c;左右轮播是轮播某个人员下的视频&#xff0c;上下切换是切换人员。 vue 代码 <el-carouselindicator-position"none"ref"carousel"arrow"always":interval&qu…...

多态与代码屎山

到底什么是多态呢?多态是面向未来的,比如企业采购为例: 一般分为线上合线下两种, 我们设计一个父类叫做"采购", 里面做一些共通的处理: 申请, 承认, 支付, 购买方式. 然后让各自的子类(线上,线下)实现自己的方法.实际调用过程中传入不同的对象就可以.到此为止项目开…...

Git基本操作(2)

Git基本操作&#xff08;2&#xff09; 上交文件之后&#xff0c;git文件的变化git cat-file HEAD指针里面有啥文件被修改git statusgit diff 文件名 版本回退&#xff08;git reset&#xff09;撤销回退git reflog 撤销的三种情况还没有addgit checkout -- [file] 已经add还没…...

编程笔记 Golang基础 023 切片

编程笔记 Golang基础 023 切片 一、切片二、定义与初始化三、基本操作四、示例 Go语言中的切片&#xff08;slices&#xff09;是基于数组的抽象数据类型&#xff0c;它提供了一种灵活的方式来处理可变长度的数据序列。切片本身不存储任何数据&#xff0c;而是指向底层数组的一…...

qt 软件发布(Windows)

1. 开发环境 QtCreator MSVC编译器 2. 源码编译 生成release或者debug版本的exe可执行文件(x64或x86) 3. windeployqt 打包 ①左下角开始菜单栏找到QT的命令交互对话框&#xff0c;如下图MSVC 2017 64-bit(根据第二步编译的类型选择64位或者32位)。 ②cd 切换到第二步可…...

《汇编语言》- 读书笔记 - 第11章-标志寄存器

《汇编语言》- 读书笔记 - 第11章-标志寄存器 标志寄存器指令与标志位关系11.1 ZF&#xff08;Zero Flag&#xff0c;零标志位&#xff09;11.2 PF&#xff08;Parity Flag&#xff0c;奇偶标志位&#xff09;11.3 SF&#xff08;Sign Flag&#xff0c;符号标志位&#xff09;处…...

1.QT简介(介绍、安装,项目创建等)

1. QT介绍 Qt&#xff08;官方发音 [kju:t]&#xff09;是一个跨平台的C开发库&#xff0c;主要用来开发图形用户界面&#xff08;Graphical User Interface&#xff0c;GUI&#xff09;程序 Qt 是纯 C 开发的&#xff0c;正常情况下需要先学习C语言、然后在学习C然后才能使用…...

【服务器】服务器推荐

一、引言 在数字世界的浪潮中&#xff0c;服务器作为数据存储和处理的基石&#xff0c;其重要性不言而喻。而在这个繁星点点的市场中&#xff0c;雨云以其独特的优势和超高的性价比&#xff0c;逐渐成为众多企业和个人的首选。今天&#xff0c;就让我带你走进雨云的世界&#…...

信号系统之线性图像处理

1 卷积 图像卷积的工作原理与一维卷积相同。例如&#xff0c;图像可以被视为脉冲的总和&#xff0c;即缩放和移位的delta函数。同样&#xff0c;线性系统的特征在于它们如何响应脉冲。也就是说&#xff0c;通过它们的脉冲响应。系统的输出图像等于输入图像与系统脉冲响应的卷积…...

uniapp腾讯地图JavaScript Api,H5端和原生APP端可用

因项目需要&#xff0c;在uniapp中集成使用腾讯地图&#xff0c;为了方便维护&#xff0c;希望通过一套代码实现H5和APP同时可用。H5显示相对简单&#xff0c;APP端比较麻烦&#xff0c;记录下实现过程 一、集成步骤 1.使用 renderjs script标签使用renderjs&#xff0c;因为…...

MyBatisPlus:PG数组类型自动映射问题

引言: PostGreSQL数据库提供了丰富的数据类型,通过查看官网文档,我们也可以发现,PG也提供了对数组类型的支持。 但是在实际开发中,我们通常是使用MyBatis/MyBatisPlus这种半自动ORM映射框架来实现数据库/表数据基本的增删改查,以及其它操作。那么,问题来了,如何…...

Data-Shape制作UI节点简介

很多小伙伴对于Data-Shape制作简单的UI都是似懂非懂&#xff0c;群里很多小伙伴也总是询问相关的问题&#xff0c;那么&#xff0c;今天我就简单举几个例子&#xff0c;专门介绍下Data-Shape创建简单UI的教程。 首先&#xff0c;本次教程&#xff0c;使用的是Data-Shape 2021.…...

SEO_SEO数据监控与分析的关键指标介绍

SEO数据监控与分析的关键指标介绍 在当今数字营销的世界里&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已经成为了每个网站运营者和数字营销人员必不可少的技能。SEO数据监控与分析是SEO工作的重要环节&#xff0c;通过对关键指标的监控和分析&#xff0c;我们可以更好…...

ZYNQ PS侧DDR3内存配置避坑指南:以ACZ702开发板为例,手把手教你搞定MT41K128M16

ZYNQ PS侧DDR3内存配置实战&#xff1a;从硬件原理到Vivado参数设置全解析 当你第一次拿到ACZ702这样的ZYNQ开发板&#xff0c;准备配置PS侧的DDR3内存时&#xff0c;是否遇到过这样的困惑&#xff1a;为什么在Vivado中找不到DDR管脚约束选项&#xff1f;为什么按照传统FPGA的D…...

Matlab源代码教程:枝晶生长模拟中的溶质与液相分数分析

枝晶生长模拟&#xff0c;溶质、液相分数&#xff0c;matlab源代码 教程相场法模拟枝晶生长这事挺有意思的——想象金属熔液凝固时&#xff0c;那些像雪花般绽放的晶体结构&#xff0c;背后其实是溶质扩散和相变的战场。今儿咱们用MATLAB整活&#xff0c;搞个能看见晶体长毛刺的…...

四管升降压电路实战解析:从拓扑原理到模式切换(附波形对比)

1. 四管升降压电路为何成为工程师的"瑞士军刀" 第一次接触四管升降压电路时&#xff0c;我正被一个光伏储能项目折磨得焦头烂额。太阳能板的输出电压在8V-18V剧烈波动&#xff0c;而系统需要稳定的12V供电。传统方案要用两个独立电路串联&#xff0c;直到老工程师扔给…...

别再手动整理了!用Python脚本5分钟搞定ImageNet验证集标签映射(附完整代码)

5分钟极速搞定ImageNet验证集标签映射&#xff1a;Python自动化实战指南 每次处理ImageNet验证集时&#xff0c;你是否也对着那些晦涩的数字标签头疼不已&#xff1f;手动查表不仅效率低下&#xff0c;还容易出错。今天我们就来彻底解决这个痛点——用Python脚本自动完成标签映…...

告别模糊边界!用Monodepth2实战KITTI深度估计,详解自动掩码与最小重投影损失

告别模糊边界&#xff01;用Monodepth2实战KITTI深度估计&#xff0c;详解自动掩码与最小重投影损失 深度估计是计算机视觉领域的一项基础任务&#xff0c;它试图从2D图像中恢复出3D场景的几何信息。在自动驾驶、机器人导航、增强现实等应用中&#xff0c;准确的深度感知至关重…...

新手零压力入门,快马ai带你三步搞定nodejs环境配置

最近在帮几个朋友入门Node.js时&#xff0c;发现很多新手卡在了环境配置这一步。作为一个过来人&#xff0c;我完全理解那种面对命令行手足无措的感觉。好在现在有了InsCode(快马)平台&#xff0c;可以快速生成一个专为Node.js新手设计的入门项目模板&#xff0c;把抽象的配置过…...

C语言编程基础与核心概念详解

1. C语言入门基础解析C语言作为编程世界的基石语言&#xff0c;其简洁高效的特性使其在系统编程、嵌入式开发等领域占据不可替代的地位。我第一次接触C语言是在大学计算机系的实验室里&#xff0c;那个打印出"Hello World"的瞬间至今记忆犹新。让我们从最基础的部分开…...

Java基础实战:用快马平台快速构建学生成绩管理系统巩固核心知识

最近在复习Java基础知识&#xff0c;发现光看理论很容易遗忘&#xff0c;于是决定通过一个小项目来巩固核心概念。这个简易学生成绩管理系统虽然功能简单&#xff0c;但涵盖了Java基础的多个重要知识点&#xff0c;特别适合像我这样的初学者练手。 项目整体设计思路 首先考虑…...

广告防欺诈与广告验证:住宅代理如何帮助监测点击欺诈

广告欺诈正在持续侵蚀企业的广告预算&#xff0c;并导致数据分析结果失真。常见形式包括点击欺诈、虚假流量以及域名伪造&#xff0c;这些问题使广告主难以准确评估真实投放效果。在实际业务中&#xff0c;如何获取“接近真实用户视角”的广告数据&#xff0c;成为广告验证的关…...