默认
打赏 发表评论 9
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
微信Mars:微信内部正在使用的网络层封装库,即将开源
阅读(138552) | 评论(9 收藏3 淘帖2 1
微信扫一扫关注!

前言


最近都在盛传,微信经多年积累并广泛应用于微信APP的跨平台可重用网络层库Mars即将开源,这是个绝好的消息。若Mars能开源,必将为IM及相关技术应用领域的同行带来很多有价值的实践成果,毕竟微信的体量和应用规模决定了技术的高度,值得同行学习和关注。本文将简要介绍Mars。

微信移动端应对弱网络情况的探索和实践PPT [附件下载]》一文中的PPT内容分享的是微信Mars早期的一些思考、实践和总结,也值得有经验的同行一窥究竟。

微信Mars简介


Mars 是微信官方的终端基础组件,是一个使用 C++ 编写的业务性无关,平台性无关的基础组件。目前已接入微信 Android、iOS、Mac、Windows、WP 等客户端。现正在筹备开源中,它主要包括以下几个部分:

  • COMM:基础库,包括socket、线程、消息队列、协程等基础工具;
  • XLOG:通用日志模块,充分考虑移动终端的特点,提供高性能、高可用、安全性、容错性的日志功能;
  • SDT:网络诊断模块;
  • STN:信令传输网络模块,负责终端与服务器的小数据信令通道。包含了微信终端在移动网络上的大量优化经验与成果,经历了微信海量用户的考验。

其中STN(信令传输网络)为核心模块。

Mars的架构如下:

微信Mars:微信内部正在使用的网络层封装库,即将开源_mars.png

特别介绍STN模块


STN作为信令传输模块,与目前常用的网络组件如AFNetworking(用于iOS平台)、Retrofit、OkHttp(用于Android平台)相比,STN是跨平台的,基于Socket层的信令网络,主要用于小数据传输。

它的特点包括:

  • 提供长连、短连两种网络通道
  • 贴合移动互联网的网络层解决方案
  • 贴合移动终端的平台特性:前后台、活跃态、休眠、省电、省流量等

在Mars STN的连接策略上,面临诸多困难,如Connect超时的选择,需要同时考虑到可用性和网络敏感性,而官方提供的默认实现因为运营商和平台差异等等实际上不可用。这部分需要根据对不同平台的了解制定灵活的策略。除此之外,还有连接效率、复合连接等等问题。

连接超时机制对于IM来说也是一个坑点,STN通过分层设计和多级超时来解决这个问题。

微信Mars源起


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开源项目。

(原文链接:http://www.infoq.com/cn/news/2016/11/weixin-mars

附录:相关文章汇总


[1] 有关QQ、微信的技术文章:
微信后台团队:微信后台异步消息队列的优化升级实践分享
微信团队原创分享:微信客户端SQLite数据库损坏修复实践
腾讯原创分享(一):如何大幅提升移动网络下手机QQ的图片传输速度和成功率
腾讯原创分享(二):如何大幅压缩移动网络下APP的流量消耗(下篇)
腾讯原创分享(二):如何大幅压缩移动网络下APP的流量消耗(上篇)
微信Mars:微信内部正在使用的网络层封装库,即将开源
如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源
开源libco库:单机千万连接、支撑微信8亿用户的后台框架基石 [源码下载]
微信新一代通信安全解决方案:基于TLS1.3的MMTLS详解
微信团队原创分享:Android版微信后台保活实战分享(进程保活篇)
微信团队原创分享:Android版微信后台保活实战分享(网络保活篇)
Android版微信从300KB到30MB的技术演进(PPT讲稿) [附件下载]
微信团队原创分享:Android版微信从300KB到30MB的技术演进
微信技术总监谈架构:微信之道——大道至简(演讲全文)
微信技术总监谈架构:微信之道——大道至简(PPT讲稿) [附件下载]
如何解读《微信技术总监谈架构:微信之道——大道至简》
微信海量用户背后的后台系统存储架构(视频+PPT) [附件下载]
微信异步化改造实践:8亿月活、单机千万连接背后的后台解决方案
微信朋友圈海量技术之道PPT [附件下载]
微信对网络影响的技术试验及分析(论文全文)
一份微信后台技术架构的总结性笔记
架构之道:3个程序员成就微信朋友圈日均10亿发布量[有视频]
快速裂变:见证微信强大后台架构从0到1的演进历程(一)
快速裂变:见证微信强大后台架构从0到1的演进历程(二)
微信团队原创分享:Android内存泄漏监控和优化技巧总结
全面总结iOS版微信升级iOS9遇到的各种“坑”
微信团队原创资源混淆工具:让你的APK立减1M
微信团队原创Android资源混淆工具:AndResGuard [有源码]
Android版微信安装包“减肥”实战记录
iOS版微信安装包“减肥”实战记录
移动端IM实践:iOS版微信界面卡顿监测方案
微信“红包照片”背后的技术难题
移动端IM实践:iOS版微信小视频功能技术方案实录
移动端IM实践:Android版微信如何大幅提升交互性能(一)
移动端IM实践:Android版微信如何大幅提升交互性能(二)
移动端IM实践:实现Android版微信的智能心跳机制
移动端IM实践:WhatsApp、Line、微信的心跳策略分析
移动端IM实践:谷歌消息推送服务(GCM)研究(来自微信)
移动端IM实践:iOS版微信的多设备字体适配方案探讨
>> 更多同类文章 ……

[2] 有关QQ、微信的技术故事:
技术往事:创业初期的腾讯——16年前的冬天,谁动了马化腾的代码
技术往事:史上最全QQ图标变迁过程,追寻IM巨人的演进历史
开发往事:深度讲述2010到2015,微信一路风雨的背后
开发往事:微信千年不变的那张闪屏图片的由来
开发往事:记录微信3.0版背后的故事(距微信1.0发布9个月时)
一个微信实习生自述:我眼中的微信开发团队
>> 更多同类文章 ……

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:请教下开发一套有基本加好友,可以互相聊天的手机im要多少钱?下一篇:我的IM即时群聊感觉收消息很卡很慢(1秒一条),该怎么处理

本帖已收录至以下技术专辑

推荐方案
评论 9
好东西,mark
签名: 该会员没有填写今日想说内容.
微信Mars要是开源了,还真值得好好研究一下,以微信所追求的品质,这东西不会差。
引用:JackJiang 发表于 2016-12-06 09:42
微信Mars要是开源了,还真值得好好研究一下,以微信所追求的品质,这东西不会差。

有Mars什么时候开源的消息吗?
签名: 该会员没有填写今日想说内容.
引用:kezhaoyuan 发表于 2016-12-06 10:18
有Mars什么时候开源的消息吗?

没有确切的消息,依照微信团队的作风,应该会整理的比较好才会放出来。话都说的这么亮了,肯定会放出源码,不然也拉不下这个脸。但这玩意因为涉及到微信还比较重要的技术层面的东西,开源出来的也肯定不会跟微信内部使用的是同一个版本,习惯上来说肯定会阉割,估计这段时间是在做这些取舍吧。
很好奇这玩意写成什么样,如果真是超内聚、使用简单的lib级别,那就真是好东西
不错,看看微信到底用的怎么样的协议
签名: 地方
引用:hhgzasjkl 发表于 2016-12-06 17:07
不错,看看微信到底用的怎么样的协议

这一层不会涉及到具体的协议的。
现在都2021了,开源了吗
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部