返回 登录
5

提升网络联通率至99.92%,唯品会智能路由的系统设计和性能优化实践

摘要:智能路由系统的难点是快速响应、系统可靠以及在省电和性能间找到平衡。因此唯品会在CDN基础上,对移动设备进行优选算法,选择最佳路由,并以性能有先为考量,通过Common C ++ Libaray和Protobuf 提高性能。

一、 打造智能路由系统的价值

据Akamai、Amazon和Google的数据统计,50%以上的互联网用户,期望一个页面加载时间在2秒以内。

  • Akamai:页面加载超过3分钟,79%的用户将会永久离开。
  • Amazon: 亚马逊每个页面如果延迟1秒加载,将会造成16亿美元的损失。
  • Google:每个搜索结果显示延迟0.1秒,将损失数百万计的广告。

无论是产品还是开发人员,一定要有这样一个概念:速度非常重要。网络的响应时间及网络联通率是关系到业务发展的关键因素,唯品会研究院设计了新一代的应用网络系统:智能路由。开启路由系统后,降低了响应时间,同时网络联通率从99.53%提升到99.92%。(大公司需要这样做,对小公司而言,更需要这样做,因为用户忍耐度更低,用户流失率更大。)

二、 唯品会智能路由系统的构建

图片描述

唯品会智能路由系统组成

1. 智能路由系统的核心

即需要解决的问题,是在手机端直接完成域名到IP的转换。

2. 智能路由系统设计的难点

(1)如何快速响应,快速筛选最佳节点。
(2)如何让系统可靠,在最坏的情况下如何处理(找不到对应IP的时候,将原来的域名返回出去,不影响域名的正常解析)。
(3)如何在app体积、省电、性能优先间进行平衡设计。

省电是必须要考虑的。智能路由最耗电的是在探测部分。所以需要合理控制探测的时机和频率。探测发起是有一定条件的,只有程序启动、网络发生切换且在20分钟以上、或者发现某组ip都不可使用的情况,才会发起探测。其次,当应用进入后台的时候,也是不应该发生探测服务的。

3. 智能路由系统的技术选型

(1) 为了提高性能,唯品会做了几个方面的事情。

① 选用C++跨平台开发,解决复杂的Andriod端问题
唯品会在移动端要跨平台同时支持安卓和iOS,因此选择了性能友好的C++,底层是common C++ Library。
② 采用多线程技术,缩短探测时间
利用多线程技术并行探测,能缩短探测时间,提升探测效率。
③ 对探测的IP进行改造

图片描述

改造探测IP图

上图所示,左边是逐个探测过程,右边改成批量探测,比如说域名1、2、3对应的是同一个IP的节点,结合多线程与批量探测技术,唯品会能够做到一次性对所有节点做完探测。

④ 弃用数据库,选择缓存路由表

图片描述

唯品会自定义路由表结构图

唯品会自定义了路由表结构,它本质上更符合数据库的概念。如果用数据库,Andriod 端会出现很多问题,如果用C++做数据库,需要引入一个C++,如果不用C++ ,通过Java来做,会带来性能的损失。我们自己写文件,将批量探测的结构,以类似数据库的形式缓存下来,便于后续的查询、删除、修改等。

⑤ 利用三层Map结构,完成快速的批量探测

图片描述

三层map结构图

如上图所示,左边是两个三层的map,第一个map通过域名和网络快速查找IP,它主要是方便App的使用,右边是提供一个IP,快速找到一组域名,并进行快速的批量探测。有了这两个map后,一个App如果第二次启动,便可立刻接受服务。

⑥ 无缝合并路由表

如果配置发生变化,需要重新拉取配置,两个map数据发生变化时该如何处理?

图片描述

△无缝合并路由表

对此,我们的解决办法是这个时间不提供服务,等该map新生的配置全部弄好后,把map替换掉,为了在更新map的过程中也可以提供服务,我们采用无缝合并路由表并引入自研C++开发读写锁。

⑦ 使用了Protobuf协议来提高通讯的效率

Protobuf,是一种跨语言、多平台、具有非常良好拓展性的结构化数据协议。有着非常快的解析速度和较小的空间占用。

和json或xml相比,Protobuf会明显减少占用空间。这样网络上传输的数据就会减少,从而一定程度上提高性能。另外一般情况下,Protobuf比xml或json的解析速度也要快很多。使用protobuf需要服务器和客户端同时支持。

(2)踩过的坑

① Open SSL

智能路由系统采用C++开发,但标准的C++不支持网络保护,唯品会使用了有安全漏洞的Open SSL库被谷歌应用市场以不符合要求为由拒绝,最终升级Open SSL库得以解决。

② 对埋点的影响

智能路由系统会在短时间内进行大量探测,如果对探测的结果都进行埋点,客户端埋点系统需要支持缓存和批量埋点上报,否则影响客户端应用性能。

因此如果需要大批量埋点上报,埋点系统本身要做的更健全和可靠,且埋点本身支持批量上报,减少带宽。

③ Android跨域重定向失败

App 为了可以IP直连,唯品会使用了标准的Host Header表示原来的domain,但Android 使用的Apache HttpClient copy 了original request 里的Headers,导致跨域重定向失败。

解决方案有以下几种:使用定制的Header;改造网络库;修改服务端代码,除去重定向;对于有重定向的,暂时不去做IP直连。

(3)Crash经验分享

因为安卓机型复杂很难定位,智能路由项目最大的挑战是面对C++和Crash的问题。对此我们有几点经验分享:

① 明确C++Crash如何定位;
② 需要考虑JNI层的内存泄漏问题,避免内存泄漏小问题日积月累造成较大影响;
③ 捕获并处理异常;
④ 采用多线程技术时小心使用锁。

以上内容来自唯品会资深开发工程师赵勇在又拍云 Open Talk 唯品会专场“如何打造高性能高可用的电商平台”的分享,演讲题目为:《新一代应用网络系统-智能路由》。又拍云 Open Talk 将用全干货的形态,为互联网从业人员呈现以技术为主,同时涵盖产品、营销、融资等各个方面的专业知识,帮助企业成员不断提升自身专业技能,推动企业快速发展。

作者:赵勇 唯品会资深开发工程师,唯品会智能路由项目核心开发成员。同济大学硕士毕业,曾在Autodesk任职,有10余年软件开发经验。目前主要负责Android、AR相关项目的架构设计及开发工作。
责编:钱曙光,关注架构和算法领域,寻求报道或者投稿请发邮件qianshg@csdn.net,另有「CSDN 高级架构师群」,内有诸多知名互联网公司的大牛架构师,欢迎架构师加微信qianshuguangarch申请入群,备注姓名+公司+职位。

评论