前言

  提到同步调用和异步调用两者的区别,首先笔者是从微服务间通讯方式角度出发来阐述这两者的区别。

同步通讯

  • 调用方需要等待执行方的调用结果。(就像打电话一样,需要实时响应)
  • 典型就是:Dubbo的rpc远程过程调用方式

异步通讯

  • 调用方无需等待执行方的执行结果 (就像发微信,不需要马上回复)
  • 典型就是消息队列(也称消息中间件):MQ
  • 目前市场主流的中间件框架有:RabbitMq,RocketMq,Kafka,ActiveMq

这两种方式各有优劣:

  1. 打电话可以立即得到响应,但是你却不能跟多个人同时通话。
  2. 发送微信可以同时与多个人收发微信,但是往往响应会有延迟。

同步调用
优点:时效性强,可以立即得到结果。
缺点: 虽然调用可以实时得到结果。在开发中存在以下问题:

  1. 耦合度高:如上图所示如果支付服务需要添加新需求就需要更改原来服务代码,需要重新编译,重新运行。
  2. 性能下降:支付服务需要等待下边的所有服务方法全部逐次执行完后才算支付服务成功,假如订单服务 仓储服务 短信服务等每个服务都需要150s才能执行完成那么支付服务需要等待的时间链路就过长了。
  3. 资源浪费:高并发场景下会极度浪费系统资源,假如有A,B,C…等来调用支付服务,A调用支付服务后还没来得及响应,B就来了。所以会迟迟导致其他用户无法调用该服务。调用链中的每个服务等待响应过程中不能释放请求占用的资源。
  4. 级联失败:如果上图如果服务提供者出现问题那么所有的调用方就会跟着出现问题。

异步调用

 异步通讯的出现是为了解决同步通讯所带来的问题,支付网站一般都会使用消息中间件。


服务解耦:

  • 用户提交支付服务后,瞬间支付服务会直接提示用户支付成功。然后将订单服务,仓储服务,短信服务,放到中间件(Broker)中。至于中间件中的这三个服务什么时候执行我们不用关心,(Broker)会去同时执行这三个服务。

提升性能:

  • 比如:用户支付服务花费时间50ms,支付成功事件花费10ms。此时会将订单服务,仓储服务,短信服务放入(Broker)中,Broker中会同时执行这三个服务总共就用150ms,提升性能。

服务没有强依赖性,不担心级联失败问题

  • 各个服务互相隔离,仓储服务出现问题的话不影响其他两个服务。用户正常显示支付成功

    流量削峰
  • 比如:第一用户提交支付服务后,提示用户支付成功。此时Borker中服务可能会有延迟但是不应影响后边用户过来提交。第二,三个用户逐次提交服务后也会像第一个用户一样提示成功支付。但是Broker它也会按照先后次序去执行每个用户提交的服务。

异步通信总结:
优点:

  • 也就是上述四点。耦合度低,提升吞吐量,故障隔离,流量削峰。

缺点:

  • 依赖与Broker的可靠性,安全性,吞吐能力
  • 架构复杂业务没有明显的流程线,不好追管理。

同步调用和异步调用两者之间的区别相关推荐

  1. C#(同步调用、异步调用、异步回调)

    本文将主要通过"同步调用"."异步调用"."异步回调"三个示例来讲解在用委托执行同一个"加法类"的时候的的区别和利弊. ...

  2. C#“同步调用”、“异步调用”、“异步回调”

    本文将主要通过"同步调用"."异步调用"."异步回调"三个示例来讲解在用委托执行同一个"加法类"的时候的的区别和利弊. ...

  3. C# 委托(同步调用、异步调用、异步回调)

    文章转自:http://www.csharpwin.com/csharpspace/12393r3151.shtml 本文将主要通过"同步调用"."异步调用". ...

  4. 【C/C++服务器开发】同步与异步、阻塞与非阻塞、同步调用和异步调用的概念

    同步与异步 首先我们要明确的是,同步和异步都是针对两个或者两个以上的事物来说的.比如当我们在网上购物看中一件物品,然后去浏览该商品详情的时候,首先页面会先发送一个请求,后台服务器查询对应商品的相关数据 ...

  5. JS 堆栈事件调用(同步调用、异步调用);消息队列和作业队列

    同步调用 const bar = () => console.log('bar') const baz = () => console.log('baz') const foo = () ...

  6. java thrift异步调用_thrift异步调用 - thrift-cob_style-tnonblockingserver - ItBoth

    [ thrift 在python中使用了 tornado和  twisted 来作为异步的webserive服务提供异步接口,自身并没有实现     twisted:         Generate ...

  7. java 多异步调用_java 异步调用与多线程

    异步与多线程的区别 一.异步和多线程有什么区别?其实,异步是目的,而多 线程是实现这个目的的方法.异步是说,A发起一个操作后(一般都是比较耗时的操作,如果不耗时的操作 就没有必要异步了),可以继续自顾 ...

  8. ajax一步调用,ajax异步调用

    ajax异步调用 内容精选 换一换 当前示例是单模型情况下推理Engine的实现代码.在多模型情况下,如果需要参考该示例,您需要注意以下几点:声明preOutBuffer变量时,不能带有static关 ...

  9. c语言syscall函数,C写调用和Go syscall.Write之间的区别

    小编典典 使用write,只有两种情况需要考虑: 如果失败,则结果为-1并被errno设置. 如果成功,则结果为0或更大errno且未设置. 除非您对历史上的Unix实现感兴趣,否则没有其他情况可以考 ...

最新文章

  1. 揭秘百度核心技术:53位专家纯干货分享
  2. 生产三码 黑苹果_黑苹果OC配置工具:OpenCore Configurator v2.15.2.0
  3. 基于matlab的fisher线性判别及感知器判别_基于嵌入表示的网络实体对齐方法进展概述...
  4. 扩展云存储边界,阿里云推出全球首个云定义存储产品
  5. 5.7 拉普拉斯变换的性质
  6. 如何在计算机设置鼠标宏,罗技鼠标指向宏怎么设置?鼠标宏功能设置教程
  7. java简历编写及面试技巧
  8. 【备战秋招系列-3】Java高频知识点——排序、设计模式、JavaSE、JVM
  9. 中国大陆身份证正则表达式(严格验证省份和日期)
  10. 海洋角度分析全球气候变暖停滞原因
  11. Revel框架的搭建与部署教程
  12. 题解 CF1389B 【Array Walk】
  13. 狼来了,海康威视被黑客入侵,视频监控设备被境外IP地址控制
  14. c# 计算圆锥的体积_用C#编写一个程序计算出球,圆柱和圆锥的表面积和体积。...
  15. 使用 setoolkit 伪造站点窃取用户信息
  16. 用Python爬取今日头条,里面的东西统统白送!
  17. Spring源码解读(一)——容器是如何初始化的
  18. win10系统保存文件到桌面需要刷新才显示解决办法
  19. dns劫持与http劫持
  20. 用计算机获取机读卡是通过什么实现的,一种基于图像识别技术的答题卡及考试系统的制作方法...

热门文章

  1. 栈详解(顺序栈和链栈)
  2. 图片点击放大,你的网页也能做到!
  3. java geohash_GitHub - GongDexing/Geohash: GeoHash是目前比较主流实现位置服务的技术,用最简洁的Java实现GeoHash算法...
  4. 康姿百德 “神奇”床垫包治百病是谣传
  5. js base64和图片 相互转换
  6. 数据库连接池之自定义连接池(mysql)
  7. uCLinux简介--
  8. c++中的typename与class
  9. Python项目:基于Python+Django实现药品管理系统
  10. eclipse java1.8_不同版本Eclipse对JDK版本要求