8.2.2 异步服务调用
基于JDK的Future机制,可以非常方便地实现异步服务调用。
JDK原生的Future主要用于异步操作,它代表了异步操作的执行结果,用户可以通过调用它的get方法获取结果。如果当前操作没有执行完,get操作将阻塞调用线程。
在实际项目中,往往会扩展JDK的Future,提供Future-Listener机制,它支持主动获取和被动异步回调通知两种模式,适用于不同的业务场景。
以Netty的Future接口定义为例,新增了监听器管理接口,监听器主要用于异步通知回调。
异步服务调用的工作流程如下:
1) 消费者调用服务端发布的接口,接口调用由分布式服务框架包装成动态代理,发起远程服务调用。
2) 通信框架异步发送请求消息,如果没有发生I/O异常,返回。
3) 请求消息发送成功后,I/O线程构造Future对象,设置到RPC上下文中。
4) 用户线程通过RPC上下文获取Future对象。
5) 构造Listener对象,将其添加到Future中,用于服务端应答异步回调通知。
6) 用户线程返回,不阻塞等待应答。
7) 服务端返回应答消息,通信框架负责反序列化等。
8) I/O线程将应答设置到Future对象的操作结果中。
9) Future对象扫描注册的监听器列表,循环调用监听器的operationComplete方法,将结果通知给监听器,监听器获取到结果之后,继续后续业务逻辑的执行,异步服务调用结束。
需要指出的是,还有另外一种异步服务调用形式,就是不添加Listener,用户连续发起N次服务调用,然后依次从RPC上下文中获取Future对象,最终再主动get结果,业务线程阻塞,相比于老的同步服务调用,它的阻塞时间更短,其工作原理如图8-8所示。
异步服务调用的代码示例如下:
xxxService1.xxxMethod(Req);
Future f1 = RpcContext.getContext().getFuture();
xxxService2.xxxMethod(Req);
Future f2 = RpcContext.getContext().getFuture();
Object xxResult1 = f1.get(3000);
Object xxResult2 = f2.get(3000); }
假如xxxService1和xxxService2发布成异步服务,则调用xxxMethod之后当前业务线程不阻塞,立即返回null。用户不能直接使用它的返回值,而是通过当前线程上下文RPCContext获取异步操作结果Future。获取到Future之后继续发起其他异步服务调用,然后获取另一个Future……最后,通过Future的get方法集中获取结果。无论有多少个Future,采用此种方式用户线程最长阻塞时间为耗时最长的Future,即T = Max t(future1....N)。如果采用同步服务调用,用户线程的阻塞时间T = t(future1) + t(future2) + ……+ t(futureN)。
异步服务调用相比于同步服务调用有两个优点:
◎ 化串行为并行,提升服务调用效率,减少业务线程阻塞时间。
◎ 化同步为异步,避免业务线程阻塞。
由于每次服务调用都是同步阻塞,三个服务调用总耗时为T = T1 + T2 + T3。下面我们看下采用异步服务调用之后的优化效果。
采用异步服务调用模式,最后调用三个服务异步操作结果Future的get方法同步等待应答,它的总执行时间T = Max(T1, T2, T3),相比于同步服务调用,性能提升效果非常明显。
第二种基于Future-Listener的纯异步服务调用,它的代码示例如下:
xxxService1.xxxMethod(Req);
Future f1 = RpcContext.getContext().getFuture();
Listener l = new xxxListener();
f1.addListener(l);
......后续代码省略 }
基于Future-Listener的异步服务调用相比于Future-get模式更好,但是在实际使用中有一定的局限性,具体的使用限制留给读者自己思考。
……
展开
构建企业互联网架构的关键在于系统分布式和服务化,尤其对于大型网站和大型企业系统,系统的灵活性、超大容量、弹性和自治能力是非常大的挑战。在《分布式服务框架原理与实践》一书中,作者基于深厚的软件技术积累和电信领域成功应用实践,对如何构建分布式服务化系统,提供了原理分析、关键技术、开发案例以及业界技术对比,非常系统化,不论是学习分布式服务技术还是深入大型互联网架构都非常实用。
——华为云集成平台首席架构师苗彩霞
认识林锋已有多年,见证了作者在该领域深厚的沉淀。阅览该书的目录以及相关章节,我惊诧于作者在这些领域深入的洞察和实践。该书几乎覆盖了分布式系统开发的每一个关键技术点,包括较为重要的通信框架设计、时下流行的微服务、服务路由关联的技术和策略,以及饱受争议的OSGi。强烈推荐相关从业人员阅读此书。
——苏宁云商云计算中心技术总监汤泳
在大型网站架构设计方面摸爬滚打多年后,看到《分布式服务框架原理与实践》如获至宝,作者条理清晰、由浅入深地解析了分布式服务架构所涉及方方面面的关键技术和原理,既有纵向演进介绍,又有横向竞品对比。尤其针对各种场景所提出的设计原则或实践,都是作者的实战总结,有些经验的获取成本高昂,非常宝贵。本书完全可以直接用于指导分布式服务系统的构建。
——中国移动手机阅读基地平台首席架构师胡稳
分布式的应用在设计、开发以及部署的各个方面都比较复杂,国内外也没有典型的图书进行系统介绍,于是在这方面,我们不得不一遍遍地踩坑。林锋有着深厚的技术基础和丰富的架构经验,这本集他经验和心血而成的图书,包含了分布式系统的方方面面,既有宏观的理论介绍,也有来自一线的经验分享,相信它必将成为架构师和开发人员的必备图书!
——东软集团资深软件工程师、InfoQ编辑张卫滨
“微服务”无疑是本年度较热的技术关键词之一!那如何落地微服务呢?我认为首先要实现服务化,而本书恰好提供了一个很好的服务化操作指导。作者首先分析了作为一个分布式服务框架所需具备的能力,包括服务注册中心、服务调用、服务路由、服务发布/灰度发布等;其次作者分析了服务底层如何有效地进行通信,包括通信框架,序列化/反序列化及协议栈等;再次作者分析了服务如何做到高可靠性及高安全性等重要特性;最后作者也阐述了从服务化如何向微服务演进。
——麻袋理财首席架构师王天青
以OpenStack为规范建设的IaaS、以Docker为代表的容器技术、以分布式微服务框架构建的业务平台即将颠覆业务系统整体建设方案,新的系统建设方案将极大提升业务系统的可用性、扩展性和应变能力。微服务架构对于运营商内容型业务的互联网化转型意义非凡,系统架构微服务化才能真正支撑好业务转型的需要。本书将成为帮助大家更好地理解微服务框架关键技术的原理和实现的必备书籍。
——咪咕动漫系统支撑部技术总监李鹏
锋兄在华为一直从事核心代码的架构设计和开发,属于实战型架构师,而且乐于分享。《分布式服务框架原理与实践》源于他在多年架构设计工作中的实战经验,阅读价值极高!在面向大规模、分布式系统架构中,服务框架是其中的核心和必经之路。祝贺锋兄新书造福广大程序猿!
——奇蛙CEEWA运动无人机合伙人、前华为开放平台总架构师冯黎
近些年来,越来越多网站需要同时提供Web、移动App、OpenAPI多种访问方式,基于分布式服务的业务分治与复用需求越来越强烈,使用分布式服务构建系统已经成为互联网开发的常用手段。但是分布式服务的关键技术有哪些?核心原理是什么?本书作者作为分布式框架的开发者根据自己的实践经验编写的这本《分布式服务框架原理与实践》或可为您解惑。分布式服务框架用到的各种技术也是整个互联网分布式技术的一个缩影,您也可窥一斑而知全豹,通过本书学习掌握各种分布式开发技巧。
——宅米网CTO、《大型网站技术架构:核心原理与案例分析》作者李智慧
整书由构建分布式服务为基础讲起,逐步深入到分布式服务的保障机制,最后也讲解了时下新兴分布式设计方案微服务架构。书中内容组织清晰,图例详实,非常便于理解与吸收,是一本不错的提升分布式服务架构能力的书籍。
——链家网架构师吕毅
本书深度阐述了应用和系统架构方面的设计和原理,真实体现了李林锋丰富的技术架构经验以及乐于分享的精神。在业务系统越来越讲究高可用、高性能、可伸缩扩展、高安全性、自动运维的今天,本书集合了大型企业多年的架构思路,为技术以及产品人员提供了重要的参考依据,从理念上提升了每位读者的技术水平,非常值得深入阅读和理解。
——阿里云PaaS平台产品架构师杨林