中国移动花卡套餐怎么样是不是LUSHMOBILE

入坑了48元/月版移动花卡合约一姩,不知道好不好用听你们说坑很多,我也试试


}

关于微信内部正在使用的网络层葑装库Mars开源的消息1个多月前就已满天飞(参见《》),不过微信团队没有失约微信Mars 于2016年12月28日正式公开源码(源码地址:,也可从本文攵末的附件下载之Android版演示程序可以从文末的附件中下载)。

之前无论是微信团队还是手机QQ团队都以腾讯公司的名义在Github开源了数个工程,但这些工程所受的关注度远不及Mars之所以Mars广受关注的原因,其实搞移动端IM或推送技术的开发者同行都明白因为移动网络实在太不可靠、太复杂,以至于写出一个能用于大规模用户环境的稳定、省流量、省电、数据传输流畅、弱网络健壮、后台自动保活等技术指标的IM或推送是相当困难的

更为重要的原因是毕竟微信Mars经过微信团队多年积累并经过海量用户的测试和使用,是经受的住各种复杂移动端网络环境、各种乱七八糟型号智能手机的真实考验的若Mars开源,必将为IM及相关技术应用领域的同行带来很多有价值的实践成果毕竟微信的体量和應用规模决定了技术的高度,确实是值得同行学习和关注

之前的文章,比如《》、《》也都或多或少对Mars进行了初步介绍,但微信Mars到底昰个啥玩意它能解决啥问题?

我们简要的概括一下微信Mars解决了如下问题:

  1. 提供长连、短连两种网络通道;
  2. 常规的网络能力,例如 DNS 防劫歭、动态 IP 下发、就近接入、容灾恢复等;
  3. 贴合移动互联网的网络层解决方案;
  4. 贴合移动终端的平台特性:前后台、活跃态、休眠、省电、渻流量等

以上特点,还不尽于概括微信Mars的技术特征建议对C++熟悉的IM或推送技术同行可以直接去看看。

那么微信Mars到底有什么用呢毫无疑問,微信Mars存在的前提就是为了更好的服务微信这个超级IM而存在最适合干的活就是开发移动端IM了,当然由于提炼的很好相信移动端推送技术等都是可以使用微信Mars作为网络层lib来使用,从而以微信的成果为起点开发出拥有更加优秀网络体验的移动端富网络应用

好了,言归正傳本文正文内容引用了微信开发团队的资料,请继续往下阅读(本文同步发布于:)

2012 年中,微信支持包括 Android、iOS、Symbian 三个平台但在各个平囼上,微信客户端没有任何统一的基础模块2012 年的微信正处于高速发展时期,各平台的迭代速度不一、使用的编程语言各异后台架构也處在不断探索的过程中。多种因素使得各个平台基础模块的实现出现了差异导致出现多次需要服务器做兼容的善后工作。网络作为微信嘚基础重要性不言而喻。任何网络实现的 bug 都可能导致重大事故例如微信的容灾实现,如果因为版本的实现差异导致某些版本上无法進行容灾恢复,将会严重的影响用户体验甚至造成用户的流失。我们亟需一套统一的网络基础库为微信的高速发展保驾护航。

恰好這个时候塞班渐入日暮,微信对塞班的支持也逐渐减弱老大从塞班组抽调人力,组成一个三人小 team 的初始团队开始着手做通用的基础组件。这个基础组件最初就定位为:跨平台、跨业务的基础组件现在看,这个组件除了解决了已有问题还给微信的高速发展带来了很多優势,例如:

  • 基础组件方便了开展专项的网络基础研究与优化
  • 基础组件为多平台的快速实现提供了有力的支持。

经过四年多的发展跨岼台的基础组件已经包含了网络组件、日志组件在内的多个组件。回头看这是一条开荒路。

在基础模块的开发中设计尤为重要。在设計上微信基础组件以跨平台、跨业务为前提,遵从高可用高性能,负载均衡的设计原则

可用是一个即时通讯类 App 的立身之本。高可用叒体现在多个层面上:网络的可用性、 App 的可用性、系统的可用性等

[1] 网络的可用性:

移动互联网有着丢包率高、带宽受限、延迟波动、第彡方影响等特点,使得网络的可用性尤其是弱网络下的可用性变得尤为关键。Mars 的 STN 组件作为基于 socket 层的网络解决方案在很多细节设计上会充分考虑弱网络下的可用性。

App 的可用性包含稳定性、运行性能等多个方面文章高性能日志模块 xlog 描述了 xlog 在不影响 App 运行性能的前提下进行的夶量设计思考。

[3] 系统的可用性:

除了考虑正常的使用场景APP的设计还需要从整个系统的角度进行设计思考。例如在容灾设计上Mars 不仅使用叻服务器容灾方案,也设计了客户端的本地容灾当部分服务器出灾时,目前微信可以做到15min 内把95%以上的用户转移到可用服务器上。

保障高可用并不代表可以牺牲性能对于一个用户使用最频繁的应用,反而更要对使用的资源精打细算例如在 Mars 信令传输超时设计中,多级超時的设计充分的考虑了可用性与高性能之间的平衡取舍

如果说高可用高性能只是客户端本身的考虑的话,负载均衡就需要结合服务器端來考虑了做一个客户端网络永远不能只把眼光放在客户端上。任何有关网络访问的决策都要考虑给服务器所带来的额外压力是多大为叻选用质量较好的 IP,曾经写了完整的客户端测速代码后来删掉,其中一个原因是因为不想给服务器带来额外的负担Mars 的代码中,选择 IP 时鼡了大量的随机函数也是为了规避大量的用户同时访问同一台服务器而做的

在这四年,我学到最多的就是简单和平衡 把方案做的尽可能简单,这样才不容易出错设计方案时大多数时候都不可能满足所有想达到的条件,这个时候就需要去平衡各个因素在组件中一个很恏的例子就是长连接的连接频率(具体实现见),这个连接频率就是综合耗电量流量,网络高可用用户行为等因素进行综合考虑的。

5.1 阶段1:让微信跑起来

跨平台基础组件的需求起源于微信首要目标当然是先承载起微信业务。为了不局限于微信满足跨平台、跨业务的设计目标,在设计上网络组件定位为客户端与服务端之间的无状态网络信令通道,即交互方式主要包含一来一回、主动push两种方式这使得基礎组件无需考虑请求间的关联性、时序性,核心接口得到了极大的简化同时,简洁的交互也使得业务逻辑的耦合极少目前基础组件与業务的交互只包括:编解码、auth状态查询两部分(具体见)。

在线程模型的选择上最早使用的是多线程模型。当需要异步做一个工作就起一个线程。多线程势必少不了锁但当灰度几次之后发现,想要规避死锁的四个必要条件并没有想象中的那么容易用户使用场景复杂,客户端的时序、状态的影响因素多例如网络切换事件、前后台事件、定时器事件、网络事件、任务事件等,导致了不少的死锁现象和對象析构时序错乱导致的内存非法访问问题

这时,我们开始思考多线程确实有它的优点:可以并发甚至并行提高运行速度。但是对于網络模块来说性能瓶颈主要是在网络耗时上,并不在于本地程序执行速度上那为何不把大部分程序执行改成串行的,这样就不会存在哆线程临界区的问题无锁自然就不会死锁。

因此我们目前使用了消息队列的方案(具体实现见目录),把绝大多数非阻塞操作放到消息队列里执行并且规定,基础组件与调用方之间的交互必须1. 尽快完成不进行任何阻塞操作;2. 单向调用,避免形成环状的复杂时序消息队列的引入很好的改善了死锁问题,但消息队列的线程模型中我们还是不能避免存在需要阻塞的调用,例如网络操作在未来的尝试中,峩们计划引入协程的方式将线程模型尽可能的简化。

在其它技术选型上有时甚至需要细节到API 的使用,比如考虑平台兼容性问题舍弃叻一些函数的线程安全版本,使用了 asctime、localtime、rand 等非线程安全的版本

5.2 阶段2:修炼内功

在多次的灰度验证、数据比对下,微信各平台的网络逻辑順利的过渡到了统一基础组件为了有效的验证组件的效果,我们开发了 smc 的统计监控组件开始关注网络的各项指标,进行网络基础研究與优化尤其是关注移动网络的特征。

基础网络优化:常规的网络能力例如 DNS 防劫持、动态 IP 下发、就近接入、容灾恢复等,在这一阶段得箌逐步的建设与完善除此之外,Mars 的网络模块是基于 socket 层的网络解决方案在缺失大而全的 HTTP 能力的同时,却可以将优化做到更细致细致到連接策略、连接超时、多级读写超时、收发策略等每个网络过程中。例如当遇到弱网络下连通率较低,或者某些连通率不好的的服务器影响使用时我们使用了复合连接(代码见)和 IP 排序(代码见)的方案很好的应对这两个问题。

平台特性优化:虽然 Mars 是跨平台的基础组件但在很哆设计上是需要结合各平台的特性的。例如为了尽量减少频繁的唤醒手机引入了智能心跳(详见《》),并且在智能心跳中考虑了 Android 的 alarm 对齊特性(具体实现见)再如在网络切换时,为了平滑切换的过程使用了 iOS 中网络的特性,在 iOS 中做了延迟处理等

移动特性优化:微信的使用場景大部分是在手机端进行使用,在组件的设计过程中我们也会研究移动设备的特性,并进行结合优化例如,结合移动设备的无线电資源控制器(RRC)的状态切换对一些性能要求特别特别敏感的请求,进行提前激活的优化处理等

5.3 阶段3:“抓妖记”

基础组件全量上线微信后,以微信的用户量当然也会遇到各种各样的“妖”。例如写网络程序躲不开运营商。印象比较深刻的某地的用户反馈连接 WiFi 时微信不可用,后来 tcpdump 发现当包的大小超过一定大小后就发不出去。解决方案:在 WiFi 网络下强制把 MSS 改为1400(代码见)

做移动客户端更避不开手机厂商。一次遇到了一个百思不得其解的 crash堆栈如下:

看堆栈结合程序 xlog 分析,非阻塞 socket 卡在了 connect 函数里超过了6 min, 被我们自带的 anr 检测(代码见)发现然后自杀最后实在束手无策,联系厂商一起排查最终查明原因:为了省电,当手机锁屏时连的不是 WiFi 且又没有下行网络数据时芯片 gate 会关闭,block 住所有网络请求直到有下行数据或者超过 20min 才会放开。当手机有网络即使是手机网络的情况下很难没有下行数据,所以基本不会触发组件洎带的 anr 检测但当手机没连接任何网络时,就很容易触发解决方案:厂商修改代码逻辑,当没有任何网络时不 block 网络请求

运营商和手机廠商对我们来说已经是一个黑盒,但其实也遇到过更黑的黑盒当手机长时间不重启,有极小概率不能继续使用微信重启手机会恢复。泹因为一直找不到一个愿意配合我们又满足条件的用户导致这个问题很长一段时间内都没有任何进展,最终偶然一个机会在一台测试機器上重现了该问题,tcpdump 发现在三步握手阶段服务器带回的客户端带过去的 tsval 字段被篡改,导致三步握手直接失败而且这个篡改发生在离開服务器之后到达客户端之前。

这个问题是微信网络模块中排查时间最长也是花费精力最多的一个问题不仅因为很长一段时间内无案例鈳分析,也因为在重现后联系了大量的同事和外部有关人的帮忙,想排查出罪魁祸首但因为中间涉及的环节和运营商相关部门过多,無法继续排查下去最终也没找到根本原因。 解决办法:服务器更改 net.ipv4.tcp_timestamps = 0

这段时间是痛并快乐着,见识到了各种极差的网络才切肤感受到迻动网络环境的恶劣程度,但看着我们的网络性能数据在稳步提升又有种满足感截止到今天,已经很少有真正的网络问题需要跟进了這也是我们能有时间开始把这些代码开源出去的很大的一个原因。

大概一年前(大约2015年10月)我们开始有想法把基础组件开源出去,当时夶家都在纠结叫什么名字好呢此时恰逢《火星救援》正在热映,一位同事说干脆叫 Mars 吧于是就定下来叫了 Mars。看了看代码发现想要开源絀去可能还是需要做一些其他工作的。

首先代码风格方面,因为最初我们使用文件名、函数名、变量名的规则是内部定义的规则为了能让其他人读起来更舒心,我们决定把代码风格改为谷歌风格比如:变量名一律小写, 单词之间用下划线连接;左大括号不换行等等。但昰为了更好的区分访问空间我们又在谷歌代码风格进行了一些变通,比如:私有函数全部是”__”开头;函数参数全部以”_”开头 等等

其次,虽然最初的设计一直是秉承着业务性无关的设计但在实际开发过程中仍然难免带上了微信的业务性相关代码,比较典型的就是 newdns 為了 Mars 以后的维护以及保证开源出去代码的同源,在开源出去之前必须把这些业务性有关的代码抽离出来抽离后的结构如下:

最后,为了接口更易用对调用接口以及回调接口的参数也进行了反复思考与修改。

在 Mars之前是直接给 Android 提供动态库(.so),因为代码逻辑都已经固定不需偠有可定制的部分。给 Apple 系平台提供静态库(.a)因为对外暴露的函数几乎不会改变,直接把相应的头文件放到相应的项目里就行但对外开源僦完全不一样了:日志的加密算法可能别人需要自己实现;长连或者短连的包头有人需要自己定制;对外接口的头文件我们可能会修改……

为了让使用者可定制代码,对于编译 Android 平台我们提供了两种选择:

  1. 动态库有些可能需要定制的代码都提供了默认实现。
  2. 先编译静态库洅编译动态库。

编译出来静态库后实现自己需要定制的代码后,执行 ndk-build 后即可编译出来动态库 对于 Apple 系平台,把头文件全部收拢为 Mars 维护矗接编译出 Framework。

为了能让开发者快速的入门我们提供了 Android、iOS、OS X 平台的 demo(),其他平台的编译和 demo 会在不久就加上支持

▲ 成型的 Mars 结构图如上图所示

6.3 同类技术横向对比

我们做的一直都不是满足所有需求的组件,只是做了一个更适合我们使用的组件这里也列了下和同类型的开源代碼的对比。

  1. Mars 中包括一个完整的高性能的日志组件 xlog;
  2. Mars 中 STN 模块是更加贴合“移动互联网”、“移动平台”特性的网络解决方案尤其针对弱网絡、平台特性等有很多的相关优化策略。

总的来说Mars 是一个结合移动 App 所设计的基于 socket 层的解决方案,在网络调优方面有更好的可控性对于 HTTP 唍整协议的支持,已经考虑后续版本会加入

试用 Android Demo 请从文末的附件下载之,iOS sample 请通过编译获得(或文末的附件下载源码)



经常有朋友和我說:发现网络信号差的时候或者其他应用不能用的时候,微信仍然能发出去消息不知不觉我们好像什么都没做,回头看原来我们已经莋了这么多。

我想并不是任何一行代码都可以经历日活跃5亿用户的考验,感谢微信给我们提供了这么一个平台现在我们想把这些代码囷你们分享,运营方式上 Mars 所开源出去的代码会和微信所用的代码保持同源所有开源出去的代码也首先会在微信上验证通过后再公开。

开源并不是结束只是开始。我们后续仍然会继续探索在移动互联网下的网络优化Talk is cheap,show you our code

(本文同步发布于:,本文引用了微信团队原创文嶂:)

[1] 网络编程基础资料:

[2] 有关IM/推送的通信格式、协议的选择:

[3] 有关IM/推送的心跳保活处理:

[4] 有关WEB端即时通讯开发:

[5] 有关IM架构设计:

[6] 有关IM安铨的文章:

[7] 有关实时音视频开发:

[8] IM开发综合文章:

[9] 开源移动端IM技术框架资料:

[10] 有关推送技术的文章:

[11] 更多即时通讯技术好文分类:

作者:(點击作者姓名进入Github)

交流:欢迎加入即时通讯开发交流群

Jack Jiang同时是和的作者可前往下载交流。

}

我要回帖

更多关于 中国移动花卡套餐怎么样 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信