写点什么

微信 Mars:客户端跨平台组件的开发经验

2016 年 11 月 27 日

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 也提供了比其它网络框架更多的空间:

  1. 数据监控:STN 提供了许多数据回调接口,使得应用可以基于这些网络数据,建立统计分析、监控等工具来管理应用的实际网络情况;
  2. 问题定位:STN 中含有很多关键日志,并且日志的设计已经帮助微信定位了很多的网络层问题。结合 Mars 提供的 XLOG 日志机制,应用可以运行时也打开日志,非常方便定位;
  3. 参数配置:STN 中将很多参数抽离为配置,使得应用可以根据自己的情况进行修改。

网络通道上,目前 STN 提供了长连、短连两种类型的通道,用于满足不同的需求。使用 STN 后,应用开发者只需关注业务开发。移动互联网的各种“坑”则可以交由 STN 帮你处理。

微信 Mars 跨平台组件开发经验

客户端的跨平台组件一般是指由 C++ 等编写的代码,编译为各个平台的二进制链接库,然后通过平台提供的 SDK 调用和打包进 App 内。跨平台组件一般都是底层功能,特点是与平台无关、与 UI 界面无关,像第三方的游戏引擎、数据库等一般都以跨平台形式出现。

跨平台组件可以实现一份代码到处运行,减少开发和维护的精力,因此,当移动开发团队扩大、业务规模膨胀的时候,将一些通用的、易出问题的底层功能提取出来做成跨平台组件很有必要。

网络层其实和系统以及 UI 界面的耦合很小,除了硬件设备相关、WebView 等需要依赖系统的部分外,网络层几乎都可以实现跨平台,一份代码。但微信会将能抽象成通用模型、通用能力的部分考虑以组件的形式跨平台。

跨平台组件在开发过程中需要注意的地方,也和一般的移动开发有所不同。微信在 Mars 的开发中,会以高可用、高性能、低负载、容灾性等目标来要求。

跨平台组件开发的难点在于,跨平台方案需要考虑各种平台上的 API 兼容性问题,在技术选型上需要付出更多的努力;需要考虑不同平台的特性,例如休眠机制等,根据不同的特性进行设计;跨平台的基础组件需要将问题进行更加本质的思考,避免复杂方案,避免方案的频繁变更等。

另外,跨平台组件由于对应用的影响很大,对它的稳定性和测试都要求更高。不过,只要设计良好,跨平台组件并不会对应用的稳定性造成威胁。从目前微信的使用情况来看,跨平台组件带来的 Crash 在总体中占比较小。测试方面,微信在各平台上有相应的测试工具,同时也有较多的自动化测试,能保障组件的稳健性。同时针对组件的某些特性,他们也有设计专门的测试场景。

Mars 将在不久的将来进行开源,并且微信会持续的维护 Mars 开源项目。

参考链接:

GMTC PPT:微信客户端怎样应对弱网络

微信终端跨平台组件 mars 系列(一) - 高性能日志模块 xlog

2016 年 11 月 27 日 21:009487
用户头像

发布了 134 篇内容, 共 89.4 次阅读, 收获喜欢 375 次。

关注

评论

发布
暂无评论
发现更多内容

学习python(嵩天老师的课)

Geek_2a27b0

区块链技术助力甘肃建食安信息追溯平台 为食品安全“立规矩”

CECBC区块链专委会

食品追溯 食品安全

INT类型知多少

Simon

MySQL

开源,轻松实现RTC与SIP互通

anyRTC开发者

WebRTC 编码 SIP 源码解析

linux入门系列7--管道符、重定向、环境变量

黑马腾云

Linux centos 运维 linux命令 管道符

英伟达收购ARM:双赢还是灾难?

脑极体

英特尔神经拟态芯片Loihi大显身手 帮助轮椅上的儿童实现独立生活

飞天鱼2017

物联网SIM卡和SIM卡真的不是一回事

华为云开发者社区

人工智能 物联网 华为云 传感器 SIM卡

linux入门系列9--用户管理及文件权限控制

黑马腾云

Linux centos centos7 linux运维 linux用户权限

【Kafka】消费者客户端小结(java)

guoguo 👻

可能是首个支持部署 Deno 前后端应用的部署工具

binggg

taro GitHub 前端 deno Node

35岁大厂程序员被劝退!老板说:没年轻人有冲劲!真有内味了吗?

程序员生活志

程序员 职场

学习笔记

Qx

学习

jQuery笔记

一个坚强的小怪兽

jquery

区块链的想象,解决贫富差距

CECBC区块链专委会

区块链 货币 股市

非IT行业大企程序员讲述MIS系统开发案例

Learun

敏捷开发 企业信息化 企业管理 .net core 「Java 25周年」

网页游戏

小端taro

Devops与敏捷二者能否结合?

陈琦

DevOps Scrum 敏捷开发

linux入门系列10--firewalld防火墙管理

黑马腾云

Linux centos 防火墙 linux运维 linux防火墙

没有一个冬天不会过去!疫情当下,企业“逆势而上”必选“上云”跑道

华为云开发者社区

云计算 新基建 华为云 企业上云 云服务器

​JDK1.8新特性(八):还在重复写空指针检查代码?赶紧使用Optional吧!​

xcbeyond

Java 新特性 JDK1.8 Optional

CHAR与VARCHAR详解

Simon

MySQL

JVM原理与实战

东哥

linux入门系列8--shell编程入门

黑马腾云

Linux centos Shell linux命令 linux编程

要老婆吗? AR一键生成的那种

程序员生活志

内容审核平台助力猫爪构建健康安全的社交环境

百度大脑

人工智能 百度 百度大脑 内容审核

终极学习法,你能学会任何东西--程序员的学习之路

盛安德软件

第11周作业

娄江国

第11周总结

娄江国

全票通过!易观开源项目DolphinScheduler进入Apache孵化器

易观大数据

企业信息化怎么构建?

代码制造者

大数据 低代码 企业信息化 零代码 编程开发

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

微信Mars:客户端跨平台组件的开发经验-InfoQ