Web服务请求异步化介绍(实践篇)
Author:放翁(文初)
Date: 2010/8/5
Email:fangweng@taobao.com
围脖: http://t.sina.com.cn/fangweng
在概念篇介绍完以后,开始实际的对TOP开始做技术改造。(这篇东西更像是对短期工作的总结和汇报,写的不是很详实,后续会有一个ppt来深化异步化的一些思想)下面将第一阶段的工作做个总结,第一阶段主要做了以下几个方面的事情:
1. 典型taobao后台应用(主要是用到了多个内部组件)的Jetty迁移。
2. TOP管道化体系的异步改造。
3. 测试不同容器不同模式下的应用处理能力,并通过数据得出结论。
一.应用迁移及容器部署
这次迁移主要的工作就是在服务框架的迁移,服务框架内部是小的OSGI容器,和当初在阿软做服务平台一样,当时是SCA容器,道理都一样,如何打通SCA和OSGI与应用服务器,主要涉及的就是ClassLoader的互通。
服务框架组的同学当时做过一个Jetty的内置互通支持版本,其是修改了Jetty的代码,在启动过程中植入了外部应用容器的初始化和循环互通。考虑到将来Jetty升级的方便,自己还是从新考虑做一个外部互通的支持版本。(期间波折就不再此说了,大概说一两点关键之处),首先是要启动外部容器,由于Jetty可以支持LifeCycle的Bean在Jetty容器启动时优先装载,因此外部容器就实现接口,在Jetty的Server配置中设置即可。然后需要将两个容器互通(相互可以引用对方的服务接口),这需要在应用上下文构建的时候相互关联两者的classLoader,一种方式在Server的AppDeployer部署过程中植入,一种在指定的AppContext部署中植入。这两种方式就是Jetty支持的两种模式,一种配置在etc目录下的jetty总配置文件中(Server配置中),一种配置在contexts目录下(这种就是现在比较推崇的片段化部署),我选择了后一种,因为对我来说不是所有应用都需要支持容器互通的,当前只有TOP这个应用。
容器部署,Jetty真的是太干净了,首先类似于xml的解析实现没有(jdk可只有框架接口),log4j没有,jndi需要另外引入插件支持,lib下的jetty插件按需载入(在start.ini,start.config和启动脚本中可指定),遥想当年的jboss也应该是很干净,回顾今天的部署应用的jboss已经被贴了N多膏药。因此最终要的几个配置就是:启动脚本,etc下的jetty.xml(可以指定其他配置),start.config (可以从jetty的jar包中获取出来自己指定和配置),start.ini(启动的默认配置),contexts下的应用上下文配置。
容器部署和外部插件迁移虽然不是异步化的工作,但是在异步化以前一定要搞定,否则就无法谈到后续的应用迁移,总的来说jetty的模块化和扩展做的很好,基本上任何步骤都能够替换和实现新的逻辑。(有需要jetty配置和hsf外部插件支持的同学可以直接找我)
二.TOP管道化体系异步改造
TOP的服务接入层就是由很多个管道切面组成的,流控,安全,业务校验,路由,协议转换,响应格式转换等等,因此TOP自身很适合采用管道化流程体系来构建,同时采用管道化体系构建能够简单的隔离业务逻辑,实现服务降级,新功能beta发布。引入异步化概念后,对于开发者其实不需要过多了解,仅仅只需要配置异步化的管道,交由管道框架和容器协作来完成异步化的请求处理。
这里顺带在提一下上一篇中说到的异步化的作用:差别化耦合系统的体系设计,差别化流程中流程处理。异步化不会节省业务事务处理时间(反而会增加),也不一定会提高系统可用性和稳定性(起码全局上来看,整体复杂度增加,异常波及会被隔离,但是可能发现也较晚),也不一定会节省资源(异步化往往是空间换时间,将业务状态独立于处理,提高处理线程的利用率,代价是增加了交互和存储的成本)。
因此一直困扰TOP的服务分流和隔离可以通过异步化方式得以实现,方式就是将系统处理和业务处理流程隔离,系统处理用少量线程就可以支持大并发请求,同时将后续的业务处理交给业务工作池,而业务工作池的资源分配完全可以通过业务特征设置权重,也可以通过后台服务质量的反馈来自动调整,最终实现对服务使用者服务差别化,对不同质量的服务提供差别化的流量引入。
同样和上一篇文章谈到的多种模式一样,改造支持两种模式,适合不同场景。
1. Pull & Check Status & Resume Mode
这种模式对于后端服务的要求较高,首先服务使用需要支持异步方式,其次要求在完成服务后修改任务状态,而对于依赖方来说,会通过轮询的方式去获取结果。流程图如下,不过第二个是第一个的改进,效果不错,前者是检查所有的任务状态,确定是否完成,放入任务的是前端系统,后者是不需要检测任务状态,凡是获得任务,即表示任务完成,放入任务的是后端服务提供系统。
无奈,blog图片支持的不够好,看不清移步到:http://www.flickr.com/photos/33194437@N03/sets/72157624535271241/相册中有三张图
2. Push & Complete Mode
这种模式下对于后端服务来说可以只提供同步服务或者也支持异步服务,TOP一期改造采用这种模式,后端服务采用同步模式,具体测试结果参看后面的测试部分。
三.测试
场景:
后台服务执行时间为1秒,no think time,容器为Nginx+Jetty
并发用户数
|
Jetty连接池线程数量
|
业务线程池线程数量
|
load
|
TPS
|
200(异步)
|
200
|
200
|
0.8
|
180
|
400(异步)
|
200
|
200
|
0.7
|
208
|
200(同步)
|
200
|
200
|
1.16
|
190
|
400(同步)
|
200
|
200
|
1
|
190
|
200(异步)
|
200
|
400
|
0.95
|
195
|
400(异步)
|
200
|
400
|
0.84
|
390
|
200(同步)
|
200
|
400
|
0.82
|
195
|
400(同步)
|
200
|
400
|
0.88
|
195
|
200(同步)
|
400
|
400
|
0.7
|
174
|
400(同步)
|
400
|
400
|
0.85
|
350
|
结论:TPS还是取决于两个线程池的线程多少,在异步化后系统消耗并没有明显增加,容器连接池的放大和业务线程池的放大都可以提高处理效率,同时业务线程池较为轻量,容量翻倍处理基本也是翻倍,容器的线程池放大处理能力会有衰减。
场景:
200并发用户,调用user.get服务,no think time,容器线程池400,业务线程池500.
容器
|
load
|
TPS
|
Nginx + Jetty
|
6
|
800
|
Jetty
|
8
|
620
|
结论:没有前段Nginx对于数据缓冲处理,jetty处理效率一般,因此需要假设Jetty作为前段预处理容器(必要的时候也可以作为反向代理)
场景:
200并发用户,调用user.get服务,no think time,容器线程池200,业务线程池500.
容器
|
并发用户
|
请求处理模式
|
TPS
|
Apache + Jboss
|
200
|
同步
|
507
|
Nginx + Jetty
|
200
|
同步
|
1060
|
Nginx + Jetty
|
200
|
异步
|
1027
|
Jetty
|
200
|
异步
|
670
|
结论:同步模式下Apache+Jboss与Nginx+Jetty相差很大的级别(load也相差一倍多)。异步模式下的Nginx+Jetty与同步模式相差不大,因此异步带来的损耗可以忽略。没有Nginx作为前端整体性能下降很大。
场景:
200并发用户,no think time,容器线程池200,业务线程池500.
容器
|
请求服务
|
请求处理模式
|
TPS
|
Nginx + Jetty
|
Time.get
|
同步
|
1534
|
Nginx + Jetty
|
Time.get
|
异步
|
1068
|
Nginx + Jetty
|
User.get
|
同步
|
1060
|
Nginx + Jetty
|
User.get
|
异步
|
1027
|
结论:异步占用事务整体时间的比例越高,TPS的影响也越大。
长时间运行测试:
半个多小时Full GC一次(当前内存开到1.5G),线上64位可以开的再大一些,没有内存泄漏现象。
分享到:
相关推荐
Web请求异步处理和海量数据即时分析在淘宝开放平台的实践
Web请求异步处理和数据分析技术实践.pptx
Web请求异步处理和数据分析技术实践.pdf
首先,Web请求异步处理是提升系统性能和可扩展性的重要手段。在传统的Web服务中,每个请求都是同步的,即服务器接收到请求后立即处理并返回结果,这可能导致服务器在面对大量并发请求时不堪重负。为了解决这个问题,...
通过学习和实践这些示例,你可以熟练地在VB6中处理网络请求,避免UI卡死问题,提升用户体验。 总之,VB6中的异步GET和POST请求通过XMLHTTP组件实现了非阻塞的网络通信,使得应用程序即使在等待服务器响应时也能保持...
在Web开发中,jQuery是一个非常流行的JavaScript库,它极大地简化了DOM操作、事件处理以及Ajax交互。本主题聚焦于jQuery中的Ajax功能,特别是如何利用它...这个过程涉及到前端与后端的协作,是Web开发中的常见实践。
通过学习和运行这个示例,你将能掌握异步WebApi的实际应用,包括如何处理异步操作中的异常、如何优化异步请求的性能,以及如何在客户端(如JavaScript)中调用这些异步API。 总之,异步编程与WebApi的结合,为我们...
《.NET Web服务 入门经典 —— C# 编程篇》这本书是为初学者设计的,旨在帮助读者快速掌握使用C#语言构建.NET Web服务的基础知识。Web服务是一种跨平台、跨应用程序的方式,通过互联网交换数据和实现功能。在C#中,...
本篇文章将深入探讨Ajax异步请求的验证,解决初级问题,为初学者提供参考。 一、Ajax的基本概念 Ajax并非一种单一的技术,而是一种利用现有Web技术(如JavaScript、XML、HTML、CSS等)组合成的新应用方式。它的...
大数据与云计算培训学习资料 阿里技术 Web请求异步处理和海量数据即时分析在淘宝开放平台的实践 共29页.pptx
在Python的Web开发框架Flask中,异步请求是一个重要的特性,它允许服务器同时处理多个请求,提高了应用程序的性能和响应速度。...通过深入学习和实践,可以更好地利用异步编程的优势,实现高性能的Web服务。
这个库允许开发者在同一时间处理多个网络连接,极大地提高了并发性能,尤其适合构建高性能的Web服务和爬虫程序。 ### aiohttp客户端 aiohttp客户端提供了异步HTTP请求的功能,支持GET、POST等HTTP方法,以及...
在IT领域,Web服务器是互联网基础设施的关键组成部分,它们负责接收HTTP请求并返回HTTP响应,使得用户能够访问网页和在线服务。本实例将带你走进Web服务器编程的世界,通过一个简单的实例来理解其工作原理。 首先,...
Retrofit用于构建网络请求,Gson用于JSON数据的序列化和反序列化。 ```groovy dependencies { implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation '...
SpringMVC是Spring的一个模块,专门用于处理Web请求,它将模型、视图和控制器分离,增强了代码的组织性和可维护性。MyBatis则是一个持久层框架,简化了数据库操作,通过XML或注解的方式将SQL语句与Java代码关联。 1...
5. **多线程或异步处理**:为了处理并发请求,C-Web-Server可能会使用多线程或者异步I/O模型。这涉及到线程创建、同步机制如互斥锁、条件变量等,或者使用epoll等高效I/O模型。 6. **性能优化**:对于高性能Web...
在IT领域,C#是一种广泛使用的面向对象的编程语言,由微软公司开发,主要用于构建Windows桌面应用程序、Web应用程序以及各种服务。在这个特定的场景中,我们关注的是"C#简单的web服务器",这是一个利用C#语言实现的...
Ajax异步请求在提升Web应用性能和用户体验方面发挥着重要作用。结合加载效果,我们可以为用户提供一个流畅且反馈及时的交互环境,尤其是在处理长时间运行任务时。通过合理的设计和编程实践,我们可以让Ajax请求变得...