十年架构一梦醒,微信消息系统现在长这样
十年前,微信的消息收发架构还带着浓厚的“邮箱”气息,基于存储转发机制,依靠 ConnectSvr、SendSvr、PushSvr 等模块完成消息的发送与接收。
而如今,随着用户规模的爆炸式增长和业务场景的多样化,微信的消息系统早已进化为一个庞大而精密的分布式系统。
架构演进
从层级到模块化。
微信当前采用了多层架构(N-layer Architecture),主要包括接入层(Access Layer)、逻辑层(Logic Layer)和存储层(Storage Layer)。接入层负责处理客户端的网络请求和服务器的推送;逻辑层处理业务逻辑,提供抽象接口;存储层则负责消息的持久化存储。
为了提高系统的可扩展性和维护性,微信将业务逻辑拆分为多个独立的模块,每个模块根据功能和重要性进行部署和扩展。这种模块化设计使得各个组件可以独立部署,互不影响,提高了系统的稳定性和灵活性。
消息传递机制
异步队列与状态跟踪。
在消息传递方面,微信引入了异步消息队列来处理消息的发送和接收。这种机制特别适用于群聊等需要大量消息处理的场景,可以有效地提高系统的吞吐量和响应速度。
此外,微信还通过跟踪每位用户的最后阅读消息索引来管理未读消息的投递,确保用户不会错过任何一条消息。这种设计不仅提高了用户体验,也减轻了服务器的负担。
网络协议与安全性
MMTLS 的应用。
在网络通信方面,微信采用了 MMTLS(Modified Mobile Transport Layer Security)协议,这是对标准 TLS 协议的修改版本,旨在适应移动通信的特点。MMTLS 提供了加密通信的能力,确保消息在传输过程中的安全性。
然而,研究人员指出,MMTLS 在某些实现上存在安全隐患,例如使用确定性初始化向量(IV)和缺乏前向保密性(Forward Secrecy)。这些问题可能会影响消息的保密性和完整性,值得开发者关注。
消息防丢机制
Sequence 与 ACK 的结合。
为了确保消息不丢失,微信采用了基于序列号(Sequence)的机制。每条消息都会分配一个唯一的序列号,客户端和服务器通过比较序列号来确认消息的接收情况。如果客户端未能收到某条消息,可以通过重新请求缺失的序列号范围来补齐消息。
这种机制结合了 ACK(确认)和重传策略,即使在网络不稳定的情况下,也能保证消息的可靠传输。
总结
微信的消息收发架构已经从最初的邮箱式设计演变为一个高度模块化、可扩展的分布式系统。通过引入多层架构、异步消息队列、MMTLS 协议以及基于序列号的消息确认机制,微信能够在保证消息实时送达的同时,确保消息的安全性和可靠性。
随着用户需求的不断增长和技术的持续发展,微信的消息系统也将继续演进,以应对更加复杂和多样化的通信场景。
ChatGPT
编的,如有错误,OpenAI 背锅。
发布评论