携程开发总监无线App在网络性能方面的优化实践和方
案
专家介绍陈浩然
携程负责无线基础技术的高级开发总监本文由陈浩然于2016年8月,WOT2016移动互联网技术峰会性能专场《无线App网络服务通道治理和性能优化》主题演讲整理而成。分享了携程APP在网络性能方面一些优化实践和方案。携程无线网络服务通道架构
2016年年初,携程无线网络服务通道的架构图,其中无线APP有两个通道:一是Native,基于TCP设计的一套网络服务通道,连了TCP Gateway;二是Hybrid,用GS写界面,最后是通过传统的HTTP请求到达HTTP Gateway,TCP Gateway和HTTP Gateway最终链接到对应的SOA服务。APP端是通过TCP连接连到TCP Gateway,转化后通过HTTP 请求转化到后端一个标准的SOA接口当中,是一个标准的HTTP协议,前端通过TCP连接。
陈浩然在演讲中表示,TCP协议是传统协议,位于第三层,只控制网络层的传输协议,到了应用层还是需要设计一层应用层协议,类似RPC机制。携程的TCP Gateway分为两个部分:第一部分是在接入层管理TCP连接,主要基于Netty 实现,负责App端TCP连接管理;第二部分是在路由层,
基于Netty Zuul对服务进行路由、监控、安全、鉴权方面的管理。
“实现方式就是一个可插件式的中间件,不同插件实现不同功能,如路由、安全、鉴权,数据格式最新的是基于Protocol Buffers实现的。”
HTTP Gateway功能较为简单,直接负责HTTP请求转发,路由层也是基于Zuul实现,功能上和TCP Gateway非常接近,数据格式就是传统JSON数据格式。
之所以需要Gateway,是因为携程业务很多,目前有20多个事业部,每个事业部有自己的服务集,如果将所有的服务集耦合在一起,每个BU的发布都会影响到其他BU。而设置Gateway进行服务转化,后端所有业务逻辑是完全分割开来的,相应的部署、发布、监控都是完全割离开来的,这样可以避免干扰,提升效率。
TCP与HTTP协议优劣势对比谈及为什么要基于TCP实现时,陈浩然认为,主要是与HTTP协议对比得出的结论。HTTP 协议优势非常明显,封装性好,HTTP协议更标准化,客户端和服务端解决方案相对成熟。但是劣势在于可控性很差,受网络影响严重,像HTTP1.1协议里的KeepAlive、Pipeline 这些机制很难发挥作用。
而TCP协议做网络服务,优势是可以针对网络连接、发送请求和接受响应,不同阶段可以完全分割很清楚,可以针对
不同阶段做定制性优化。劣势是实现很复杂,因为要实现自己的应用层协议,开发成本和复杂度都比较高。
优化APP网络服务全生命周期App对网络环境要求较高,不同的网络类型带宽和延迟差别非常大,其中延迟对网络性能影响最大。虽然服务端做了很多优化,但是如果网络性能不佳,依然会带来较大延迟,优化效果不如在App端做优化更好。
App网络服务生命周期划分为六个部分:DNS解析建立连接序列化网络请求报文发送网络请求接受网络响应反序列化网络响应报文。
“携程的做法是把生命周期每个步骤都进行细化,针对每个阶段进行优化。”
DNS解析的优化DNS解析阶段有三个问题:一是解析有1%失败概率,二是域名解析地址影响网络服务,三是解析耗时容易产生延迟。
DNS解析优化有两种解决方案:自建HTTP-DNS,用IP地址访问,发一个HTTP请求上来访问DNS服务器,可以根据客户端IP地址,告诉最合适服务端的IP地址是多少,但服务端开发部署成本比较高,而且第一次还是要发
HTTP-DNS服务,前置服务带来额外延迟;在App端内置服务器IP列表,彻底取消DNS解析,但是客户
端如何能够快速知道哪个服务端IP地址最好,需要自行判断。
携程采取的解决方法是在App内置服务IP列表,每个IP都有一个权重机制,会根据每次网络服务选择权重最高的IP
地址。IP权重如何计算?携程在客户端用Ping值,每个服务IP启动之后立刻进行Ping值,根据Ping值的延迟时间进行计算,Ping值最低的权重最高,如果Ping不通可能是权重为零,最差的服务端地址。在网络环境切换时,IP权重会重新计算。
TCP连接的优化这方面优化的重点是保持长连接。如果每次都建立连接整体耗时会非常大,用户体验非常差。
携程的做法是配置一个TCP长连接池,专门用来存放长连接,根据网络环境不同更新连接池大小的上线。每次网络服务要发一个网络请求,用户点击查询,会优先从长连接中拿出一个空闲长连接出来进行网络服务,发完收到响应一切都成功了,会再将空闲长连接放回到连接池当中,等待下一次网络服务发起。如果TCP长连接服务失败,也会用短连接进行重试,会有一些限制条件,实际上是长短结合的概念。为了简单处理目前还没有支持Pipeline或者是Multiplexing机制。
弱网和网络抖动情况优化携程会根据网络类型以及端到端
前端优化性能的方法
的Ping值进行计算,首先将当前网络质量划分为好、中、差、非常差四类网络质量参数,然后根据参数调整长连接个数,在4G/WIFI会增加长连接池大小,目前长连接池是四个。其
次根据网络质量参数调整TCP连接、发送请求,以及调整write或者read的超时时间。第三个方法是当网络类型切换时,一旦客户端IP变化,直接关闭所有长连接,现有正在发的网络服务会进行自动重试。
数据格式优化之前携程App是使用自定义数据格式。后来调研了Protocol Buffers、Flat Buffers、Thrift这几种比较常见的格式,最终选用了Protocol Buffers。
在携程特定的数据类型下,数据包大小可以降低,相对于之前的数据格式大小降低了20%-30%。序列化、反序列化时间也是可以降低10%-20%。
如果大家自己开发这样一个网络协议,数据格式主要是考察两点:一个是数据包大小,一个是序列化和反序列化时间。数据包大小更重要,因为如果数据包太小,网络服务在传输过程中非常耗时。
“我的感触主要有两点:一是尽量减少网络连接时间,第二个尽量减少传输Size,尽量减少网络带宽和延迟的影响,延迟是必不可免的,带宽是受限制的,数据量越小越好,同时也是连接越少越好。”
陈浩然认为选择格式和自身业务类型相关,Flat Buffers更适合于社交关系型数据存储。而Thrift不单单是一个数据格式的解决方案,更多是IPC解决方案,包含了一个完整IPC解决方案。陈浩然告诉听众,Fac
ebook的App就使用Flat
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论