1. 同步与互斥,提到异步必然要涉及到与之对应的另一个词“同步”,而提到“同步”很多人也会联想到另一个词“互斥”,同步是指多个操作之间产生了依赖或者先后顺序关系,互斥是指多个操作需要访问同一个资源,而这个资源又不能让多个操作同时进行,那么这多个操作之间就是互斥关系;
  2. 同步调用与异步调用,在服务设计时,同步调用是指调用方在发起调用之后必须一直等待直到调用结果返回才能进行后续的操作,异步调用是指调用发起方在发起调用之后立即返回继续执行后续的操作,而不需要等待调用的返回结果。举个简单的例子,同步就像打电话,异步就像发邮件;
  3. 同步调用和异步调用,二者各有其应用场景,如果相邻两个操作之间存在依赖关系,那么就必须选择同步调用,否则都可以采用异步,但是同步调用更为简单,如果在一个系统中滥用异步会造成系统复杂度增加;从扩展性角度来看,同步容易造成调用阻塞,异步调用更易于扩展,而且异步调用方式天然具备故障的隔离性,因此,在合适的场景选择同步能让你的系统更为简单,在合适的场景选择异步能让你的系统更具备扩展性;
    例如,我们要设计一个数据收集和处理系统,该系统分为两个子服务:数据收集服务和数据处理服务,数据收集服务用于从客户端收集各种上报信息,客户端上报的所有数据需符合系统的格式要求(上报的消息必须为JSON格式字符串,在字符串中必须包含version、type、con三个字段,上报的不同消息的type的值不一样,上报的消息内容存储在con字段中),数据处理程序对收集服务传入的数据进行分类型处理,并根据type字段值存入数据库的不同表中,如果系统被设计成同步的方式,那么它会像像下图所示:

    在同步的系统中,数据收集服务没收到一个客户端上报的消息就调用数据分析服务对该消息进行处理,数据分析服务将数据解析、转换之后存入数据库,然后将结果返回给数据收集服务,然后数据收集服务再将结果返回到客户端,那么在这个系统中数据收集服务调用数据分析服务是同步调用,因为它要等待数据分析服务返回的结果,而数据分析服务调用数据库也是同步调用,因为数据分析服务也要等待数据库的处理结果;
    在上述设计的数据收集、分析系统中,有如下问题:(1)扩展性受影响,客户端并发量受到数据分析服务、数据库存储速度的影响;(2)系统可用性受影响,一般数据分析服务所做的事情稍微复杂,一旦这个服务出现问题,整个数据收集、分析系统都无法正常工作;
    为解决上述同步过程中出现的问题,将系统改造成如下图所示:

    我们引入一个异步队列(例如RabbitMQ)用于对“数据收集服务”和“数据分析服务”的解耦,异步队列可以对数据进行缓存并具备持久化能力,数据收集服务在受到客户端上报的数据时,只检查其格式是否符合要求(是否为JSON串?JSON中是否包含了version、type和con三个字段),检测通过的数据发送到异步队列中,数据一旦放入异步队列就立即返回;数据分析服务从异步队列中拉取消息,并对消息进行分析、处理然后将数据存储到数据库的相应表中;
    在这个异步系统中,还存在很多同步调用,例如数据收集服务同步调用异步队列的接口来发送数据(很多异步队列的客户端也提供异步发送消息的功能),这里采用同步调用,是想告诉客户端,它的数据已经安全抵达服务器,而服务器内部会保证你的数据被安全的处理,但是可能不会立即处理,如果这里也采用了异步,就会出现问题:异步传输数据出现问题时,无法告知客户端,客户端就会抱怨明明已经把数据成功交给服务器,服务器却实际上没有成功处理它;数据分析从异步队列中拉取消息也是同步调用,即数据分析服务从异步队列中拉取一条消息进行处理,处理完毕之后再从异步队列中将该消息删除;
    虽然系统中存在了同步调用,但是从整个系统而言,数据收集服务和数据分析的依赖性却消失了,由于数据收集服务做的事情非常少,它能接受客户端的更多的上报请求,而数据分析服务业务复杂还需要存储数据库,它可以慢慢地从异步队列中消费消息,即便客户端上报消息的速度超过了“数据分析服务”,那么整个系统也能正常运行,从故障隔离的角度来看,一旦数据分析服务出现故障,消息会被异步队列缓存,客户端的数据上报功能依然不受影响。
    从上面的例子可以看出,同步和异步在架构设计时使用要非常灵活,没有明确的方案来告诉我们什么时候应该用同步什么时候应该用异步,我们只要保证整个系统满足稳定性、扩展性等相关的要求即可。
  4. 同步转异步时,阻碍最大的地方就是调用之间产生了依赖、顺序关系,从另一个角度来看就同步操作之间产生了状态,这时如果要想将这些操作转换为异步,那就要去掉这些状态,去掉状态的办法包括:(1)将状态相关的操作整合到一个操作里,这需要调用方来实现;(2)将状态缓存到一个第三方缓存中,例如Redis、Memched等等,这需要被调用来实现;

为系统扩展而采取的一些措施——异步相关推荐

  1. 为系统扩展而采取的一些措施——缓存

    缓存 1.1 缓存刷新机制,缓存刷新是指什么时候把数据库中的数据加载到缓存 (1) 定期刷新: (2) 缓存命中失败时刷新: 1.2 在有缓存时的数据写入方式: (1) 同步写入,即缓存和数据库同时被 ...

  2. 访问外部扩展C语言编程,单片机C语言编程(系统扩展IC)8.ppt

    单片机C语言编程(系统扩展IC)8 第8章 单片机系统扩展 第8章 单片机系统扩展 目 录 8.1 扩展并行三总线 8.2 扩展简单并行输入/输出口 8.3 扩展并行数据存储器 8.4 串行扩展总线接 ...

  3. C51单片机————总线与系统扩展

    C51单片机----总线与系统扩展 Created with Raphaël 2.1.2张三张三李四李四四哥,IO口不够用怎么办?你可以进行系统扩展!什么鬼?那是什么东西?...看书去 1.引文 前面 ...

  4. Linux系统扩展oracle数据库所在的分区

    实验环境 系统:Centos7 装机采用lvm卷方式分区,将oracle数据库部署在了/home/oracle分区,后期发现磁盘空间不够用,添加新硬盘将分区/home/oracle扩容. 查看系统空间 ...

  5. 为XV6系统扩展一个系统调用需要修改的文件

    为XV6系统扩展一个系统调用需要修改的文件 根据实际需求,会有一定的改变 defs.h sysproc.c syscall.h usys.S syscall.c user.h

  6. 大屏扩展怎么取消任务栏_win7系统扩展双屏幕时,如何在两个屏幕下都显示任务栏...

    扩展屏幕下都显示任务栏!!! win7系统本身无法设置该功能(目前我是不知道) 但可以下载第三方软件来解决该问题. 第一步:Dual Monitor Taskbar 下载软件 下载链接:http:// ...

  7. 系统扩展方式 scale up和scale out

    什么是scale up和scale out? 许多存储系统开始很简单,但当需要进行系统扩展时就会变得复杂.升级存储系统最常见的原因是需要更多的容量,以支持更多的用户,文件,应用程序或连接的服务器. 但 ...

  8. 系统扩展方式 scale up和scale out(转载)

    什么是scale up和scale out? 许多存储系统开始很简单,但当需要进行系统扩展时就会变得复杂.升级存储系统最常见的原因是需要更多的容量,以支持更多的用户,文件,应用程序或连接的服务器. 但 ...

  9. 当系统扩展遇到违背OO的里氏原则(LSP)的时候怎么办 ?

    先转一篇写得很好的文章:http://www.cnblogs.com/CodeGuy/archive/2012/03/26/2418803.html ========================= ...

最新文章

  1. SFB 项目经验-12-为某上市企业的Skype for Business购买Godday证书
  2. 反射学习4-通过反射机制动态创建和访问数组
  3. php垂直居中代码_div标签:水平居中和垂直居中的实现(附代码)
  4. 计算器显示代码java_java编写的计算器源代码
  5. session监听器统计在线人数存入数值后不能取出其值
  6. 淘宝网的技术发展史(三)——分布式时代
  7. jqgrid demo java_java – jqgrid如何显示服务器端消息
  8. 【Packet Tracer 实验笔记5】
  9. HTML meta 标签 遇到meta http-equiv=refresh content=0; url=详解
  10. 一个开源的ORM框架——Light.Data
  11. 【解决】Django下使用sqlite3的相关问题
  12. Wing IDE注册破解方法
  13. 张季跃 201771010139《面向对象程序设计(java)》第十三周学习总结
  14. 【优化算法】金鹰优化算法(GEO)【含Matlab源码 187期】
  15. 防火墙的访问控制策略
  16. 华为路由协议ospf,域内路由,域间路由,域外路由
  17. J2EE项目开发中常用到的公共方法
  18. 几种基本的约束和外键(一对一 多对多 多对一)级联关系
  19. Codeforces - 985E Pencils and Boxes
  20. java统计报表,导出excel,自定义存储目录

热门文章

  1. mysql数字连接,MySQL - 已达到数字连接
  2. float取小数点后几位_python Integer整型与Float浮点型操作
  3. mysql-8.0.16-winx64.zip安装教程
  4. 局域网网管软件_局域网安全管理面临的4大挑战
  5. rust全息要啥才能做_在 Rust 中不能做什么
  6. mysql5.1安装过程_MySQL 5.1.7安装全过程
  7. qlineedit只能输入数字_Qt编写自定义控件51-可输入仪表盘
  8. 我的世界服务器怎么修复锁链甲,我的世界手机版锁链甲怎么做 怎么获得
  9. 数据分析流程和特征工程
  10. android x86 sleep,如何打开Android X86对houdini的支持