
1) 【一句话结论】
采用微服务拆分+分布式消息队列(Kafka)+双存储(Redis+MySQL)+客户端长连接的架构,通过组件解耦和水平扩展,保障百万级用户的消息实时性、可靠性与可扩展性。
2) 【原理/概念讲解】
老师:设计百万级用户实时消息系统,核心是解决低延迟、高可用、可扩展三大问题,需通过组件协同实现:
3) 【对比与适用场景】
| 组件 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Redis | 内存数据库,支持持久化 | 读写延迟低(毫秒级),高并发,支持RDB/AOF持久化 | 实时消息缓存(如未读消息、最新消息) | 内存有限,需配置持久化避免数据丢失 |
| MySQL | 关系型数据库 | 事务支持,可靠持久化,支持复杂查询 | 历史消息存储,消息持久化 | 读写延迟较高,不适合实时推送 |
| Kafka | 分布式消息队列 | 高吞吐,持久化,分区并行,副本因子3 | 消息中转(如消息队列,处理高并发消息) | 需消费端确认,否则消息重试 |
| RDB/AOF | Redis持久化策略 | RDB:全量快照(分钟级),AOF:追加日志(秒级) | 平衡性能与持久化 | RDB恢复快但可能丢失数据,AOF安全但写入慢 |
4) 【示例】
用户A发送消息给用户B的流程(伪代码):
POST /send_message
{
"from": "userA",
"to": "userB",
"content": "hello",
"timestamp": 1678888888
}
chat_messages,分区根据to用户ID(如分区0对应userB)。userB:messages列表,设置过期时间(如7天);5) 【面试口播版答案】
面试官您好,针对百万级用户实时消息系统,我的设计核心是通过微服务拆分、分布式消息队列和双存储方案,实现低延迟、高可靠和高扩展。首先,客户端与服务端通过WebSocket建立长连接,并定期发送心跳保持连接。消息发送时,服务端将消息写入Kafka,利用其分区和副本机制保证消息不丢失且可水平扩展。消息消费服务从Kafka读取消息后,通过WebSocket推送给目标用户。消息存储方面,实时消息用Redis缓存(低延迟,支持RDB/AOF持久化),历史消息存MySQL(事务保证数据可靠)。扩展性上,消息队列和存储服务可水平扩展,客户端连接通过负载均衡分发。容错方面,Kafka持久化数据支持服务重启后继续消费,Redis的持久化备份恢复数据。这个方案通过组件解耦和分布式技术,满足百万级用户的实时性和可靠性需求。
6) 【追问清单】
7) 【常见坑/雷区】