1. 引言
大家好,我是小?。
当我那天拿着手机,正在和朋友们的微信群里畅聊着八卦新闻和即将到来的周末计划时,忽然一条带着喜意的消息扑面而来,消息正中间写着八个大字:恭喜发财,大吉大利。
图片
抢红包!!相信大部分人对此都不陌生,那微信的这个群聊系统是如何设计的,让我们可以方便地聊天、分享图片和表情,还有那个神奇的红包功能呢?
这个问题一直困扰着,于是我决定深入了解一下,看看微信的群聊系统背后的设计是怎样的。
微信群聊系统设计
微信作为 10 亿用户级别的全民 App,想必大家都用过,微信建群功能是微信里面核心的一个能力,它可以将数百个好友或陌生人放进一个群空间。
图片
或许你已经在微信上体验过很多次群组聊天,但你是否好奇过这个背后的系统是如何设计的呢?
今天我们就来探讨一下。
2. 系统需求
2.1 系统特点与功能需求
微信群聊功能是社交应用的核心功能之一,它允许用户创建自己的社交圈子,与家人、朋友或共同兴趣爱好者进行友好地交流。
以下是微信群聊系统的核心功能:
图片
- 创建群聊:用户可以创建新的聊天群组,邀请其他好友用户加入或与陌生人面对面建群。
- 群组管理:群主和管理员能够管理群成员,设置规则和权限。
- 消息发送和接收:允许群成员发送文本、图片、音频、视频等多种类型的消息,并推送给所有群成员。
- 实时通信:消息应该能够快速传递,确保实时互动。
- 抢红包:用户在群聊中发送任意个数和金额的红包,群成员可以抢到随机金额的红包。
2.2 非功能需求:应对高并发、高性能、海量存储
当我们面对 10 亿微信用户每天都可能使用建群功能的情景时,就需要处理大规模的用户并发。这就引出了系统的非功能需求,包括:
- 高并发:系统需要支持大量用户同时创建和使用群组,以确保无延迟的用户体验。
- 高性能:快速消息传递、即时响应,是数字社交的关键。
- 海量存储:系统必须可扩展,以容纳用户生成的海量消息文本、图片及音视频数据。
3. 概要设计
在概要设计中,我们考虑了系统的核心组件和基本业务的概要设计。
3.1 核心组件
微信群聊系统中,会涉及到如下核心组件和协议。
图片
- 客户端:接收手机或 PC 端微信群聊的消息,并实时传输给后台服务器
- Websocket传输协议:支持客户端和后台服务端的实时交互,开销低,实时性高,常用于微信、QQ 等 IM 系统通信系统
- 长连接集群:与客户端进行 Websocket 长连接的系统集群,并将消息通过中间件转发到应用服务器
- 消息处理服务器集群:提供实时消息的处理能力,包括数据存储、查询、与数据库交互等
- 消息推送服务器集群:这是信息的中转站,负责将消息传递给正确的群组成员
- 数据库服务器集群:用于存储用户文本数据、图片的缩略图、音视频元数据等
- 分布式文件存储集群:存储用户图片、音视频等文件数据
3.2 业务概要设计
群聊创建
- 唯一ID分配:当用户请求创建一个新群组时,系统生成一个唯一的群组 ID,通常可以使用分布式 ID 生成器如雪花算法(Snowflake)或直接使用数据库自增 ID。这里我们为了实现简便,采用 MySQL 的自增 ID。
- 群组信息存储:将群组 ID 和相关信息(例如群名、创建者 ID 等)存储在群组数据库中。
- 成员关联:将群主添加为群组的创始成员,同时创建者也会成为管理员。
- 消息历史记录:为了确保新成员能够访问以前的消息,将此新群组的群组 ID 与用户消息关联存储。
除了拉好友建群,微信还实现了面对面建群的能力。
接下来,我们深入探讨了三到四个核心功能的详细设计,包括面对面建群、消息发送与接收及抢红包功能。
4. 面对面建群
用户发起面对面建群,并输入一个 4 位数的随机码,周围的用户输入该随机码后可加入群聊,面对面建群功能通常涉及数据表设计和核心业务交互流程如下。
4.1 数据库表设计
- User 表:存储用户信息,包括用户 ID、昵称、头像等。
- Group 表:存储群组信息,包括群 ID、群名称、创建者 ID、群成员个数等。
- GroupMember 表:关联用户和群组,包括用户 ID 和群 ID。
- RandomCode 表:存储面对面建群的随机码和关联的群 ID。
4.2 核心业务交互流程
图片
用户 A 在手机端应用中发起面对面建群,并输入一个随机码,校验通过后,等待周围(50 米之内)的用户加入。此时,系统将用户信息以 HashMap 的方式存入缓存中,并设置过期时间为 3min。
{随机码,用户列表[用户A(ID、名称、头像)]}
关键字:
声明:我公司网站部分信息和资讯来自于网络,若涉及版权相关问题请致电(63937922)或在线
提交留言告知,我们会第一时间屏蔽删除。