微信消息技术架构演进
共 1510字,需浏览 4分钟
·
2024-07-22 08:05
之前我们介绍了美团到家商品库存系统演进之路,今天继续介绍国内知名互联网产品的技术架构。
微信DAU超过了13.4亿,是国民级应用。
微信之父是张小龙,一个程序员出身的产品经理。
我们今天一起看看微信技术架构的演进,学习下优秀架构是如何长出来的。
微信是由广研院开发出来的,在此之前,广研院主要是负责QQ邮箱系统。
邮箱的核心是消息的收发,这一点和微信很像,所以微信消息收发的很多技术架构思想都源于邮箱的存储转发机制。
微信作为即时消息软件,需要满足消息收发实时性以及消息的不丢。
比如用户A发送消息给用户B,首先要将消息发送到接入层、逻辑层、存储层。
connectSvr主要负责长链接的接入,是接入层。
接入层将消息转发到sendSvr逻辑层,进行消息处理,包括一些反垃圾、黑名单处理等。
之后消息会进入msgStore存储层存起来。
之后消息就开始向用户B发送。
逻辑层sendSvr同时转发消息到通知服务PushSvr,也就是图中4的部分。
pushSvr发送push tips给手机操作系统的push系统,比如苹果的apnsPush。
正常情况下,可以通过接入层connectSvr与用户B的长链接发送消息给到B。
同时因为操作系统,比如苹果iOS,如果APP退到后台进程,操作系统会释放所有的资源,比如CPU、网络、内存等,导致之前建立的长链接断开,也就是图中的5.1的长链接是不可达的,需要依赖5.2的苹果自身的apns通道发送通知。
当B用户收到新消息通知后,会进行消息的拉取。
手机B会发起拉取消息请求到接入层ConnectSvr,接入层将请求转发到逻辑层的ReceiveSvr处理,ReceiveSvr从存储层MsgStore获取消息。
这样一条从A发送到B的消息,可以保证在100ms内收到,但如果iOS用户退出了自己的APP,在苹果apns服务正常工作的情况下,也是可以保证秒级内B收到A的消息的。
为了实现消息的不丢,最简单的方案是手机端在收到每条消息后都发送给服务端一次ack确认,但此方案会导致手机端和服务端交互过多。
同时在遇到弱网情况时,ack还会丢失。
为了实现消息的不丢,微信架构引入了sequence机制。
1)每个用户都有42亿的sequence空间,从小到大连续分配;
2)每个用户的每条消息都需要分配一个sequence;
3)服务器存储每个用户已经分配到的最大sequence;
4)手机端存储已收取消息的最大sequence;
当手机端和服务端多有自己的sequence存储之后,双方就可以根据sequence的差异来收取消息了。
首先,根据手机端和服务端之间的sequence差异,可以轻松实现增量下发手机端未收取下发去的消息。
如果在弱网情况下,网络丢包的概率很高,由于手机端只有在确切收到消息后才更新本地的sequence,所以即时服务器的回包丢了,手机端等待超时后重新到服务器拉取旧的sequence的消息,同样可以正确的获取未下发的消息。
比如手机端当前的seq_cli=100,而服务端的seq_svr=150,说明100-150之间的消息未能获取到,所以手机端可以拉取sequence[101-150]的消息,并且将手机端的seq_cli设置为150。
以上就是微信架构如何实现消息收发的实时性和消息不丢的方案,返璞归真,都是非常朴实的解决方案。