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