01-分析同步通讯/异步通讯的特点及其应用

同步通讯/异步通讯

微服务间通讯有同步和异步两种方式

  • 同步通讯: 类似打电话场景需要实时响应(时效性强可以立即得到结果方便使用),而且通话期间不能响应其他的电话(不支持多线操作)
  • 异步通讯: 类似发邮件场景不需要马上回复并且可以多线操作(适合高并发场景)但是时效性弱响应会有延迟

同步通讯的缺点

微服务间基于Feign的调用就属于同步方式,虽然调用可以实时得到结果但是存在一些问题

  • 耦合度高: 每次加入或删除业务都需要去支付服务中改动原来的代码
  • 性能/吞吐能力下降: 调用者(支付服务)需要等待服务提供者响应完成后才能执行下一步的操作,如果调用链过长则响应时间等于每次调用服务的时间之和
  • 资源浪费: 调用者(支付服务)在等待服务提供者响应过程中啥也不干却一直占用着CPU和内存,高并发场景下会极度浪费系统资源
  • 级联失败: 如果服务提供者(仓储服务)出现问题会导致所有的请求都卡在这里,最后随着请求越来越多支付服务也会将系统资源耗尽导致整个微服务故障
    在这里插入图片描述
// 用户支付完成支付服务调用其他服务
public void PaymentService() {// 调用订单服务完成订单状态修改orderService.doSth();// 调用物流服务从仓库分配响应的库存并准备发货storageService.doSth();messageService.doSth();...
}

异步通讯

异步调用的常见实现是事件驱动模式,如购买商品时用户支付后需要调用订单服务完成订单状态修改,调用物流服务从仓库分配响应的库存并准备发货

  • 支付服务是事件发布者(publisher),在支付完成后只需要发布一个支付成功的事件(event),事件中带上订单Id
  • 订单服务和物流服务是支付成功事件的订阅者(Consumer),订阅者监听到自己订阅的事件发布后就会执行对应的业务逻辑代码
  • Broker: 事件发布者与订阅者之间的并不是直接通信(解耦合),发布者只负责发布事件到Broker(不关心订阅者),订阅者负责从Broker订阅事件(不关心发布者)

异步通讯的优点

  • 吞吐量/性能提升: 支付服务只需要向Broker发布一个支付成功的事件剩下的就不用它管了
  • 故障隔离: 如果仓储服务挂掉也丝毫不会影响到支付服务,因为支付服务不需要等待仓储服务响应完成, 所以支付服务也就不会再占用无意义的系统资源
  • 流量削峰: 不管发布事件的流量波动多大都是由Broker接收,订阅者可以按照自己的处理速度去Broker取事件处理
  • 添加新服务时只需要让新服务来订阅事件,删除服务时只需要让服务取消订阅事件,不需要修改支付服务的代码解除了服务之间的耦合

异步通讯的缺点

  • 整个异步通讯过程中所有服务间的调用都是依赖于Broker来实现的,所以对Broker的可靠性,安全性,吞吐能力要求较高
  • 异步通讯导致架构复杂,业务没有明确的流程线出了问题不方便追踪管理
    在这里插入图片描述

相关技术

MQ(MessageQueue)中文是消息队列即存放消息(事件)的队列,也就是事件驱动模式中的Broker

  • 追求可用性: Kafka、RockerMQ、RabbitMQ
  • 追求可靠性: RabbitMQ、RocketMQ
  • 追求吞吐能力: RocketMQ、Kafka
  • 追求消息低延迟: RabbitMQ、Kafka

在这里插入图片描述

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

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

相关文章

电脑右下角出线白色弹窗的解决方法

电脑无缘无故,在右下角出现一个白色弹窗,无法关闭,非常恶心,后来经过查询,发现可能是360之类的弹bug,解决只需要: 1、鼠标左键 点击一下白框 2、键盘输入 AltF4 虽不是技术问题,但解…

day59 线程

创建线程的第二种方式 实现接口Runnable 重写run方法 创建线程的第三种方式 java.util.concurrent下的Callable重写call()方法 java.util.concurrent.FutureTask 创建线程类对象 获取返回值 线程的四种生命周期 线程的优先级1-10 default为5,优先级越高&#xff0c…

本地部署推理TextDiffuser-2:释放语言模型用于文本渲染的力量

系列文章目录 文章目录 系列文章目录一、模型下载和环境配置二、模型训练(一)训练布局规划器(二)训练扩散模型 三、模型推理(一)准备训练好的模型checkpoint(二)全参数推理&#xff…

数据结构(二)——顺序表和链表的比较

1、存取(读/写)方式 顺序表可以顺序存取,也可以随机存取,在第i个位置上执行存取操作,顺序表仅需一次访问. 链表只能从表头开始依次顺序存取,链表在第i个位置执行存取则需从表头开始依次访问i次. 2、逻辑结构与物理结…

【数据库系统概论】第2章:关系数据库

文章目录 0. 前言2.1 关系数据结构及形式化定义2.1.1关系2.1.2 关系模式 2.2 关系操作2.3 关系的完整性2.4 关系代数 0. 前言 关系数据库系统是支持关系模型的数据库系统。第一章初步介绍了关系模型及其基本术语。本章将深入介绍关系模型。 按照数据模型的三个要素,…

JS-06-数组

一、数组的创建与访问 见:JS-04-javaScript数据类型和变量 JavaScript的Array可以包含任意数据类型,并通过索引来访问每个元素。 要取得Array的长度,直接访问length属性: let arr [1, 2, 3.14, Hello, null, true]; console.l…

系统运维网络知识汇总

一、系统运维中网络方面的规划与思考 系统运维建立在网络的基础之上,如果没有一个相对合理的网络架构,恐怕系统运维做起来也不是那么的顺手。一个公司基本上都会把网络和服务器独立开来,划分不同的区域摆放设备,很多时候都是物理…

基于springboot+vue实现食品安全管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现食品安全管理系统演示 摘要 食品行业同其他行业有很多的差别,食品行业不仅要管食品的生产和销售,还要管食品的库存和保质期,那么对于食品管理者来说,就存在着一定的难度。况且食品的种类复杂,存储条…

JavaWeb实验 Servlet基础编程

实验目的 编写Servlet代码;熟悉并掌握Servlet的使用和配置。 实验内容 【1】利用Servlet实现一个简单的登录系统,要求: 包括登录页面、登录成功页面和登录失败提示页面;用户可以在登录页面输入用户名和密码;点击登…

面试题:分布式锁用了 Redis 的什么数据结构

在使用 Redis 实现分布式锁时,通常使用 Redis 的字符串(String)。Redis 的字符串是最基本的数据类型,一个键对应一个值,它能够存储任何形式的字符串,包括二进制数据。字符串类型的值最多可以是 512MB。 Re…

简单了解一个数据包在网络的一生

在主题之前,我想先谈谈目前计算机的网络模型,主要谈谈 TCP/IP 模型: 应用层:产生最原始的数据,常见协议如 http、ftp、websocket、DNS、QUIC 传输层:传递应用层的数据给网络层,必要时进行切割&…

mysql题库详解

1、如何创建和删除数据库? 创建数据库 CREATE DATABASE 数据库名; 删除数据库 drop database 数据库名; 2、MyISAM与InnoDB的区别? 1)事务:MyISAM 不支持事务 InnoDB 支持 2)行锁/表锁:MyISAM 支持表级锁…