欢迎访问智唯网络!专业H5响应式营销型网站建设、百度seo优化、网络推广服务!
营销之道 干货分享
了解企业新动态,分享前沿的营销推广干货,成长路上,我们携手同行
网站建设News

HTTP服务异步化改造实践

发布时间:2017:11:16 03:19:18 | 已阅: | 作者:智唯小编 | 来源:智唯网络 | 共 0 条评论

扫一扫
手机访问

本文共有1737个文字,预计阅读时间5分钟
导语
我们在入口层有一个提供HTTP服务的应用。随着业务的复杂,一个用户请求的处理过程,涉及多个对后端远程服务的调用。

  背景

  我们在入口层有一个提供HTTP服务的应用。随着业务的复杂,一个用户请求的处理过程,涉及多个对后端远程服务的调用。为了实现的简单,目前都是使用同步方式完成的,也就是在一个请求的处理过程中,会占用一个容器线程进行逻辑运算和同步远程调用。这种开发方式的好处是直观,开发成本低,但也带来了一些稳定性和资源浪费的问题。对于我们的HTTP服务来说,同步化的实现带来下面这3个问题。

  下游服务超时带来的服务可用性问题。一部分的请求超时会导致HTTP服务线程池被占满,从而导致其它的请求无法获取到线程资源而失败。

  性能问题,多个对远程服务的调用串行执行,导致服务响应时间长。

推荐阅读: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。针对现有技术栈,实现全栈异步化可以通过下面的一段代码来说明:

  

HTTP服务异步化改造实践

 

如何建站:
建网站需要准备哪些资料 如何购买域名空间 协助备案 成功案例 真实见证 建站类型有哪些 收费标准 建站流程 制作周期 改版美化 提升有户体验 [建站必看]源码内容交付 联系客服 专业建站

看了这篇文章的人还看了

专业建站 免费排名(有什么疑问的请留言或咨询在线客服)
  • 全部评论(0
    还没有评论,快来抢沙发吧!

上一篇:建站经验:如何提高网站内容的相关性?

下一篇:请指引我们前进的道路:全球著名网站设计师大起底

  • 同行价格

    统一报价,无隐形消费

  • 金牌服务

    一对一专属顾问,7*24小时金牌服务

  • 售后无忧

    完善售后,客服经理全程跟进

建站优化二维码
建站优化二维码

截屏,微信识别二维码

微信号:13825575516

(点击微信号复制,添加好友)

优化二维码打开微信