支持支付宝、微信、对公转账等多种支付方式
背景
我们在入口层有一个提供HTTP服务的应用。随着业务的复杂,一个用户请求的处理过程,涉及多个对后端远程服务的调用。为了实现的简单,目前都是使用同步方式完成的,也就是在一个请求的处理过程中,会占用一个容器线程进行逻辑运算和同步远程调用。这种开发方式的好处是直观,开发成本低,但也带来了一些稳定性和资源浪费的问题。对于我们的HTTP服务来说,同步化的实现带来下面这3个问题。
下游服务超时带来的服务可用性问题。一部分的请求超时会导致HTTP服务线程池被占满,从而导致其它的请求无法获取到线程资源而失败。
性能问题,多个对远程服务的调用串行执行,导致服务响应时间长。
推荐阅读:HTTP状态码对照表
容量问题,服务吞吐量受限。每个请求长时间占用线程,导致线程得不到充分利用。
为了解决这些问题,结合目前使用的技术栈以及适应成本,我们对HTTP服务进行了一次异步化改造。

解决方案
异步化编程中闻名的Callback Hell,让不少同学望而止步。当业务复杂的时候,各种call back互相嵌套,使代码变得更加容易出错和不易理解。业内也有有不少框架提供了异步化编程支持,有以下三个思路:
纤程
纤程可以认为是轻量级的用户线程,脱离了OS的调度机制,在应用级别进行调度管理。由于它只维护了基本的执行栈信息,并不立即分配执行资源,因此,它可以轻松创建成千上万的纤程(受内存大小的限制),通过极少的线程完成对纤程的调度执行。这个方向的代表有微信团队开源的libco,以及在语言层面上支持的Go语言等。libco hook了底层IO相关的系统函数,通过底层IO事件驱动纤程的调度执行。当遇到同步调用网络请求时,libco自动注册回调监听器,并让出CPU。而在IO事件完成或者超时候,自动恢复纤程,然后调度执行。它的实现机制决定了它非常适合依赖耗时IO服务的实现。承载了微信千万级调用的一个基石。不过遗憾的是,libco是一个高效的c/c++协程库,并没有在JVM上实现。
Quasar是在JVM之上实现了纤程机制,基本可以在Quasar的类库基础上,以同步的模式来编写异步的代码。在真正执行代码前,通过编译或者Instrument Agent的形式织入相关的字节码。从头起步引入纤程还是一个不错的选择。对现有项目的改造,需要对现有的线程类修改成纤程类,这需要改动我们底层非常多的中间件。另外业内公布的使用经验较少,后续可以持续关注它的发展。
Actor模型
Actor模型其实不是什么新概念了。近些年有逐渐流行的趋势。Actor模型中一个核心概念就是Actor实体。每个Actor实体负责一个逻辑计算。传统并发编程都是基于共享内存的方式来达到多线程之间的通讯的目的。Actor之间不共享数据,也不直接通讯,而是发送或者接受mailbox/queque中的消息来达到通讯的目的。Actor之间通过消息来驱动。正式由于发送者与接受者的分离,是的Actor具有内在的并发特性,它可以不用考虑actor之间的同步问题,不受限制的调度执行收到消息的Actor,从而优化了IO等待的问题。Scala,Golang等在语言层面支持Actor模型。Scala的新版中,推出Akka来完成Actor模型,并有了Java版本。但是需要引入新的API,对现有业务代码块改造成Actor模型,对现有代码改动较大。
RX
Rx也是一种编程模型,它尝试提供统一的异步编程接口封装来操作一个可观察的数据流。其吸收了函数式编程的优秀思想,并将观察者,迭代器模式实现的淋漓精致。当下流行的语言,基本都有相应的实现。 如RxJava类库,即提供了java版本的实现,RxJava在Netflix的Zuul项目中得到成功的应用。Rx看起来更像是一种编程思想的突破。它提供了统一的函数式的风格编程接口来简化异步程序的编写,同时内部也通过callback机制,比Actor能获得更好的响应速度。在调研过程中,我们发现它同样要求对现有代码做较大改动,并将之前的同步模式转换成函数式编程风格。
综合来看,以上一些优秀的框架并不能立即利用到我们的项目中,引入成本还是很高的。结合现有技术架构上,以及产品正在快速迭代的环境下,我们对HTTP服务进行了一次轻量级的异步化改造。这次改造,引入Graph-Based Execution Engine来解决服务之间复杂的依赖关系,集中管理异步状态。结合Servlet 3.0提供了请求及释放tomcat容器线程的接口,充分利用Servlet容器线程资源。最后,通过spring mvc的异步模块衔接这两种异步机制,达到了全栈异步化的目的。
原理分析
Servlet从3.0开始,增加了异步规范。spring mvc从3.2开始也支持异步Servlet 3.0。针对现有技术栈,实现全栈异步化可以通过下面的一段代码来说明:

看了这篇文章的人还看了

- 全部评论(0)
- 129921提前尝鲜:Win10易升可将系统升级至创意者更新15063正式版
- 46042外贸建站(英文网站建设)用什么CMS系统好?
- 3596340个美食主题网页设计欣赏
- 31554优秀的海报作品设计分析总结
- 28595网站建设需求两极分化准确把握趋势方能转型不痛
- 26936外贸网站建设方案应该怎么操作
- 26697网站活动Banner如何设计,才能吸引用户眼球?
- 26358织梦去版权 power by dedecms
- 24169微信编辑器哪个强 秀米vs135测评
- 225710广州外贸建站哪个系统好呢?