SpringCloud-同步异步通讯比较

news2024/11/13 12:52:37

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


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

1、同步通讯介绍

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

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


2、同步通讯的优点

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

3、同步调用的问题

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

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

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

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

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


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

1、异步通讯介绍

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

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

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

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

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

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


2、异步通讯的优点

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

3、步调用的问题

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

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


三、同异步通讯总结

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

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

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

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

相关文章

HarmonyOS-卡片事件能力说明

卡片事件能力说明 ArkTS卡片中提供了postCardAction()接口用于卡片内部和提供方应用间的交互,当前支持router、message和call三种类型的事件,仅在卡片中可以调用。 接口定义:postCardAction(component: Object, action: Object): void 接口…

QPS 提升 10 倍!滴滴借助 StarRocks 物化视图实现低成本精确去重

作者:滴滴 OLAP 开发工程师 刘雨飞 小编导读: 滴滴于 2022 年引入了 StarRocks。经过一年多的努力,StarRocks 逐渐替代了原有技术栈,成为滴滴内部主要的 OLAP 引擎。截至 2023 年 12 月,滴滴已经成功建立了超过 40 个 …

STM32------分析GPIO寄存器

一、初始LED原理图 共阴极led LED发光二极管,需要有电流通过才能点亮,当有电压差就会产生电流 二极管两端的电压差超过2.7v就会有电流通过 电阻的作用 由于公式IV/R 不加电阻容易造成瞬间电流无穷大 发光二极管工作电流为10-20MA 3.3v / 1kΩ 3.…

MariaDB MaxScale实现mysql8读写分离

目录 1.MaxScale 是干什么的? 2.MaxScale 实验环境 3.实现数据库主从复制 4.创建用户 1) 创建监控用户 2) 创建路由用户 5.docker 安装MaxScale 6.配置maxscale 使用 maxctrl list servers 命令查看运行状态 查看注册服务 使用 maxctrl list listeners Read-…

Javaweb之SpringBootWeb案例之自动配置以及常见方案的详细解析

3.2 自动配置 我们讲解了SpringBoot当中起步依赖的原理,就是Maven的依赖传递。接下来我们解析下自动配置的原理,我们要分析自动配置的原理,首先要知道什么是自动配置。 3.2.1 概述 SpringBoot的自动配置就是当Spring容器启动后&#xff0c…

查看cuda和cudnn版本

查看cuda 打开命令提示符(Windows键 R,然后输入cmd并回车)。输入nvcc --version或者nvcc -V来获取Cuda的版本信息。 查看cudnn版本 查看Cudnn版本: 进入Cuda安装目录,通常位于C:\Program Files\NVIDIA GPU Computi…

网络卡顿是怎么回事?

网络卡顿是指在网络通信过程中,数据传输出现延迟或中断,导致用户在使用网络时出现卡顿、延迟或不流畅的情况。例如:系统响应时间长,网页加载速度慢;视频或游戏掉帧,导致画面卡顿或不流畅;音视频…

windows系统安装《植物大战僵尸2009原版》教程

本文演示如何在windows免费安装 植物大战僵尸2009原版。 首先到 点此下载安装包 此页面最末端下载百度网盘分享的安装包。 下载完成后安装如下步骤进行安装: 安装完成即可开心的玩耍啦! 我自己的安装过程录屏在这里 https://www.bilibili.com/vid…

信号系统之快速傅里叶变换

1 使用复数DFT的实数DFT 本文的主题,如何使用 FFT 计算真正的 DFT? 由于 FFT 是一种用于计算复数 DFT 的算法,因此了解如何将实数 DFT 数据输入和输出复数 DFT 格式非常重要。图 12-1 比较了实数 DFT 和复数 DFT 存储数据的方式。实数 DFT …

vue自定义实现icon选择器

<template> <div> <span class"iconStyle" click"selectIcon"> <i :class"value" /> </span> <div class"iconTitle">选择图标</div> <el-dialog title"" :visible.sync"…

一周学会Django5 Python Web开发-会话管理(CookiesSession)

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计26条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

力扣:9. 回文数

力扣&#xff1a;9. 回文数 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如&#xf…

jvm面试题-背诵版

按照思维导图抽查和记忆&#xff0c;答案见&#xff1a;四、面试-多线程/并发_scheduledfuture释放-CSDN博客

初学者如何使用QT新建一个包含UI界面的C++项目

文章目录 一、下载并安装QT51、下载安装包2、注册/登录账号3、安装qt6 二、新建QT Widget项目1、新建项目并且运行2、易错点&#xff1a;可能运行成功得到UI界面但是会报错&#xff08;原因是使用了中文路径&#xff09; 一、下载并安装QT5 1、下载安装包 进入下载网址 Windo…

javascript中的class基础入门(1)

javascript中的class start 最近在学习&#xff1a;cocos &#xff0c;准备自己制作小游戏。过程中遇到不少疑问&#xff0c;我计划将这些疑问写成一个系列博客&#xff0c;用以记录。这篇文章来了解 class 1. 前言 1. 前言 本文对应版本 Cocos Creator 3.8。Cocos Creato…

Pytest中测试结果收集:pytest_terminal_summary!

前言 Pytest是Python的一种强大的测试框架&#xff0c;它提供了丰富的功能和插件来满足各种测试需求。 其中&#xff0c;pytest_terminal_summary是一个钩子函数&#xff0c;它允许我们在测试运行结束后&#xff0c;添加自定义的总结信息到测试报告中。这个功能在需要对测试结…

Java 小项目开发日记 04(文章接口的开发、oss图片上传)

Java 小项目开发日记 04&#xff08;文章接口的开发、oss图片上传&#xff09; 项目目录 配置文件&#xff08;pom.xml&#xff09; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sc…

HMAC算法

HMAC HMAC可以用来加密、数字签名、报文验证等。 1. 消息认证码 消息认证码&#xff08;Message Authentication Code&#xff0c;MAC&#xff09;是基于消息和秘钥的公开函数&#xff0c;输出为定长数据&#xff1a; MACC(M,K) 假定通信双发共享秘钥K&#xff0c;发送方A向接…

ubuntu22.04 成功编译llvm和clang 3.4.0,及 bitcode 函数名示例,备忘

1, 获取llvm 仓库 从github上获取&#xff1a; $ git clone --recursive https://github.com/llvm/llvm-project.git 2, 检出 llvmorg-3.4.0 tag 针对llvm 3.4.0版本&#xff0c;检出 $ cd llvm-project $ git tag $ git checkout llvmorg-3.4.0 3, 配置并编译llvm 使用 M…

ARK:《BIG IDEAS 2024》

Cathie Wood所带领的方舟投资&#xff08;ARK&#xff09;发布了年度重磅研究报告《BIG IDEAS 2024》&#xff0c;该报告指出人工智能、公共区块链、多组学测序、能源存储和机器人技术这五大板块的融合将带来全球经济活动的改变。 这五个创新平台正在融合并定义这个技术时代&am…