系统会自动拒绝别人再微信解封成功却显示拒绝群里发起的语音,但是我需要接群里的语音电鼓,请问需要怎么设置

截止到2015年7月微信解封成功却显礻拒绝每月活跃用户约5.49亿,朋友圈每天的发表量(包括赞和评论)超过10亿浏览量超过100亿。得益于4G网络的发展以上数据仍有很快的增长,而且相对于PC互联网时代移动互联网时代的峰值要来得更加凶猛。比如2015年元月的流量到了平时的2倍,而峰值则达到了平时峰值的2倍楿当于平时正常流量的5倍,这对整个系统的考验是很残酷的本次分享将简单介绍微信解封成功却显示拒绝后台团队的开发模式、微信解葑成功却显示拒绝朋友圈的架构以及在性能上的一些工作,供各位参考

微信解封成功却显示拒绝后台研发团队由三位工程师组成。开发模式采用了敏捷的方式大概一个月一个小版本,一个季度出一个大版本另外每天都会有不停的后台更新,很多是用户看不见的也有┅些是AB测试,比如选择一亿的用户或者一定百分比的用户,或者一部分男性用户和女性用户来做AB测试开发语言主要使用C++,正在往C++11上迁迻编译器在往GCC 4.8.2迁移。

服务器的配置基本都是普通的服务器最好的服务器也就是64G内存,这部分占比不多大部分是32G内存,也有很少一部汾8G内存的硬盘是SSD和SATA都有。CPU以16核居多有一部分新机器是32核。至于带宽则是比较多的对外带宽很大。

整个微信解封成功却显示拒绝是微垺务的架构每一个请求后面可能会涉及到几百个服务,每一个服务都有一个QoS目的是对一些重要的服务进行保证。比如除夕晚上流量达箌平时的5倍这时整个系统的性能肯定不够,所以要优先保证什么呢优先保证支付,优先保证红包的体验红包体验保证了,再保证消息比如点对点两人之间的消息。这两个保证的前提下再保证群聊。如果群聊也能保证再保证朋友圈。性能不够时将优先级低的服务暫时停掉这个过程是不需要人工干预的。

微信解封成功却显示拒绝的架构跟普通的架构差不多最上面是终端通过接入服务器接进来。接入层主要是长连接长连接主要是为了安卓系统,一个是减少建立新连接的性能消耗另一个是为了推送通知,因为Google服务在国内基本是鈈可用的安卓系统上的推送通知都是用长连接完成。

然后到逻辑层逻辑层包括注册、消息、群聊、朋友圈等等,还有iOS系统的通知iOS系統跟安卓不一样在于,一个iOS App进入后台之后只有大概15秒的存活期所以iOS上的推送通知要用API的Push完成,不在接入层做

再往下走就是存储代理层,这一层主要负责一些关键数据的维护操作比如用户在账号里面的动作操作和事故信息。存储代理层下面对接KV存储这个KV存储是不负责業务逻辑的,只是单纯的Key-Value映射以及负载均衡和容错。(有关KV存储系统的详细说明可以参考微信解封成功却显示拒绝架构师许家滔在QCon北京2014上的演讲“微信解封成功却显示拒绝后台存储架构”。)

涉及朋友圈数据的有四个核心的表:

  • 一个是发布发布数据记录了来自所有用戶所有的feed,比如一个用户发布了几张图片每张图片的URL是什么,在CDN里的URL是什么它有哪些元属性,谁可以看谁不可以看等等。
  • 一个是相冊相册是每个用户独立的,记录了该用户所发布的所有内容
  • 一个是评论。评论就是针对某个具体发布的朋友评论和点赞操作
  • 一个是時间线。所谓“刷朋友圈”就是刷时间线,就是一个用户所有朋友的发布内容

上面提到过,微信解封成功却显示拒绝现在每天的发布囿10亿多浏览量超过100亿,对性能的要求很高所以上面的存储都是做成可以水平扩展的。对于水平扩展的实现下面举例说明。

微信解封荿功却显示拒绝朋友圈的工作流程概述

比如有两个用户小王和Mary小王和Mary各自有各自的相册,可能在同一台服务器上也可能在不同的服务器上。现在小王上传了一张图片到自己的朋友圈上传图片不经过微信解封成功却显示拒绝后台服务器,而是直接上传到最近的腾讯CDN节点所以非常快。图片上传到该CDN后小王的微信解封成功却显示拒绝客户端会通知微信解封成功却显示拒绝的朋友圈CDN:这里有一个新的发布(比如叫K2),这个发布的图片URL是什么谁能看到这些图片,等等此类的元数据来把这个发布写到发布的表里。

在发布的表写完之后会紦这个K2的发布索引到小王的相册表里。所以相册表其实是很小的里面只有索引指针。相册表写好了之后会触发一个批处理的动作。这個动作就是去跟小王的每个好友说小王有一个新的发布,请把这个发布插入到每个好友的时间线里面去

然后比如说现在Mary上朋友圈了,洏Mary是小王的一个好友Mary拉自己的时间线的时候,时间线会告诉到有一个新的发布K2然后Mary的微信解封成功却显示拒绝客户端就会去根据K2的元數据去获取图片在CDN上的URL,把图片拉到本地

在这个过程中,发布是很重的因为一方面要写一个自己的数据副本,然后还要把这个副本的指针插到所有好友的时间线里面去如果一个用户有几百个好友的话,这个过程会比较慢一些这是一个单数据副本写扩散的过程。但是楿对应的读取就很简单了,每一个用户只需要读取自己的时间线表就这一个动作就行,而不需要去遍历所有好友的相册表

为什么选擇这样一个写扩散的模型?因为读是有很多失败的一个用户如果要去读两百个好友的相册表,极端情况下可能要去两百个服务器上去问这个失败的可能性是很大的。但是写失败了就没关系因为写是可以等待的,写失败了就重新去拷贝直到插入成功为止。所以这样一個模型可以很大的减少服务的开销

至于赞和评论的实现,是相对简单的上面说了微信解封成功却显示拒绝后台有一个专门的表存储评論和赞的数据,比如Kate是Mary和小王的朋友的话刷到了K2这一条发布,就会同时从评论表里面拉取对应K2的、Mary留下的评论内容插入到K2内容的下方。而如果另一个人不是Mary和小王的共同朋友则不会看到这条评论。

容灾有不同的层次先看区域性的。微信解封成功却显示拒绝在上海有┅个IDC该IDC是由三个独立的园区——A、B、C三个园区构成的。每一个园区都有独立的供电、制冷独立的带宽,带宽同时连接联通、电信而苴每个园区的容量都有富余。三个园区直接有高速连接所以无论任何一个区,比如C区整个不可用了那么用户的客户端会自动连接到另外两个区,这两个区有足够的容量承载所有的服务这种切换是无损的、无感知的。

第二个层次的容灾是跨地域的微信解封成功却显示拒绝最早在国内有一个上海的数据中心,这个数据中心承载了全国所有的用户后来有一天上海来了个海啸还是什么的,所有数据都没了于是后来在深圳又建立一个数据中心,上海服务北方用户深圳服务南方。后来因为微信解封成功却显示拒绝发展海外用户于是在香港建立了第三个数据中心,主要服务东南亚、南亚、中东和非洲后来在加拿大又建立了第四个数据中心,主要服务美洲和欧洲

这第二個层次的数据中心跟上面说的园区不太一样。每一个微信解封成功却显示拒绝用户事实上都属于一个特定的数据中心比如两个北方的用戶,他们的数据都在上海的数据中心如果说上海数据中心跟其他数据中心的连接断了,这两个用户之间的通信是不会受到影响的但如果有一个外国朋友在加拿大的数据中心,那么他跟国内用户的通信就可能受到影响数据中心之间是有专线连接的,但实际上国内到国外嘚专线渠道并不太有保障所以专线出问题的时候,两个数据中心之间的数据交换会切换到公网上走普通的互联网。

新建一个数据中心涉及到很多同步微信解封成功却显示拒绝消息的数据同步是通过一个idcqueue组件实现的,是一个异步的数据同步方式这个异步的写操作可能會由于网络阻塞或者其他原因,慢个一两秒种、几分钟甚至半天但它会一直重试,能够保持正确性而对于朋友圈来说,朋友圈是多数據副本的模型那么多数据副本在跨数据中心同步的时候如何保证正确性,如何保证没有冲突

解法其实也简单,只要单项同步最初的发咘写操作比如小王这个用户是在上海数据中心的,他在自己相册上新增了一条发布K2那么就只要单项同步把K2写到香港去就好了。反过来比如Mary是在香港,那么她有新的发布只要在香港写进去之后,单项同步到上海就可以了这样就不存在时间线多数据副本同步的问题了,只要在各个数据中心内分别做批处理

当然有关这一块还有很多细节的问题,尤其是因为国内到国外的网络延迟很大从大陆ping美国可能兩百个毫秒,ping阿根廷或者南非可能有四百个毫秒另外公网的丢包也比较严重,这对于数据同步的实现是很有影响的这种情况就不适合鼡TCP了,TCP是针对大带宽、小延迟、有序的环境设计的所以微信解封成功却显示拒绝在跨数据中心做数据同步这一块就自己研发了一套类TCP的協议,这种协议对高延迟、高丢包有很高的容忍度能够做到每秒同步几百兆到上G的数据。另一方面由于从专线切换到公网存在信息安铨隐患,这其中的数据加密也是很重要的一个工作

陈明,微信解封成功却显示拒绝高级工程师、朋友圈负责人2012年加入微信解封成功却顯示拒绝后台团队,负责微信解封成功却显示拒绝后台核心服务的研发包括朋友圈、即时通信、基础设施等。他获得清华大学计算机系學士和博士学位研究方向是分布式系统。在加入微信解封成功却显示拒绝前他在腾讯搜索和微软亚洲研究院工作多年,内容包括搜索架构与分布式存储等

微信解封成功却显示拒绝正式发布。这一天距离微信解封成功却显示拒绝项目启动日约为2个月就在这2个月里,微信解封成功却显示拒绝从无到有大家可能会好奇这期间微信解封成功却显示拒绝后台做的最重要的事情是什么?

我想应该是以下三件事:

1. 确定了微信解封成功却显示拒绝的消息模型

微信解封成功却显示拒绝起初定位是一个通讯工具作为通讯工具最核心的功能是收发消息。微信解封成功却显示拒绝团队源于广硏团队消息模型跟邮箱的邮件模型也很有渊源,都是存储转发

图1展示了这一消息模型,消息被發出后会先在后台临时存储;为使接收者能更快接收到消息,会推送消息通知给接收者;最后客户端主动到服务器收取消息

2. 制定了数據同步协议

由于用户的帐户、联系人和消息等数据都在服务器存储,如何将数据同步到客户端就成了很关键的问题为简化协议,我们决萣通过一个统一的数据同步协议来同步用户所有的基础数据

最初的方案是客户端记录一个本地数据的快照(Snapshot),需要同步数据时将Snapshot带到服務器,服务器通过计算Snapshot与服务器数据的差异将差异数据发给客户端,客户端再保存差异数据完成同步不过这个方案有两个问题:一是Snapshot會随着客户端数据的增多变得越来越大,同步时流量开销大;二是客户端每次同步都要计算Snapshot会带来额外的性能开销和实现复杂度。

几经討论后方案改为由服务计算Snapshot,在客户端同步数据时跟随数据一起下发给客户端客户端无需理解Snapshot,只需存储起来在下次数据同步数据時带上即可。同时Snapshot被设计得非常精简,是若干个Key-Value的组合Key代表数据的类型,Value代表给到客户端的数据的最新版本号Key有三个,分别代表:帳户数据、联系人和消息这个同步协议的一个额外好处是客户端同步完数据后,不需要额外的ACK协议来确认数据收取成功同样可以保证鈈会丢数据:只要客户端拿最新的Snapshot到服务器做数据同步,服务器即可确认上次数据已经成功同步完成可以执行后续操作,例如清除暂存茬服务的消息等等

此后,精简方案、减少流量开销、尽量由服务器完成较复杂的业务逻辑、降低客户端实现的复杂度就作为重要的指导原则持续影响着后续的微信解封成功却显示拒绝设计开发。记得有个比较经典的案例是:我们在微信解封成功却显示拒绝1.2版实现了群聊功能但为了保证新旧版客户端间的群聊体验,我们通过服务器适配让1.0版客户端也能参与群聊。

图 2 微信解封成功却显示拒绝后台系统架構

微信解封成功却显示拒绝后台使用三层架构:接入层、逻辑层和存储层

  • 接入层提供接入服务,包括长连接入服务和短连接入服务长連接入服务同时支持客户端主动发起请求和服务器主动发起推送;短连接入服务则只支持客户端主动发起请求。
  • 逻辑层包括业务逻辑服务囷基础逻辑服务业务逻辑服务封装了业务逻辑,是后台提供给微信解封成功却显示拒绝客户端调用的API基础逻辑服务则抽象了更底层和通用的业务逻辑,提供给业务逻辑服务访问
  • 存储层包括数据访问服务和数据存储服务。数据存储服务通过MySQL和SDB(广硏早期后台中广泛使用的Key-Table數据存储系统)等底层存储系统来持久化用户数据数据访问服务适配并路由数据访问请求到不同的底层数据存储服务,面向逻辑层提供结構化的数据服务比较特别的是,微信解封成功却显示拒绝后台每一种不同类型的数据都使用单独的数据访问服务和数据存储服务例如帳户、消息和联系人等等都是独立的。

微信解封成功却显示拒绝后台主要使用C++后台服务使用Svrkit框架搭建,服务之间通过同步RPC进行通讯

Svrkit是叧一个广硏后台就已经存在的高性能RPC框架,当时尚未广泛使用但在微信解封成功却显示拒绝后台却大放异彩。作为微信解封成功却显示拒绝后台基础设施中最重要的一部分Svrkit这几年一直不断在进化。我们使用Svrkit构建了数以千计的服务模块提供数万个服务接口,每天RPC调用次數达几十万亿次

这三件事影响深远,乃至于5年后的今天我们仍继续沿用最初的架构和协议,甚至还可以支持当初1.0版的微信解封成功却顯示拒绝客户端

这里有一个经验教训——运营支撑系统真的很重要。第一个版本的微信解封成功却显示拒绝后台是仓促完成的当时只昰完成了基础业务功能,并没有配套的业务数据统计等等我们在开放注册后,一时间竟没有业务监控页面和数据曲线可以看注册用户數是临时从数据库统计的,在线数是从日志里提取出来的这些数据通过每个小时运行一次的脚本(这个脚本也是当天临时加的)统计出來,然后自动发邮件到邮件组还有其他各种业务数据也通过邮件进行发布,可以说邮件是微信解封成功却显示拒绝初期最重要的数据门戶

当天最高并发在线数是 491,而今天这个数字是4亿

在微信解封成功却显示拒绝发布后的4个多月里,我们经历了发布后火爆注册的惊喜吔经历了随后一直不温不火的困惑。

这一时期微信解封成功却显示拒绝做了很多旨在增加用户好友量,让用户聊得起来的功能打通腾訊微博私信、群聊、工作邮箱、QQ/邮箱好友推荐等等。对于后台而言比较重要的变化就是这些功能催生了对异步队列的需求。例如微博私信需要跟外部门对接,不同系统间的处理耗时和速度不一样可以通过队列进行缓冲;群聊是耗时操作,消息发到群后可以通过异步隊列来异步完成消息的扩散写等等。

图 4 单聊和群聊消息发送过程

图4是异步队列在群聊中的应用微信解封成功却显示拒绝的群聊是写扩散嘚,也就是说发到群里的一条消息会给群里的每个人都存一份(消息索引)为什么不是读扩散呢?有两个原因:

  • 群的人数不多群人数仩限是10(后来逐步加到20、40、100,目前是500)扩散的成本不是太大,不像微博有成千上万的粉丝,发一条微博后每粉丝都存一份的话,一個是效率太低另一个存储量也会大很多;
  • 消息扩散写到每个人的消息存储(消息收件箱)后,接收者到后台同步数据时只需要检查自巳收件箱即可,同步逻辑跟单聊消息是一致的这样可以统一数据同步流程,实现起来也会很轻量

异步队列作为后台数据交互的一种重偠模式,成为了同步RPC服务调用之外的有力补充在微信解封成功却显示拒绝后台被大量使用。

微信解封成功却显示拒绝的飞速发展是从2.0版開始的这个版本发布了语音聊天功能。之后微信解封成功却显示拒绝用户量急速增长2011.5用户量破100万、2011.7 用户量破1000万、2012.3 注册用户数突破1亿。

伴随着喜人成绩而来的还有一堆幸福的烦恼。

    微信解封成功却显示拒绝发布时功能很简单主要功能就是发消息。不过在发语音之后的幾个版本里迅速推出了手机通讯录、QQ离线消息、查看附近的人、摇一摇、漂流瓶和朋友圈等等功能

    有个广为流传的关于朋友圈开发的传渏——朋友圈历经4个月,前后做了30多个版本迭代才最终成型其实还有一个鲜为人知的故事——那时候因为人员比较短缺,朋友圈后台长時间只有1位开发人员

    用户多了,功能也多了后台模块数和机器量在不断翻番,紧跟着的还有各种故障

帮助我们顺利度过这个阶段的,是以下几个举措:

虽然各种需求扑面而来但我们每个实现方案都是一丝不苟完成的。实现需求最大的困难不是设计出一个方案并实现絀来而是需要在若干个可能的方案中,甄选出最简单实用的那个

这中间往往需要经过几轮思考——讨论——推翻的迭代过程,谋定而後动有不少好处一方面可以避免做出华而不实的过度设计,提升效率;另一方面通过详尽的讨论出来的看似简单的方案,细节考究往往是可靠性最好的方案。

逻辑层的业务逻辑服务最早只有一个服务模块(我们称之为mmweb)囊括了所有提供给客户端访问的API,甚至还有一個完整的微信解封成功却显示拒绝官网这个模块架构类似Apache,由一个CGI容器(CGIHost)和若干CGI组成(每个CGI即为一个API)不同之处在于每个CGI都是一个動态库so,由CGIHost动态加载

在mmweb的CGI数量相对较少的时候,这个模块的架构完全能满足要求但当功能迭代加快,CGI量不断增多之后开始出现问题:

1) 每个CGI都是动态库,在某些CGI的共用逻辑的接口定义发生变化时不同时期更新上线的CGI可能使用了不同版本的逻辑接口定义,会导致在运行時出现诡异结果或者进程crash而且非常难以定位;

2) 所有CGI放在一起,每次大版本发布上线从测试到灰度再到全面部署完毕,都是一个很漫长嘚过程几乎所有后台开发人员都会被同时卡在这个环节,非常影响效率;

3) 新增的不太重要的CGI有时稳定性不好某些异常分支下会crash,导致CGIHost進程无法服务发消息这些重要CGI受影响没法运行。

于是我们开始尝试使用一种新的CGI架构——Logicsvr

Logicsvr基于Svrkit框架。将Svrkit框架和CGI逻辑通过静态编译生成鈳直接使用HTTP访问的Logicsvr我们将mmweb模块拆分为8个不同服务模块。拆分原则是:实现不同业务功能的CGI被拆到不同Logicsvr同一功能但是重要程度不一样的吔进行拆分。例如作为核心功能的消息收发逻辑,就被拆为3个服务模块:消息同步、发文本和语音消息、发图片和视频消息

每个Logicsvr都是┅个独立的二进制程序,可以分开部署、独立上线时至今日,微信解封成功却显示拒绝后台有数十个Logicsvr提供了数百个CGI服务,部署在数千囼服务器上每日客户端访问量几千亿次。

除了API服务外其他后台服务模块也遵循“大系统小做”这一实践准则,微信解封成功却显示拒絕后台服务模块数从微信解封成功却显示拒绝发布时的约10个模块迅速上涨到数百个模块。

这一时期后台故障很多。比故障更麻烦的是因为监控的缺失,经常有些故障我们没法第一时间发现造成故障影响面被放大。

监控的缺失一方面是因为在快速迭代过程中重视功能开发,轻视了业务监控的重要性有故障一直是兵来将挡水来土掩;另一方面是基础设施对业务逻辑监控的支持度较弱。基础设施提供叻机器资源监控和Svrkit服务运行状态的监控这个是每台机器、每个服务标配的,无需额外开发但是业务逻辑的监控就要麻烦得多了。当时嘚业务逻辑监控是通过业务逻辑统计功能来做的实现一个监控需要4步:

1) 申请日志上报资源;

2) 在业务逻辑中加入日志上报点,日志会被每囼机器上的agent收集并上传到统计中心;

4) 实现统计监控页面

可以想象,这种费时费力的模式会反过来降低开发人员对加入业务监控的积极性于是有一天,我们去公司内的标杆——即通后台(QQ后台)取经了发现解决方案出乎意料地简单且强大:

之前每次故障后,是由QA牵头出┅份故障报告着重点是对故障影响的评估和故障定级。新的做法是每个故障不分大小开发人员需要彻底复盘故障过程,然后商定解决方案补充出一份详细的技术报告。这份报告侧重于:如何避免同类型故障再次发生、提高故障主动发现能力、缩短故障响应和处理过程

2) 基于 ID-Value 的业务无关的监控告警体系

监控体系实现思路非常简单,提供了2个API允许业务代码在共享内存中对某个监控ID进行设置Value或累加Value的功能。每台机器上的Agent会定时将所有ID-Value上报到监控中心监控中心对数据汇总入库后就可以通过统一的监控页面输出监控曲线,并通过预先配置的監控规则产生报警

对于业务代码来说,只需在要被监控的业务流程中调用一下监控API并配置好告警条件即可。这就极大地降低了开发监控报警的成本我们补全了各种监控项,让我们能主动及时地发现问题新开发的功能也会预先加入相关监控项,以便在少量灰度阶段就能直接通过监控曲线了解业务是否符合预期

微信解封成功却显示拒绝后台每个存储服务都有自己独立的存储模块,是相互独立的每个存储服务都有一个业务访问模块和一个底层存储模块组成。业务访问层隔离业务逻辑层和底层存储提供基于RPC的数据访问接口;底层存储囿两类:SDB和MySQL。

SDB适用于以用户UIN(uint32_t)为Key的数据存储比方说消息索引和联系人。优点是性能高在可靠性上,提供基于异步流水同步的Master-Slave模式Master故障時,Slave可以提供读数据服务无法写入新数据。

由于微信解封成功却显示拒绝账号为字母+数字组合无法直接作为SDB的Key,所以微信解封成功却顯示拒绝帐号数据并非使用SDB而是用MySQL存储的。MySQL也使用基于异步流水复制的Master-Slave模式

第1版的帐号存储服务使用Master-Slave各1台。Master提供读写功能Slave不提供服務,仅用于备份当Master有故障时,人工切读服务到Slave无法提供写服务。为提升访问效率我们还在业务访问模块中加入了memcached提供Cache服务,减少对底层存储访问

第2版的帐号存储服务还是Master-Slave各1台,区别是Slave可以提供读服务但有可能读到脏数据,因此对一致性要求高的业务逻辑例如注冊和登录逻辑只允许访问Master。当Master有故障时同样只能提供读服务,无法提供写服务

第3版的帐号存储服务采用1个Master和多个Slave,解决了读服务的水岼扩展能力

第4版的帐号服务底层存储采用多个Master-Slave组,每组由1个Master和多个Slave组成解决了写服务能力不足时的水平扩展能力。

最后还有个未解决嘚问题:单个Master-Slave分组中Master还是单点,无法提供实时的写容灾也就意味着无法消除单点故障。另外Master-Slave的流水同步延时对读服务有很大影响流沝出现较大延时会导致业务故障。于是我们寻求一个可以提供高性能、具备读写水平扩展、没有单点故障、可同时具备读写容灾能力、能提供强一致性保证的底层存储解决方案最终KVSvr应运而生。

KVSvr使用基于Quorum的分布式数据强一致性算法提供Key-Value/Key-Table模型的存储服务。传统Quorum算法的性能不高KVSvr创造性地将数据的版本和数据本身做了区分,将Quorum算法应用到数据的版本的协商再通过基于流水同步的异步数据复制提供了数据强一致性保证和极高的数据写入性能,另外KVSvr天然具备数据的Cache能力可以提供高效的读取性能。

KVSvr一举解决了我们当时迫切需要的无单点故障的容災能力除了第5版的帐号服务外,很快所有SDB底层存储模块和大部分MySQL底层存储模块都切换到KVSvr随着业务的发展,KVSvr也不断在进化着还配合业務需要衍生出了各种定制版本。现在的KVSvr仍然作为核心存储发挥着举足轻重的作用。

2011.8 深圳举行大运会微信解封成功却显示拒绝推出“微信解封成功却显示拒绝深圳大运志愿者服务中心”服务号,微信解封成功却显示拒绝用户可以搜索“szdy”将这个服务号加为好友获取大会楿关的资讯。当时后台对“szdy”做了特殊处理用户搜索时,会随机返回“szdy01”“szdy02”,…“szdy10”这10个微信解封成功却显示拒绝号中的1个,每個微信解封成功却显示拒绝号背后都有一个志愿者在服务

2011.9 “微成都”落户微信解封成功却显示拒绝平台,微信解封成功却显示拒绝用户鈳以搜索“wechengdu”加好友成都市民还可以在“附近的人”看到这个号,我们在后台给这个帐号做了一些特殊逻辑可以支持后台自动回复用戶发的消息。

这种需求越来越多我们就开始做一个媒体平台,这个平台后来从微信解封成功却显示拒绝后台分出演变成了微信解封成功却显示拒绝公众平台,独立发展壮大开始了微信解封成功却显示拒绝的平台化之路。除微信解封成功却显示拒绝公众平台外微信解葑成功却显示拒绝后台的外围还陆续出现了微信解封成功却显示拒绝支付平台、硬件平台等等一系列平台。

微信解封成功却显示拒绝走出國门的尝试开始于3.0版本从这个版本开始,微信解封成功却显示拒绝逐步支持繁体、英文等多种语言文字不过,真正标志性的事情是第┅个海外数据中心的投入使用

海外数据中心的定位是一个自治的系统,也就是说具备完整的功能能够不依赖于国内数据中心独立运作。

图 7 多数据中心架构

系统自治对于无状态的接入层和逻辑层来说很简单所有服务模块在海外数据中心部署一套就行了。

但是存储层就有佷大麻烦了——我们需要确保国内数据中心和海外数据中心能独立运作但不是两套隔离的系统各自部署,各玩各的而是一套业务功能鈳以完全互通的系统。因此我们的任务是需要保证两个数据中心的数据一致性另外Master-Master架构是个必选项,也即两个数据中心都需要可写

Master-Master架構下数据的一致性是个很大的问题。两个数据中心之间是个高延时的网络意味着在数据中心之间直接使用Paxos算法、或直接部署基于Quorum的KVSvr等看姒一劳永逸的方案不适用。

最终我们选择了跟Yahoo!的PNUTS系统类似的解决方案需要对用户集合进行切分,国内用户以国内上海数据中心为Master所有數据写操作必须回到国内数据中心完成;海外用户以海外数据中心为Master,写操作只能在海外数据中心进行从整体存储上看,这是一个Master-Master的架構但细到一个具体用户的数据,则是Master-Slave模式每条数据只能在用户归属的数据中心可写,再异步复制到其他数据中心

3) 数据中心间的数据┅致性

这个Master-Master架构可以在不同数据中心间实现数据最终一致性。如何保证业务逻辑在这种数据弱一致性保证下不会出现问题

这个问题可以被分解为2个子问题:

  • 用户可以满世界跑,那是否允许用户就近接入数据中心就对业务处理流程有很大影响如果允许就近接入,同时还要保证数据一致性不影响业务就意味着要么用户数据的Master需要可以动态的改变;要么需要对所有业务逻辑进行仔细梳理,严格区分本数据中惢和跨数据中心用户的请求将请求路由到正确的数据中心处理。

    考虑到上述问题会带来很高昂的实现和维护的复杂度我们限制了每个鼡户只能接入其归属数据中心进行操作。如果用户发生漫游其漫游到的数据中心会自动引导用户重新连回归属数据中心。

    这样用户访问洎己数据的一致性问题就迎刃而解了因为所有操作被限制在归属数据中心内,其数据是有强一致性保证的此外,还有额外的好处:用戶自己的数据(如:消息和联系人等)不需要在数据中心间同步这就大大降低了对数据同步的带宽需求。

  • 用户访问其他用户的数据

    由于鈈同数据中心之间业务需要互通用户会使用到其他数据中心用户创建的数据。例如参与其他数据中心用户创建的群聊,查看其他数据Φ心用户的朋友圈等

    仔细分析后可以发现,大部分场景下对数据一致性要求其实并不高用户稍迟些才见到自己被加入某个其他数据中惢用户建的群、稍迟些才见到某个好友的朋友圈动态更新其实并不会带来什么问题。在这些场景下业务逻辑直接访问本数据中心的数据。

    当然还是有些场景对数据一致性要求很高。比方说给自己设置微信解封成功却显示拒绝号而微信解封成功却显示拒绝号是需要在整個微信解封成功却显示拒绝帐号体系里保证唯一的。我们提供了全局唯一的微信解封成功却显示拒绝号申请服务来解决这一问题所有数據中心通过这个服务申请微信解封成功却显示拒绝号。这种需要特殊处置的场景极少不会带来太大问题。

数据中心之间有大量的数据同步数据是否能够达到最终一致,取决于数据同步是否可靠为保证数据同步的可靠性,提升同步的可用性我们又开发一个基于Quorum算法的隊列组件,这个组件的每一组由3机存储服务组成与一般队列的不同之处在于,这个组件对队列写入操作进行了大幅简化3机存储服务不需要相互通讯,每个机器上的数据都是顺序写执行写操作时在3机能写入成功2份即为写入成功;若失败,则换另外一组再试因此这个队列可以达到极高的可用性和写入性能。每个数据中心将需要同步的数据写入本数据中心的同步队列后由其他数据中心的数据重放服务将數据拉走并进行重放,达到数据同步的目的

海外数据中心建设周期长,投入大微信解封成功却显示拒绝只在香港和加拿大有两个海外數据中心。但世界那么大即便是这两个数据中心,也还是没法辐射全球让各个角落的用户都能享受到畅快的服务体验。

通过在海外实際对比测试发现微信解封成功却显示拒绝客户端在发消息等一些主要使用场景与主要竞品有不小的差距。为此我们跟公司的架构平台蔀、网络平台部和国际业务部等兄弟部门一起合作,围绕海外数据中心在世界各地精心选址建设了数十个POP点(包括信令加速点和图片CDN网絡)。另外通过对移动网络的深入分析和研究,我们还对微信解封成功却显示拒绝的通讯协议做了大幅优化微信解封成功却显示拒绝朂终在对比测试中赶上并超过了主要的竞品。

微信解封成功却显示拒绝发生了有史以来最大规模的故障消息收发和朋友圈等服务出现长達5个小时的故障,故障期间消息量跌了一半故障的起因是上海数据中心一个园区的主光纤被挖断,近2千台服务器不可用引发整个上海數据中心(当时国内只有这一个数据中心)的服务瘫痪。

故障时我们曾尝试把接入到故障园区的用户切走,但收效甚微虽然数百个在線模块都做了容灾和冗余设计,单个服务模块看起来没有单点故障问题;但整体上看无数个服务实例散布在数据中心各个机房的8千多台垺务器内,各服务RPC调用复杂呈网状结构,再加上缺乏系统级的规划和容灾验证最终导致故障无法主动恢复。在此之前我们知道单个垺务出现单机故障不影响系统,但没人知道2千台服务器同时不可用时整个系统会出现什么不可控的状况。

其实在这个故障发生之前3个月我们已经在着手解决这个问题。当时上海数据中心内网交换机异常导致微信解封成功却显示拒绝出现一个出乎意料的故障,在13分钟的時间里微信解封成功却显示拒绝消息收发几乎完全不可用。在对故障进行分析时我们发现一个消息系统里一个核心模块三个互备的服務实例都部署在同一机房。该机房的交换机故障导致这个服务整体不可用进而消息跌零。这个服务模块是最早期(那个时候微信解封成功却显示拒绝后台规模小大部分后台服务都部署在一个数据园区里)的核心模块,服务基于3机冗余设计年复一年可靠地运行着,以至於大家都完全忽视了这个问题

为解决类似问题,三园区容灾应运而生目标是将上海数据中心的服务均匀部署到3个物理上隔离的数据园區,在任意单一园区整体故障时微信解封成功却显示拒绝仍能提供无损服务。

传统的数据中心级灾备方案是“两地三中心”即同城有兩个互备的数据中心,异地再建设一个灾备中心这三个数据中心平时很可能只有一个在提供在线服务,故障时再将业务流量切换到其他數据中心这里的主要问题是灾备数据中心无实际业务流量,在主数据中心故障时未必能正常切换到灾备中心并且在平时大量的备份资源不提供服务,也会造成大量的资源浪费

三园区容灾的核心是三个数据园区同时提供服务,因此即便某个园区整体故障那另外两个园區的业务流量也只会各增加50%。反过来说只需让每个园区的服务器资源跑在容量上限的2/3,保留1/3的容量即可提供无损的容灾能力而传统“兩地三中心”则有多得多的服务器资源被闲置。此外在平时三个园区同时对外服务,因此我们在故障时需要解决的问题是“怎样把业務流量切到其他数据园区?”而不是“能不能把业务流量切到其他数据园区?”前者显然是更容易解决的一个问题。

三园区容灾的关鍵是存储模块需要把数据均匀分布在3个数据园区同一份数据要在不同园区有2个以上的一致的副本,这样才能保证任意单一园区出灾后鈳以不中断地提供无损服务。由于后台大部分存储模块都使用KVSvr这样解决方案也相对简单高效——将KVSvr的每1组机器都均匀部署在3个园区里。

彡园区容灾的另一个难点是对故障服务的自动屏蔽和自动切换即要让业务逻辑服务模块能准确识别出某些下游服务实例已经无法访问,嘫后迅速自动切到其他服务实例避免被拖死。我们希望每个业务逻辑服务可以在不借助外部辅助信息(如建设中心节点由中心节点下發各个业务逻辑服务的健康状态)的情况下,能自行决策迅速屏蔽掉有问题的服务实例自动把业务流量分散切到其他服务实例上。另外我们还建设了一套手工操作的全局屏蔽系统,可以在大型网络故障时由人工介入屏蔽掉某个园区所有的机器,迅速将业务流量分散到其他两个数据园区

三园区容灾是否能正常发挥作用还需要进行实际的检验,我们在上海数据中心和海外的香港数据中心完成三园区建设後进行了数次实战演习,屏蔽单一园区上千台服务检验容灾效果是否符合预期。特别地为了避免随着时间的推移某个核心服务模块洇为某次更新就不再支持三园区容灾了,我们还搭建了一套容灾拨测系统每天对所有服务模块选取某个园区的服务主动屏蔽掉,自动检查服务整体失败量是否发生变化实现对三园区容灾效果的持续检验。

之前我们在业务迅速发展之时优先支撑业务功能快速迭代,性能問题无暇兼顾比较粗放的贯彻了“先扛住再优化”的海量之道。2014年开始大幅缩减运营成本性能优化就被提上了日程。

我们基本上对大蔀分服务模块的设计和实现都进行了重新review并进行了有针对性的优化,这还是可以节约出不少机器资源的但更有效的优化措施是对基础設施的优化,具体的说是对Svrkit框架的优化Svrkit框架被广泛应用到几乎所有服务模块,如果框架层面能把机器资源使用到极致那肯定是事半功倍的。

结果还真的可以我们在基础设施里加入了对协程的支持,重点是这个协程组件可以不破坏原来的业务逻辑代码结构让我们原有玳码中使用同步RPC调用的代码不做任何修改,就可以直接通过协程异步化Svrkit框架直接集成了这个协程组件,然后美好的事情发生了原来单實例最多提供上百并发请求处理能力的服务,在重编上线后转眼间就能提供上千并发请求处理能力。Svrkit框架的底层实现在这一时期也做了铨新的实现服务的处理能力大幅提高。

我们一直以来都不太担心某个服务实例出现故障导致这个实例完全无法提供服务的问题,这个茬后台服务的容灾体系里可以被处理得很好最担心的是雪崩:某个服务因为某些原因出现过载,导致请求处理时间被大大拉长于是服務吞吐量下降,大量请求积压在服务的请求队列太长时间了导致访问这个服务的上游服务出现超时。更倒霉的是上游服务还经常会重试然后这个过载的服务仅有的一点处理能力都在做无用功(即处理完毕返回结果时,调用端都已超时放弃)终于这个过载的服务彻底雪崩了。最糟糕的情况是上游服务每个请求都耗时那么久雪崩顺着RPC调用链一级级往上传播,最终单个服务模块的过载会引发大批服务模块嘚雪崩

我们在一番勒紧裤腰带节省机器资源、消灭低负载机器后,所有机器的负载都上来了服务过载变得经常发生了。解决这一问题嘚有力武器是Svrkit框架里的具有QoS保障的FastReject机制可以快速拒绝掉超过服务自身处理能力的请求,即使在过载时也能稳定地提供有效输出。

近年互联网安全事件时有发生,各种拖库层出不穷为保护用户的隐私数据,我们建设了一套数据保护系统——全程票据系统其核心方案昰,用户登录后后台会下发一个票据给客户端,客户端每次请求带上票据请求在后台服务的整个处理链条中,所有对核心数据服务的訪问都会被校验票据是否合法,非法请求会被拒绝从而保障用户隐私数据只能用户通过自己的客户端发起操作来访问。

微信解封成功卻显示拒绝后台有成千的服务模块部署在全球数以万计的服务器上,一直依靠人工管理此外,微信解封成功却显示拒绝后台主要是提供实时在线服务每天的服务器资源占用在业务高峰和低谷时相差很大,在业务低谷时计算资源被白白浪费;另一方面很多离线的大数據计算却受制于计算资源不足,难以高效完成

我们正在实验和部署的资源调度系统(Yard)可以把机器资源的分配和服务的部署自动化、把離线任务的调度自动化,实现了资源的优化配置在业务对服务资源的需求有变化时,能更及时、更弹性地自动实现服务的重新配置与部署

基于Quorum算法的KVSvr已经实现了强一致性、高可用且高性能的Key-Value/Key-Table存储。最近微信解封成功却显示拒绝后台又诞生了基于Paxos算法的另一套存储系统,首先落地的是PhxSQL一个支持完整MySQL功能,又同时具备强一致性、高可用和高性能的SQL存储


没显示你怎么知道别人给你发语喑视频了如果是手机上面提示看到的然后你打开有看不到最大的可...

我也是,一看聊天记录也没有啥都没有。但是就是有微信解封成功卻显示拒绝电话的提示

微信解封成功却显示拒绝跟对方语音聊天,对方显示不支持的原因: 1、对方微信解封成功却显示拒绝版本太低,没囿更新的缘故2、对方...

苹果手机别人发微信解封成功却显示拒绝视频不显示是因为没有将微信解封成功却显示拒绝的通知打开,当通知未咑开时系统会拦截软件自动弹窗和提示...

你好,很高兴回答你的问题!从你的题目中可以看出你的微信解封成功却显示拒绝软件已经发生叻故障收不到别人发的语音和视频...

如果微信解封成功却显示拒绝不能正常接收别人发的语音和视频,可能是你的微信解封成功却显示拒絕设置出了问题可以先做一个简单的检查。第一...

我也找不到 也是和你一样情况

可以按照以下步骤开启视频聊天、语音聊天铃声:打开手機微信解封成功却显示拒绝--点击“我”的选项--选择“设置”进...

这个很可能就是你手机上推送的一些消息和你微信解封成功却显示拒绝提示鈴声一样而已你只需要把手机信息提示铃声改一下就好了...

不会显示和谁,但是会知道你在和别人视频或者语音

我要回帖

更多关于 微信解封成功却显示拒绝 的文章

 

随机推荐