【微服务】微信的消息收发机制

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 关注公众号“达摩院首座”,了解开发者最真实生活
   微信可能是国内最早一批做微服务架构体系的,毕竟微服务的理念与腾讯一直倡导的“大系统小做”有很多相通之处,当然微信的功能有很多,衣食住行都能找到入口。我们今天单说它的原生功能:即时通信。

    这块内容本座想分两部分来讲,第一部分是点到点聊天,第二部分是群组聊天。这两种聊天模式有共同点,比如说已读信息不会在服务端保留,因此换新手机是找不到历史消息的。也有不同点,比如服务端的架构和数据流等等。

    先说点到点聊天,手机端通过打开微信软件建立了到腾讯云的微信网关,当然考虑到就近访问与负载平衡,不同客户端可能连到不同的网关。当A用户通过网关B发送微信给在线用户B时,会话微服务会记录当前所有用户的连入信息,维护如下的用户-网关表:
用户 网关
A B
B C
C C

如果对端用户不在线,则会记录上次连接的网关,如果从来没在线过则随机分配网关。这张表虽然有高达10亿的记录(微信用户数量),但好在只是一张二维表而且可做冷热分离,因此存储量并不大,然后各个网关上会有热数据的分布式缓存。

为什么要这样做呢,因为我们知道让一台网关服务器来维持每一个客户端的TCP连接是非常消耗内存的,鉴于微信用户的数量,一般硬件的性能是无法达到的,因此通过会话微服务来记录这些信息可以很好地为网关减负。
1.jpg

接下来当消息进入到会话微服务找到B对应的网关,然后通过该网关将消息传递给B用户。

等等,什么,网关在没有用户请求的情况下还能直接给用户发消息,这是我认识的CS架构么?当然通过长轮询(Long Polling)可以定期从服务端拉数据,但这就影响了消息的实时性了。传统的HTTP看似无法实现了,我们想到的办法是WebSocket(WSS)。WSS是通过单个TCP连接提供全双工(双向通信)通信信道的计算机通信协议。它允许用户和服务器之间的流连接,并允许即时信息交换。

Ok,消息传递到在线用户B了,B用户回复给服务器“已收到”的回执(不论已读还是未读),会话服务器再以WSS形式将回执转发给A。当然如果B用户离线,消息会存放在消息数据库中直到过期(三天?)。因此点对点聊天在服务器上并不消耗太多的存储资源。

接下去我们说说群组消息,当会话微服务识别到消息的接收方是一个群组时,会去调用群组微服务,群组微服务的表结构是一张一对多的分布式数据表:

群组ID 用户
XXX A
XXX B
XXX C
YYY C
YYY D
YYY E

得到目标群的用户列表后,会话微服务再查询自己的会话数据库找到用户对应的网关,通过WebSocket的形式发送给该群组的所有成员。

2.jpg

当然就像新浪在李晨发“我们”,鹿晗发“官宣”,中国国家男子足球队发“对不起”的时候会发生服务器宕机现象,新浪的处理方式是将粉丝群切片,分批次发给不同子群。微信也会在成员过多的群通过异步的消息队列进行批量组播,但即便如此,与点到点微信不同的是,网关的负担会大很多,因此除了将会话微服务从网关上拆解,还需要进一步将验证服务、语义分析服务(各种网络协议的解包)从网关服务器上拆解下来,由此就形成了微信的群族消息的数据流。

相关文章
|
3月前
|
存储 搜索推荐 数据库
MarkLogic在微服务架构中的应用:提供服务间通信和数据共享的机制
随着微服务架构的发展,服务间通信和数据共享成为关键挑战。本文介绍MarkLogic数据库在微服务架构中的应用,阐述其多模型支持、索引搜索、事务处理及高可用性等优势,以及如何利用MarkLogic实现数据共享、服务间通信、事件驱动架构和数据分析,提升系统的可伸缩性和可靠性。
49 5
|
5月前
|
存储 负载均衡 数据库
探索微服务架构中的服务发现机制
【7月更文挑战第24天】在微服务架构的复杂网络中,服务发现是确保通信流畅与系统弹性的关键组件。本文将深入探讨服务发现的工作原理、面临的挑战以及解决方案,同时比较不同服务发现工具的性能特点,旨在为开发者提供实现高效服务发现的实战指南。
|
5月前
|
敏捷开发 设计模式 负载均衡
深入理解微服务架构中的服务发现与注册机制
【7月更文挑战第24天】在微服务架构的海洋中,服务发现与注册机制如同灯塔指引着航行的船只。本文将探索这一机制的重要性、实现原理以及面临的挑战,带领读者领略微服务架构中的关键导航系统。
|
5月前
|
存储 负载均衡 开发者
深入理解微服务架构中的服务发现机制
【7月更文挑战第19天】在微服务架构的海洋中,服务发现是一艘至关重要的航船,它指引着各个微服务之间的通信与协作。本文将揭开服务发现的神秘面纱,探索其工作原理、实现方式及面临的挑战,为开发者提供清晰的导航,确保服务间的顺畅航行。
|
5月前
|
敏捷开发 设计模式 监控
探索微服务架构中的服务发现机制
【7月更文挑战第20天】在微服务架构的海洋中,服务发现是一艘必不可少的航船,它指引着各个服务如何相互寻觅和沟通。本文将深入探讨服务发现的核心原理、主流解决方案以及在实际应用中的考量因素,为构建高效、稳定的微服务系统提供导航。
46 2
|
5月前
|
消息中间件 API 数据库
在微服务架构中,每个服务通常都是一个独立运行、独立部署、独立扩展的组件,它们之间通过轻量级的通信机制(如HTTP/RESTful API、gRPC等)进行通信。
在微服务架构中,每个服务通常都是一个独立运行、独立部署、独立扩展的组件,它们之间通过轻量级的通信机制(如HTTP/RESTful API、gRPC等)进行通信。
|
5月前
|
存储 负载均衡 网络协议
微服务之服务发现机制
微服务的服务发现机制是一种在微服务架构中动态定位服务实例以进行通信的方法。
47 2
|
5月前
|
负载均衡 微服务
探索微服务架构中的服务发现机制
【7月更文挑战第7天】在微服务架构的海洋中,服务发现是指引方向的灯塔。本文将深入探讨服务发现的基本原理、关键组件和实现策略,以及它如何影响微服务间的通信效率和系统的整体稳定性。我们将从理论到实践,逐步揭示服务发现机制如何在现代后端系统中扮演至关重要的角色,确保服务的高可用性和灵活扩展。
|
5月前
|
存储 负载均衡 监控
探索微服务架构中的服务发现与注册机制
【7月更文挑战第2天】在微服务架构的海洋中,服务发现与注册机制扮演着灯塔的角色,确保服务间的通信不因波涛汹涌而迷失方向。本文将深入探讨这一机制如何为微服务之间的交互提供动态、高效的路径,以及它对于整个系统稳定性和扩展性的重要性。我们将从基本原理出发,逐步剖析服务发现的实现方式,并讨论在设计服务注册中心时需要考虑的关键因素。
|
5月前
|
负载均衡 Apache 开发者
微服务架构中的服务发现与注册机制
【7月更文挑战第4天】在微服务架构的复杂网络中,服务发现与注册是确保各独立服务高效、可靠通信的关键。本文将探讨服务发现与注册的重要性、实现方式及其在现代分布式系统中的应用实践,旨在为后端开发者提供深入理解和实践指南。