在前面两篇blog中,我结合源码分析了thrift server的实现,以及0.9.1中引入的async processor(见thrift server、thrift async server)。本文将从使用者的角度通过一些简单的例子,介绍下怎么基于TThreadedSelectorServer搭建一个半同步半异步server和一个纯异步server,并在功能和性能方面对二者进行比较。
本文中涉及到的代码都托管在github上,懒得看下面文字啰嗦的同学可以直接去看代码,见这个repo。
在Thrift Server一文中,我结合源码介绍了thrift java lib里的几种server的,并详细介绍了TThreadedSelectorServer的实现。TThreadedSelectorServer将网络I/O和业务逻辑的执行分开,网络I/O基于异步事件驱动实现,而业务逻辑还是基于一组业务线程池,以阻塞、同步的方式执行。在thrift 0.9.1中引入了async processor,源自这个issue。基于这个feature可以实现一个纯异步、事件驱动的server。相比于半同步、半异步的server,纯异步server将可以带来非常可观的性能提升。
先了解下thrift的TBaseProcessor,它的process方法是同步阻塞的,内部有个processMap: Map<String,ProcessFunction>,装着所有ProcessFunction,每个processFunction对应着一个业务接口。另外它还有一个实际业务handler的实例。
它的process方法代码如下:
最近对服务的逻辑进行了一些异步化改造,对依赖的thrift服务都改为异步调用,结合java8里提供的CompletableFuture,可以很方便地描述服务间的依赖关系。过程中对thrift的异步client实现细节产生兴趣,于是就有了这篇blog。 在Thrift Server一文中,我结合源码剖析了thrift的server组件中最常见的TThreadedSelectorServer的设计和实现。本文则关注的是thrift中提供了client。同步client非常简单,没什么值得研究的地方,因此本文将结合源码分析下异步client的实现。