扒一扒微信后台架构.....

论坛 期权论坛     
选择匿名的用户   2021-5-22 22:18   26   0
<div id="js_content">
<p style="text-align: left">上一篇:<a href="http://mp.weixin.qq.com/s?__biz&#61;MzI2MTIzMzY3Mw%3D%3D&amp;chksm&#61;ea5f072add288e3cffa43bf7b1c92718b9a598732ede716be84f9909594887f435811f34f462&amp;idx&#61;1&amp;mid&#61;2247502412&amp;scene&#61;21&amp;sn&#61;11f77c73c038e88e5e2b3e38ce064d92#wechat_redirect">深夜看了张一鸣的微博,让我越想越后怕</a></p>
<p><strong>转载自公众号【编程指北】</strong><br></p>
<p>我知道很多同学对微信后台很感兴趣,所以打算整理一些微信后台的技术栈,以及架构演进的历程。</p>
<p>偶尔也会写点自己在后台开发时的一些体验。</p>
<p>下面开始第一篇吧,先给大家介绍下微信早期后台是如何从0到1的。</p>
<blockquote>
  <p>2个月的开发时间,微信后台系统经历了从0到1的过程。</p>
  <p>从小步慢跑到快速成长,经历了平台化到走出国门,微信交出的这份优异答卷,解题思路是怎样的?</p>
</blockquote>
<p style="text-align: right">作者 | 张文瑞</p>
<p style="text-align: left">阶段一:从无到有<br></p>
<p>2011.1.21 微信正式发布。这一天距离微信项目启动日约为2个月。</p>
<p>就在这2个月里,微信从无到有,大家可能会好奇这期间微信后台做的最重要的事情是什么?</p>
<p>我想应该是以下三件事:</p>
<h3>1. 确定了微信的消息模型</h3>
<p>微信起初定位是一个通讯工具,作为通讯工具最核心的功能是收发消息。</p>
<p>微信团队源于广硏团队,消息模型跟邮箱的邮件模型也很有渊源,都是<strong>存储转发</strong>。</p>
<img src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-76c739ca469f3f356d2dcefbc4c2051c.png">
<figcaption>
  微信消息模型
</figcaption>
<p>上图展示了这一消息模型,消息被发出后,会先在后台临时存储;</p>
<p>为使接收者能更快接收到消息,会推送消息通知给接收者;</p>
<p>最后客户端主动到服务器收取消息。</p>
<h3>2. 制定了数据同步协议</h3>
<p>由于用户的帐户、联系人和消息等数据都在服务器存储,如何将数据同步到客户端就成了很关键的问题。</p>
<p>为简化协议,我们决定通过一个统一的数据同步协议来同步用户所有的基础数据。</p>
<p>最初的方案是客户端记录一个本地数据的快照(Snapshot),需要同步数据时,将 Snapshot 带到服务器,服务器通过计算 Snapshot 与服务器数据的差异,将差异数据发给客户端,客户端再保存差异数据完成同步。</p>
<p>不过这个方案有两个问题:</p>
<ul><li><p>一是 Snapshot 会随着客户端数据的增多变得越来越大,同步时流量开销大;</p></li><li><p>二是客户端每次同步都要计算 Snapshot,会带来额外的性能开销和实现复杂度。</p></li></ul>
<p>几经讨论后,方案改为由服务计算 Snapshot,在客户端同步数据时跟随数据一起下发给客户端,客户端无需理解 Snapshot,只需存储起来,在下次数据同步数据时带上即可。</p>
<p>同时,Snapshot被设计得非常精简,是若干个 Key-Value 的组合,Key 代表数据的类型,Value 代表给到客户端的数据的最新版本号。</p>
<p>Key 有三个,分别代表:帐户数据、联系人和消息。</p>
<p>这个同步协议的一个额外好处是客户端同步完数据后,不需要额外的ACK协议来确认数据收取成功,同样可以保证不会丢数据:</p>
<p>只要客户端拿最新的Snapshot到服务器做数据同步,服务器即可确认上次数据已经成功同步完成,可以执行后续操作。</p>
<p>例如清除暂存在服务的消息等等。</p>
<p>此后,精简方案、减少流量开销、尽量由服务器完成较复杂的业务逻辑、降低客户端实现的复杂度就作为重要的指导原则,持续影响着后续的微信设计开发。</p>
<p><strong>记得有个比较经典的案例是:我们在微信1.2版实现了群聊功能,但为了保证新旧版客户端间的群聊体验,我们通过服务器适配,让1.0版客户端也能参与群聊。</strong></p>
<h3>3. 定型了后台架构</h3>
<img src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-26e3967549eb537b02a4bf0411cab1dc.png">
<figcaption>
  微信后台系统架构
</figcaption>
<p>微信后台使用三层架构:<strong>接入层、逻辑层和存储层</strong></p>
<p>接入层提供接入服务,包括长连接入服务和短连接入服务。</p>
<p>长连接入服务同时支持客户端主动发起请求和服务器主动发起推送;</p>
<p>短连接入服务则只支持客户端主动发起请求。</p>
<p>逻辑层包括业务逻辑服务和基础逻辑服务。</p>
<p>业务逻辑服务封装了业务逻辑,是后台提供给微信客户端调用的API。</p>
<p>基
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP