异步架构,避免相互依赖的系统耦合

news2025/1/22 19:41:45

前言:

使用缓存架构可以减少不必要的计算,快速响应用户请求,但是缓存只能改善系统的读操作性能,也就是在读取数据的时候,可以不从数据源中读取,而是通过缓存读取,以加速数据的读取速度。

但是对于写操作,缓存是无能为力的,虽然缓存的写入速度也很快,但是通常情况下,不能把用户提交的数据直接写入到缓存当中,因为缓存通常被称为一种不可靠的存储,缓存通常无法保证数据的持久性和一致性等这些数据存储的基本要求,因此数据写入操作还是需要写入到RDBMS或者NoSql数据库中,但是数据库操作通常都比较慢。

两个应用系统之间需要远程传递数据,常规的做法就是直接进行远程的调用,用HTTP或者其他RMI方式进行远程的调用,但是这种方式其实是把两个应用耦合起来了,被调用应用产生了故障或者升级,都可能会引起调用者故障,或者也不能不升级处理。

事件驱动架构:

使用消息队列实现异步架构:

消息队列实现异步架构是目前互联网应用系统中一种典型的架构模式,所谓异步架构是和同步架构相对应的,同步架构是说,当应用程序调用服务的时候,当前程序需要阻塞等待服务完成,返回服务结果后才能继续向下执行。

应用程序代码ClientCode需要发送邮件,调用接口服务EmailService,实现了EmailService接口的SmtpEmailAdapter通过SMTP协议与远程服务器进行通信,远程邮件服务器可能有很多的邮件在等待发送,当前邮件可能要等待较长时间才能发送成功,发送成功后再通过远程通信返回结果给应用程序。

在这个过程中,当远程服务器发送邮件的时候,应用程序必须阻塞等待,准确的说,是执行应用程序代码的线程被阻塞,这种阻塞,一方面导致线程不能释放被占用的系统资源,导致系统资源不足,影响系统性能。另一方面也导致线程不能无法快速给用户返回响应结果,用户体验较差,此外,如果远程服务器出现异常,这个异常会传递给应用程序ClientCode,如果应用程序没有妥善处理好这个异常,就会导致整个请求处理失败。

事实上,在大部分应用场景下,发送邮件是不用得到发送结果的,比如用户笧的时候,发送账户的激活邮件,无论邮件是否发送成功了,都可以给用户返回,“激活邮件已经发送,请接收邮件并且进行激活处理”。如果发送失败,只需要提示用户“点击重新发送邮件”。

应用程序ClientCode调用EmailService的时候,EmailService将请求封装成一个邮件发送消息个消息队列,然后就直接返回了,应用程序收到返回以后就可以继续执行,快速完成用户响应,释放系统的资源

而发送消息队列的邮件发送消息,则会被一个专门的消息队列消费者程序,QueueConsumer消费掉,这个消费者通过SmtpEmailAdapter调用远程服务器,完成邮件的发送。如果远程服务处理异常,这个异常只会被传递给消费者程序QueueConsumer,而不会影响到应用程序。

消息队列异步架构的主要角色包括消息生产者,消息队列和消息消费者。消息生产者通常就是主应用程序,生产者将请求封装成消息发送个消息队列。此外还需要开发一个专门的消息消费者程序,用来从消息队列中获取、消费消息,由消息消费者完成业务逻辑的处理。

消息队列的作用就是缓冲消息,等待消费者消费,根据消息消费的方式分为点对点模式和发布订阅模式两种。

点对点模式:

在点对点模式中,多个消息生产者向消息队列发送消息,多个消息消费者消费消息,每个消息只会被一个消息消费者消费。

发布订阅模式:

开发者可以在消息队列中设置主题,消息生产者的消息按照主题进行发送,多个消息消费者可以订阅同一个主题,每个消费者都可以收到这个主题的消息拷贝,然后按照自己的业务逻辑分别进行处理计算。

消息生产者向消息队列某个主题发布消息m,多个消息消费者订阅主题,就会分别收到这个消息。典型场景就是新用户注册,新用户注册的时候一方面需要发送激活邮件,另一个方面可能还需要发送欢迎短信,还可能需要将用户信息同步给关联用户,当然还需要将用户信息保存到数据库中。

这种场景也可以用点对点的模式,由应用程序,也就是消息生产者构造发送邮件的消息,发送到邮件消息队列,以及构造短信消息,构造新用户消息,构造数据库消息分别发送到相关消息队列中,然后由对应的消息消费者程序分别获取消息进行处理。

但是处理的方式使用订阅模式。在消息队列中创建“新用户注册”主题,应用程序只需要发布包含新用户注册数据的消息到该主题中,相关消费者再订阅该主题即可,不同消费者都订阅该主题,得到新用户注册消息,然后根据自己的业务逻辑从消息中获取相关的数据,进行处理。

发布订阅模式下,一个主题可以被重复订阅,所以如果需要扩展功能,可以在当前的生产者和消费者都没有影响的前提下,增加新的消费者订阅同一个主题即可。

消息队列异步架构的优点:

降低耦合性:

使用消息队列实现异步架构可以解决系统耦合的问题,实现更高的写操作性能以及更低的耦合性。

改善写操作请求的响应时间:

使用消息队列,生产者应用程序只需要将消息发送到消息队列之后,就可以继续向下执行了,无需等待耗时的消息消费处理,也就是说,可以更快速的完成请求处理操作,快速响应用户。

更容易的伸缩:

应用程序可以通过负载均衡进行集群的伸缩,以整个应用服务器为单位,如果只是其中某些功能有负载压力,比如说当用户上传图片,需要对图片进行识别、分析、压缩等一些比较耗时的计算操作,需要伸缩整个应用服务器集群。

削峰填谷:

互联网应用的访问压力随时都在变化,系统的访问高峰和低谷的并发压力可能也有非常大的差距。如果按照压力最大的情况部署服务器集群,那么服务器在绝大部分时间内都处于闲置状态,但是利用消息队列,可以将需要处理的消息放入消息队列中,而消费者可以控制消费的速度,因此能够降低系统访问的高峰压力,而在访问低谷的时候,可以继续消费消息队列中未处理的消息,保持系统的资源利用率。

隔离失败:

使用消息队列,生产者发送消息到消息队列后就可以继续自己后面的计算,消费者如果在处理消息的过程中失败了,不会传递给生产者,应用程序具有更高的可用性。

小结:

消息队列实现异步架构是改善互联网应用写操作性能的重要手段,也是一种低耦合,易扩展的分布式应用架构模式,但是使用这种架构也要注意些事项。

比如说:消费者程序可能没有完成用户请求的操作,上面发送邮件的例子,消费者程序发送邮件的时候可能遇到各种问题,从而导致未完成邮件的发送。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vulnhub DC系列 DC-6

总结:wpscan爆破,nmap提权 下载地址 DC-6.zip (Size: 619 MB)Download: http://www.five86.com/downloads/DC-6.zipDownload (Mirror): https://download.vulnhub.com/dc/DC-6.zip使用方法:解压后,使用vm直接打开ova文件。 漏洞分析 信息收集 这里还是使…

4. 数据处理:用R语言实现【多路替换】真高效!!

b站课程视频链接: https://www.bilibili.com/video/BV19x411X7C6?p1 腾讯课堂(最新,但是要花钱,我花99😢😢元买了,感觉讲的没问题,就是知识点结构有点乱):https://ke.qq…

Linux中的vim最小集、指令集及其配置

目录 1. vim 最小集 2 vim指令集 2.1 命令模式的指令 2.1.1 插入模式 2.1.2 移动光标 2.1.3 删除文字 2.1.4 复制 2.1.5 替换 2.1.6 撤销 2.1.7 更改 2.1.8 跳至指定的行 2.1.9 shift ~:快速大小写切换 2.2 末行模式的指令 2.2.1 set nu/set nonu 2.2.2 vs file…

【自学Python】Python变量

Python变量 Python变量教程 不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位。变量相当于内存中一个数据存储空间的表示,通过变量名可以访问到变量的具体的值。 Python变量 Python 是弱类型语言,因此 Python 变量无须声…

Hudi的核心概念 —— 时间轴(TimeLine)

文章目录时间轴(TimeLine)时间轴(TimeLine) 就是一个时间线,它的每一个操作都记录在内,每一个时刻,你做了什么事情,对某一个时刻,记录一个时刻的数据 Hudi 的核心是维护…

擎创运维大数据治理解决方案,荣膺金融业数字化转型突出贡献奖

近日,由《金融电子化》杂志社主办的“2022中国金融科技年会暨第十三届金融科技应用创新奖颁奖典礼”成功于线上举办。擎创科技“运维大数据治理解决方案”,荣膺“2022科技赋能金融业数字化转型突出贡献奖”。人民银行《金融科技发展规划(2022…

C++ string类

在c语言中&#xff0c;我们想要记录字符串需要创建一个字符串的数组&#xff0c;而c则提供了另一种方式&#xff1b; 也就是这篇博客所说的string类&#xff1b; string类 #include<string> 作为字符串数组的升级版&#xff0c;string类自然也有它的独特之处——可变长数…

自动驾驶标定基础知识

目录基础概念1. 缩略语2. 为什么需要外参标定3. 基于使用场景的标定分类4. 基于方法的分类5. 基础坐标系6. 超差EOL标定1.EOL特点2. EOL标定流程3. EOL标定软件约束4. EOL标定软件流程5. 算法设计原则6. 算法基本原理背景式标定1.背景式标定的特点2. 背景式标定运行流程3. 背景…

高级树结构之线索化二叉树

文章目录一 线索化二叉树简介二 线索化规则三 前序线索化3.1 代码演示四 中序线索化4.1 代码演示五 后序线索化5.1 代码演示一 线索化二叉树简介 线索化&#xff1a;将一颗二叉树的结点指向为空的指针&#xff0c;线索化为某一种顺序遍历的的指向下一个按顺序的结点的指针一颗…

虚拟主机3种方式nginx/apache+跨域知识点整理

目录referer、prototype、array、json笔记整理: [http://t.csdn.cn/s4P8x](http://t.csdn.cn/s4P8x)虚拟主机3种方式nginx/apache跨域知识点整理一、Apache基于多IP、多端口、多域名访问1、添加网卡三种方法1、虚拟机添加网络适配器2、命令添加3、用nmtui 添加ip地址2、添加配置…

Jwt 最流行的跨域身份验证解决方案

1. 什么是JWT JSON Web Token (JWT)是一个开放标准(RFC 7519)&#xff0c;它定义了一种紧凑的、自包含的方式&#xff0c;用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任&#xff0c;因为它是数字签名的。 JWT被设计为紧凑且安全的&#xff0c;特别适用于分…

Python制做一个电脑通知小工具,再也不怕忘记事情拉~

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ Windows不是有个消息通知功能&#xff0c;挺喜欢这个功能的&#xff0c; 但是不太方便使用&#xff0c;也懒得去研究&#xff0c; 于是准备用Python自己写一个&#xff0c;通过设定通知的间隔时…

Pikachu靶场暴力破解通关

目录 字典获取 BP四种攻击模式 一、Sniper(狙击手模式) 二、Battering ram(攻城锤模式) 三、Pitchfork(叉子模式) 四、Cluster bomb(炸弹模式) 靶场练习 基于表单的暴力破解 验证码绕过(on server) 验证码绕过(on client) token防爆破? 字典获取 在github里找到心…

公司注册商标的流程是什么

公司商标注册流程是什么? 1、商标查询。查询有关商标登记注册情况&#xff0c;以了解自己准备申请注册的商标是否与他人已经注册或正在注册的商标相同或近似的程序; 2、申请文件准备。商标注册申请书;)商标图样;申请注册集体商标、证明商标的&#xff0c;应当提交申请人主体资…

发布了一个jar包到中央仓库,我的心好累…

原创&#xff1a;微信公众号 码农参上&#xff0c;欢迎分享&#xff0c;转载请保留出处。 哈喽大家好啊&#xff0c;我是Hydra。 前几天我在网上冲浪的时候&#xff0c;看见有一个老铁在git上给我提了一个issue&#xff1a; 万万没想到&#xff0c;有一天我写的烂代码居然也会…

家庭装修流程五大步骤是怎样的,家庭装修有什么注意事项!

家庭装修流程五大步骤是怎样的家庭装修有什么注意事项&#xff01;现在的人们不是在城里面购买了楼房&#xff0c;就是在家里面进行翻修房子&#xff0c;不管是哪一种&#xff0c;都肯定是需要用到装修的。但是有很多的人们对于装修方面并不是很了解。想知道家庭装修流程五大步…

Qt之对话框(QDialog)

文章目录一、对话框的概念二、与QWidget的区别三、对话框2种显示方法四、对话框返回值的概念本节示例提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、对话框的概念 对话框是和用户简短交互的一种窗口。如&#xff1a;登录界面&#xff0c;关于界面…

性能-可观测数据、量化指标、性能问题、压测目标

可观测的数据数据指标 服务应用&#xff1a;CPU利用率、内存、ygc次数接口&#xff1a;核心关注接口的请求响应时间&#xff08;平均响应时间、P90、P95&#xff0c;核心关注后面2个&#xff09;、慢请求情况数据库&#xff1a;主要关注CPU使用率、内存使用率Redis&#xff1a…

前端组件库自定义主题切换探索-02-webpack-theme-color-replacer webpack 的实现逻辑和原理-01

本文来研究写webpack-theme-color-replacer webpack 的实现逻辑和原理。 上一篇我们讲过&#xff0c; webpack-theme-color-replacer webpack 基本思路就是&#xff0c;webpack构建时&#xff0c;在emit事件&#xff08;准备写入dist结果文件时&#xff09;中&#xff0c;将即将…

Linux ALSA 之五 ALSA Proc Info

ALSA Proc Info一、概述二、Proc Files of Alsa Driver1、/proc/asound/xxx 简述2、创建 /proc/asound 目录树2.1 /proc/asound/version 文件2.2 /proc/asound/devices 文件2.3 /proc/asound/cards 文件2.4 /proc/asound/cardx 目录2.5 /proc/asound/pcm 文件一、概述 Linux系…