SpringCloud-同步异步通讯比较

本文详细探讨了同步通讯和异步通讯在信息传递中的区别,以及它们分别带来的优势和不足。通过对支付流程的案例分析,突显了同步通讯可能面临的阻塞和服务依赖问题,而异步通讯通过引入事件驱动模式和消息代理(Broker)成功解决了这些挑战,实现了服务解耦、性能提升和流量削峰。然而,异步通讯也并非没有考验,对消息代理可靠性的依赖和系统架构的复杂性都是需要仔细权衡的因素。在实际应用中,选择采用同步通讯还是异步通讯应当根据具体的业务场景和需求,以最优方式满足系统的通讯要求。


一、同步通讯的优点和问题

1、同步通讯介绍

同步通讯是指在进行信息交流时,发送者和接收者在数据传输的过程中需要保持一致的时间步调,即发送者发出数据后需要等待接收者完成对数据的处理,然后再进行下一步操作。

如图所示,支付完成后,支付服务需要依次请求订单服务、仓储服务、短信服务等等,需要等待上一个服务提供者的响应才可以走到下一个服务提供者,而且一旦遇到一个服务出问题,会导致整个流程都出现问题。


2、同步通讯的优点

优点详细描述
可靠性高由于发送者和接收者的操作是同步进行的,可以更容易地确保数据的正确传递和处理,减少数据丢失或错误的可能性。
简单明了同步通讯模型相对来说较为简单,易于理解和实现。这使得在一些简单的应用场景中更容易使用和维护。
控制灵活通过同步机制,可以更好地控制数据的流动和处理流程,适用于一些需要强调顺序和精确控制的场景。

3、同步调用的问题

微服务间基于Feign的调用就属于同步方式,存在一些问题。

  • 耦合度高,每次加入新的需求都要修,导致资源浪费。

  • 调用链中的每个服务在等待响应过程中不能释放请求占用的资源,高并发场景下性能下降,会极度浪费系统资源。

  • 级联失败会导致调用者需要等待服务提供者的响应。如果服务提供者出现问题,所有调用方都会跟着出问题。

  • 如果调用链过长,则响应时间等于每次调用的时间之和。如同多米诺骨牌一样,迅速改原来的代码会导致整个微服务群故障。


二、异步通讯的优点和问题

1、异步通讯介绍

异步调用常见实现就是事件驱动模式。

如下图,支付服务在完成支付以后,需要订单服务、仓储服务、短信服务各自完成自己的业务。

但是与同步调用不同,我们现在是事件儿驱动模式,不会像之前那样由支付服务来调用这三个服务,而是引入了一个东西叫 Broker(消息代理)。

当用户支付成功时,即触发一个特定事件。这个事件随后由我们的消息代理(broker)进行管理。订单服务、仓储服务和短信服务会向消息代理注册,以表达对支付成功事件的关注,并请求在事件发生时得到通知。这种机制被称为事件代理。

在订阅方面,一旦成功完成订阅,支付服务在未来检测到有用户支付成功时,将发布一个事件,宣告有人支付了,订单号为1001。消息代理随即发出通知,将消息传递给订单服务、仓储服务和短信服务。订单服务会立即响应,更新订单状态;仓储服务负责完成库存扣减和发货;而短信服务则负责发送相应的短信通知。

整个过程通过事件代理实现,确保各服务在业务事件发生时能够协同工作。


2、异步通讯的优点

优点详细描述
服务解耦异步通讯能够实现服务之间的松耦合,使得各个服务能够独立演进,降低彼此之间的依赖性。
性能提升吞吐量提高,异步通讯可以提高系统的性能,通过异步处理消息,服务能够并行执行,从而提高整体吞吐量。
无强依赖服务没有强依赖,不担心级联失败问题。异步通讯使得服务之间没有强依赖关系,不同服务的失败不会直接影响到其他服务,降低了级联失败的风险。
流量削峰异步通讯可以帮助应对突发性的高流量,通过消息队列缓冲和异步处理,实现流量的平滑削峰,避免系统因瞬时高负载而崩溃。

3、步调用的问题

  • 依赖于Broker的可靠性、安全性、吞吐能力: 异步通讯架构中的消息队列作为Broker,其可靠性、安全性和吞吐能力直接影响整个系统。如果消息队列出现故障或不稳定,可能导致消息传递的延迟或丢失。

  • 架构复杂了,业务没有明显的流程线,不好追踪管理: 异步通讯引入了消息队列和异步处理机制,使得系统架构更加复杂。由于消息的异步传递,业务流程线不再直观,可能导致追踪和管理业务流程的困难,特别是在故障排查和调试时。


三、同异步通讯总结

同步通讯在信息传递中要求发送者和接收者保持一致的时间步调,虽然简单直观,但容易面临服务依赖、阻塞等问题,尤其在微服务架构中可能导致级联失败。相反,异步通讯以事件驱动模式和消息代理的方式解决了同步通讯的局限性,实现了服务解耦、性能提升和流量削峰。然而,异步通讯也伴随着对消息代理可靠性和系统架构复杂性的挑战。

在实际应用中,选择采用同步通讯还是异步通讯需根据具体的应用场景和需求,平衡各自的优缺点。同步通讯适用于简单的、直观的业务流程,而异步通讯则更适合复杂的、高并发的系统,尤其在需要实现松耦合、提高系统性能、处理大量并发请求的场景中表现出色。因此,综合考虑业务特点和系统要求,合理选择通讯方式对于构建可靠、高效的分布式系统至关重要。

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

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

相关文章

SQL Server 开发环境配置教程(SSMS+SQL Prompt)

背景 记录一下 SQL Server 常用开发软件 体验了各种数据库IDE(DBeaver、Navicat、DataGrip)之后综合下来还是感觉 SSMSSQL Prompt 对于 SQL Server 最好用,所以在此记录一下配置过程 数据库可视化管理工具SSMS 官方下载地址: https://learn.microsoft…

Java基础数据结构之栈

一.什么是栈 栈是一种特殊的线性表,它只允许在固定的一端进行元素的添加与使用,且遵循先进后出的原则。添加取用元素的一端称为栈顶,另一端称为栈底。出栈和入栈都是操作栈顶元素 二.栈的模拟实现 栈的底层是一个数组 这是里面的成员变量以…

智能汽车加速车规级存储应用DS2431P+TR 汽车级EEPROM 存储器IC

DS2431PT&R是一款1024位1-Wire EEPROM芯片,由四页存储区组成,每页256位。数据先被写入一个8字节暂存器中,经校验后复制到EEPROM存储器。该器件的特点是,四页存储区相互独立,可以单独进行写保护或进入EPROM仿真模式…

ssm172旅行社管理系统的设计与实现

** 🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅** 一 、设计说明 1.1 研究…

day03-Vue-Element

一、Ajax 1 Ajax 介绍 1.1 Ajax 概述 概念:Asynchronous JavaScript And XML,异步 的 JavaScript 和 XML。 作用: 数据交换:通过 Ajax 可以给服务器发送请求,并获取服务器响应的数据。异步交互:可以在 不…

Java教程:SpringBoot项目如何对接Nacos实现服务发现治理,配置管理

–Nacos大家都知道,不懂的可以去官网或者网上查阅一下,本次给大家讲解一下如何在SpringBoot项目中引入Nacos服务来进行服务治理与发现,配置管理等,在微服务当中是必不可少的,各个模块之间可以通过Feign远程调用&#x…

物联网主机:为智能交通赋能

物联网(IoT)技术的发展为智能交通领域带来了许多创新的解决方案。而在物联网应用中,物联网主机起着关键的作用。本文将为大家介绍一款名为E6000的物联网主机,它是一种多协议、多接口的物联网主机,为智能交通系统的建设…

antvX6 - Vue自定义节点,并实现多种画布操作,拖拽、缩放、连线、双击、检索等等

一、 首先 antv x6 分为两个版本 低版本和高版本 我这里是使用的2.0版本 并且搭配了相关插件 例如:画布的图形变换、地图等 个人推荐 2.0版本,高版本配置多,可使用相关插件多,但是文档描述小,仍在更新, 低…

装饰器模式 详解 设计模式

装饰器模式 它允许你在不改变对象结构的情况下,动态地将新功能附加到对象上。 结构: 抽象组件(Component):定义了原始对象和装饰器对象的公共接口或抽象类,可以是具体组件类的父类或接口。具体组件&…

如何在群晖Docker运行本地聊天机器人并结合内网穿透发布到公网访问

文章目录 1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址 随着ChatGPT 和open Sora 的热度剧增,大语言模型时代,开启了AI新篇章,大语言模型的应用非常广泛,包括聊天机…

C# Socket通信从入门到精通(21)——TCP发送文件与接收文件 C#代码实现

1、前言 我们在开发上位机软件的过程中经常需要发送文件,本文就是介绍如何利用tcp客户端发送文件、tcp服务器端接收文件,而且本文介绍的方法可以自动发送一个文件夹下的所有子目录以及所有文件,经验来自于实际项目,具备非常有价值的参考意义! 2、发送文件以及C#代码 被发…

低密度奇偶校验码LDPC(八)——QC-LDPC译码器FPGA设计概要

往期博文 低密度奇偶校验码LDPC(一)——概述_什么是gallager构造-CSDN博客 低密度奇偶校验码LDPC(二)——LDPC编码方法-CSDN博客 低密度奇偶校验码LDPC(三)——QC-LDPC码概述-CSDN博客 低密度奇偶校验码…

node.js 用 xml2js.Parser 读 Freeplane.mm文件,生成测试用例.csv文件

Freeplane 是一款基于 Java 的开源软件,继承 Freemind 的思维导图工具软件,它扩展了知识管理功能,在 Freemind 上增加了一些额外的功能,比如数学公式、节点属性面板等。 编写 mm_xml2js_csv.js 如下 // 用 xml2js.Parser 读 F…

javaWebssh票据管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh票据管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模 式开发。开发环境为TOMCAT7.0,My…

C++ 快速排序快速选择

目录 1、75. 颜色分类 2、912. 排序数组 3、 215. 数组中的第K个最大元素 4、LCR 159. 库存管理 III 1、75. 颜色分类 思路:利用快速排序思路,使用三指针分块进行优化。 [0,left]——小于key[left1,right-1]——等于key[right,nums.size()]——大于k…

博途PLC 面向对象系列之“输送带控制功能块“(SCL代码)

这篇是面向对象系列之"输送带功能块"的封装,面向对象是系列文章,相关链接如下: 1、面向对象系列之找"对象" https://rxxw-control.blog.csdn.net/article/details/136150027https://rxxw-control.blog.csdn.net/article/details/1361500272、面向对象…

LeetCode 刷题 [C++] 第215题.数组中的第K个最大元素

题目描述 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 题目分析 根据题意分析&…

CleanMyMac X2024一款专为Mac用户设计的优化工具

亲爱的用户们,我们都知道电脑在长时间使用后会变得越来越慢,垃圾文件和无用的应用程序会占用我们的硬盘空间,让我们的电脑变得像蜗牛一样慢。但是,现在有一个解决方案可以让你的电脑重获新生,那就是CleanMyMac X&#…

第七十一天 漏洞发现-Web框架中间件联动GobyAfrogXrayAwvsVulmap

第71天 漏洞发现-Web框架中间件&联动&Goby&Afrog&Xray&Awvs&Vulmap 知识点: 1、Bup简单介绍&使用说明 2、Xray简单介绍&使用说明 3、AWWS简单介绍&使用说明 4、Goby简单介绍&使用说明 5、Afrog简单介绍&使用说明 6、…

泰迪智能科技企业数据挖掘平台使用场景

企业数据挖掘平台助力企业数据挖掘,数据挖掘平台也在多个领域发挥着重要的作用。 企业数据挖掘平台具有数据抓取、数据清洗、数据分析、机器学习等多项功能,广泛应用于企业的各个领域,包括:金融行业、医疗行业、交通领域、教育、制…