12 月 9 日,由 InfoQ 主办的中国技术开放日广州站将在广州四季酒店举行。我们邀请了来自腾讯、阿里、百度、唯品会的技术专家前来分享一线开发实践。本次开放日上,来自微信的高级工程师周志杰将分享《微信Mars:移动互联网下的高质量网络连接探索》,对于这个话题,InfoQ 采访了周志杰,了解微信Mars 是什么,以及微信在跨平台组件开发上的一些经验总结。
Mars 是微信官方的终端基础组件,是一个使用 C++ 编写的业务性无关,平台性无关的基础组件。目前已接入微信 Android、iOS、Mac、Windows、WP 等客户端。现正在筹备开源中,它主要包括以下几个部分:
- COMM:基础库,包括 socket、线程、消息队列、协程等基础工具;
- XLOG:通用日志模块,充分考虑移动终端的特点,提供高性能、高可用、安全性、容错性的日志功能;
- SDT:网络诊断模块;
- STN:信令传输网络模块,负责终端与服务器的小数据信令通道。包含了微信终端在移动网络上的大量优化经验与成果,经历了微信海量用户的考验。
其中 STN(信令传输网络)为核心模块。
Mars 最早起源于微信的实际发展需要。由于微信多平台、亿级用户,微信基础功能的修改影响重大。但不同平台不同的实现导致众多平台上很难统一,一方面不利于质量把关,可能存在重大隐患,一方面也不利于微信对基础研究的深入。因此,微信开始了跨平台基础组件的开发,并且在微信中沉淀多年。随着基础组件的发展与稳定,他们希望通过开源的力量进一步的提升微信的基础,并且也期待行业的互相交流与促进,因此启动了 Mars 项目。
微信的网络层设计到很多不同的业务,在微信中使用到的绝大部分功能,都是基于 Mars 提供的网络组件,包括文本消息、语音消息、朋友圈等核心功能。只有少部分业务不在范围内,例如 VOIP、Webview 等。微信中使用到的网络服务,大体分为两种类型:信令网络、数据网络。其中 STN 负责信令网络,CDN 组件则负责数据网络。但由于 CDN 涉及到腾讯内部的 CDN 服务,因此在 Mars 的开源列表中并没有包含 CDN 部分。
SDT 网络诊断模块提供了最基础的检测能力,需要由使用者自己组合使用。各个平台的 Reachability API 能反映的情况有局限,无法应对复杂的网络诊断,事实上有一些开源项目就是为了替换系统 API。微信由于自身特点对网络诊断要求很高,因此将它作为基础的跨平台组件进行开发维护。
STN 是微信的信令传输网络,也可以认为是小数据传输网络,是微信日常中使用最频繁的网络通道。在开源设计上,STN 抽象了微信的使用模型,使得 STN 成为业务无关的网络通道,并且应用到了包括微信在内的多个腾讯内部应用中。与 AFNetworking、Retrofit、Okhttp 等框架不同,STN 不仅是跨平台的网络解决框架,更是着重了“移动互联网“这一特点,结合移动互联网的不稳定特性,做了大量的优化工作,并且这些优化都是经过了微信长时间的验证和使用的。除此之外,STN 中还包含了很多其他方面的实用设计,包括自定义 DNS、容灾设计、负载考量、APP 的前后台考量、休眠机制考量、省电机制等等。
在实际的使用上,STN 也提供了比其它网络框架更多的空间:
- 数据监控:STN 提供了许多数据回调接口,使得应用可以基于这些网络数据,建立统计分析、监控等工具来管理应用的实际网络情况;
- 问题定位:STN 中含有很多关键日志,并且日志的设计已经帮助微信定位了很多的网络层问题。结合 Mars 提供的 XLOG 日志机制,应用可以运行时也打开日志,非常方便定位;
- 参数配置:STN 中将很多参数抽离为配置,使得应用可以根据自己的情况进行修改。
网络通道上,目前 STN 提供了长连、短连两种类型的通道,用于满足不同的需求。使用 STN 后,应用开发者只需关注业务开发。移动互联网的各种“坑”则可以交由 STN 帮你处理。
微信 Mars 跨平台组件开发经验
客户端的跨平台组件一般是指由 C++ 等编写的代码,编译为各个平台的二进制链接库,然后通过平台提供的 SDK 调用和打包进 App 内。跨平台组件一般都是底层功能,特点是与平台无关、与 UI 界面无关,像第三方的游戏引擎、数据库等一般都以跨平台形式出现。
跨平台组件可以实现一份代码到处运行,减少开发和维护的精力,因此,当移动开发团队扩大、业务规模膨胀的时候,将一些通用的、易出问题的底层功能提取出来做成跨平台组件很有必要。
网络层其实和系统以及 UI 界面的耦合很小,除了硬件设备相关、WebView 等需要依赖系统的部分外,网络层几乎都可以实现跨平台,一份代码。但微信会将能抽象成通用模型、通用能力的部分考虑以组件的形式跨平台。
跨平台组件在开发过程中需要注意的地方,也和一般的移动开发有所不同。微信在 Mars 的开发中,会以高可用、高性能、低负载、容灾性等目标来要求。
跨平台组件开发的难点在于,跨平台方案需要考虑各种平台上的 API 兼容性问题,在技术选型上需要付出更多的努力;需要考虑不同平台的特性,例如休眠机制等,根据不同的特性进行设计;跨平台的基础组件需要将问题进行更加本质的思考,避免复杂方案,避免方案的频繁变更等。
另外,跨平台组件由于对应用的影响很大,对它的稳定性和测试都要求更高。不过,只要设计良好,跨平台组件并不会对应用的稳定性造成威胁。从目前微信的使用情况来看,跨平台组件带来的 Crash 在总体中占比较小。测试方面,微信在各平台上有相应的测试工具,同时也有较多的自动化测试,能保障组件的稳健性。同时针对组件的某些特性,他们也有设计专门的测试场景。
Mars 将在不久的将来进行开源,并且微信会持续的维护 Mars 开源项目。
参考链接:
评论