详解:JS的四种异步解决方案之分布/订阅,及其利弊。

上期讲了详解:JS异步解决方案之分布/订阅,及其弊端,原文链接在文章后面,分布/订阅是异步的一种方式而已,本期讲解第六个方案。

一、什么是分布/订阅

分布/订阅(Publish/Subscribe)是一种软件架构模式,用于实现组件之间的解耦和异步通信。

在分布/订阅模式中,组件分为两个角色:发布者(Publisher)和订阅者(Subscriber)。发布者负责发布消息或事件,而订阅者负责订阅感兴趣的消息或事件。

在分布/订阅模式中,发布者和订阅者之间不直接通信,而是通过调度中心或消息队列来进行消息的传递和分发。发布者只需将消息发布到调度中心或消息队列中,而不需要关心具体的订阅者是谁。订阅者只需订阅感兴趣的消息或事件,并在调度中心或消息队列接收到相关消息时进行处理。


二、角色和步骤

具体来说,分布/订阅模式包含以下几个组件:

  1. 发布者(Publisher):负责发布事件,通常是某个对象或函数。
  2. 订阅者(Subscriber):负责订阅事件,通常是某个函数或方法。
  3. 事件(Event):表示某个状态或动作,可以是任何类型的数据。
  4. 调度中心(Event Bus):负责管理事件和订阅者之间的关系,通常是一个全局对象或单例。

在分布/订阅模式中,发布者通过调度中心发布事件,订阅者通过调度中心订阅事件,当事件被发布时,调度中心会通知所有订阅者执行相应的处理函数。


三、示例代码

下面是一个简单的分布/订阅模式的示例:

// 定义调度中心
const eventBus = {handlers: {},subscribe(event, handler) {if (!this.handlers[event]) {this.handlers[event] = []}this.handlers[event].push(handler)},publish(event, data) {if (this.handlers[event]) {this.handlers[event].forEach(handler => handler(data))}}
}// 定义发布者
const publisher = {publishData() {const data = { message: 'Hello, World!' }eventBus.publish('data', data)}
}// 定义订阅者
const subscriber = {handleData(data) {console.log(data.message)}
}// 订阅事件
eventBus.subscribe('data', subscriber.handleData)// 发布事件
publisher.publishData() // 输出:Hello, World!

在上面的示例中,调度中心使用一个对象来存储事件和对应的处理函数,订阅者通过调用subscribe方法来订阅事件,发布者通过调用publish方法来发布事件。当事件被发布时,调度中心会遍历所有订阅该事件的处理函数并执行。


四、优缺点和适用场景

分布/订阅(Publish/Subscribe)模式具有以下优点、缺点和适用场景:

优点:

  1. 解耦性:发布者和订阅者之间通过调度中心进行通信,彼此之间不直接依赖,从而实现了解耦。发布者和订阅者可以独立进行开发和维护,更容易扩展和修改。
  2. 可扩展性:由于发布者和订阅者之间解耦,可以方便地增加新的发布者和订阅者,而不需要修改现有的代码。
  3. 灵活性:发布者可以同时向多个订阅者发布消息,实现消息的广播和多路复用。订阅者可以选择订阅感兴趣的消息,忽略其他消息,提高系统的灵活性。

缺点:

  1. 调度中心的性能压力:调度中心或消息队列扮演着中间人的角色,负责接收、分发和存储消息。如果消息量很大,调度中心的性能可能成为瓶颈,需要进行优化或使用分布式消息队列来解决。
  2. 系统复杂性增加:引入调度中心或消息队列会增加系统的复杂性,需要额外的开发和维护工作。同时,需要保证调度中心或消息队列的可靠性和高可用性,以确保消息的可靠传递和处理。

适用场景:

  1. 异步通信:当发布者和订阅者之间需要进行异步通信时,可以使用分布/订阅模式。例如,当一个组件的操作可能需要较长时间才能完成,而其他组件需要在操作完成后进行相应的处理时,可以使用分布/订阅模式来实现异步通信。
  2. 多对多通信:当一个消息需要被多个订阅者接收和处理时,可以使用分布/订阅模式。例如,一个事件发生后需要通知多个组件进行相应的处理,可以使用分布/订阅模式来实现多对多通信。
  3. 松耦合和可扩展性要求高:当系统需要具有松耦合和可扩展性的特点时,可以使用分布/订阅模式。发布者和订阅者之间不直接依赖,可以独立进行开发和维护,更容易扩展和修改。

总之,分布/订阅模式适用于需要解耦、异步通信和多对多通信的场景,能够提高系统的灵活性和可扩展性。但需要注意调度中心的性能和系统的复杂性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/576889.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息流广告一键跳转企微,这个效果是怎么做的?

在数字化营销的浪潮之下,抖音巨量广告已然成为企业追求高效转化、扩大品牌影响力的得力助手。然而,如何将这些在抖音上活跃的潜在用户成功引流至企业微信,建立起稳定的私域流量池,一直是众多企业面临的挑战。现在,有了…

使用LLaVA模型实现以文搜图和以图搜图

本文将会详细介绍如何使用多模态模型——LLaVA模型来实现以文搜图和以图搜图的功能。本文仅为示例Demo,并不能代表实际的以文搜图和以图搜图的技术实现方案。 1、实现原理 使用多模态模型获取图片的标题和详细描述以文搜图功能:使用ES实现查询匹配&…

在线构建自动部署软件JPOM

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 简而轻的低侵入式在…

【Python函数和类2/6】函数的参数

目录 目标 为函数设置参数 传递实参 关键字实参 关键字实参的顺序 位置实参 常见错误 缺少实参 位置实参的顺序 默认值形参 参数的优先级 默认值形参的位置 总结 目标 上篇博客中,我们在定义函数时,使用了空的括号。这表示它不需要任何信息就…

课堂练习:环境体验——1、 Linux 文件目录

任务描述 欢迎进行Linux世界,当你下载、安装了某个Linux发行版,体验了Linux桌面并安装了一些你喜爱和需要的软件之后,应该去了解下Linux真正的魅力所在:命令行。 每一个Linux命令其实就是一个程序,借助这些命令&#…

uniapp 使用命令行创建vue3 ts 项目

命令行创建 uni-app 项目: vue3 ts 版 npx degit dcloudio/uni-preset-vue#vite-ts 项目名称注意 Vue3/Vite版要求 node 版本^14.18.0 || >16.0.0 如果下载失败,请去gitee下载 https://gitee.com/dcloud/uni-preset-vue/repository/archive/vite-ts…

ES学习日记(五)-------插件head安装

接上回,必要的git和node已经装完了,现在开始装head 回到es集群项目里找到plugins(插件文件夹下), 存在安装在plugins启动es报错的情况,报错信息如图一,解决方案就是换个目录,不要放在plugin目录下 git clone https://github.com/mobz/elasticsearch-head.git 打开远程登陆,默…

【微服务】Sentinel(流量控制)

文章目录 1.基本介绍1.Sentinel是什么2.Sentinel主要特性3.Sentinel核心功能1.流量控制2.熔断降级3.消息削峰填谷 4.Sentinel两个组成部分 2.Sentinel控制台显示1.需求分析2.下载3.运行1.进入cmd2.输入java -jar sentinel-dashboard-1.8.0.jar3.查看默认端口8080 4.访问1.账号和…

同元软控专业模型库系列——机械篇

01 引言 卫星太阳帆在轨展开、C919大飞机起飞降落、机器人自主行走、汽车自如转向飞驰......在航天、航空、工业机械、车辆、船舶等众多行业中,我们可以看到各种机械应用的身影。 近些年,随着装备数字化和人工智能技术的迅速发展,世界装备制…

【61-80】计算机网络基础知识(非常详细)从零基础入门到精通,看完这一篇就够了

【61-80】计算机网络基础知识(非常详细)从零基础入门到精通,看完这一篇就够了 以下是本文参考的资料 欢迎大家查收原版 本版本仅作个人笔记使用61、 四次挥手相关内容62、挥手为什么需要四次?63、2MSL等待状态?64、四次…

硬件10、从网站获取封装

百度搜索IC封装网或者网址https://www.iclib.com/ 搜索想要的器件,直接下载他的原理图库和封装库

【单调栈】【网格】【柱图面积】85. 最大矩形

作者推荐 视频算法专题 本文涉及的基础知识点 单调栈分类、封装和总结 网格 LeetCode85. 最大矩形 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 示例 1: 输入:…