
1) 【一句话结论】
设计一个基于微服务架构的实时消息推送系统,核心是通过消息队列(Kafka)解耦消息生产与消费,结合WebSocket实现低延迟通信,并采用分布式存储与负载均衡策略,确保百万级用户下的高可用与消息延迟小于1秒。
2) 【原理/概念讲解】
老师口吻解释系统架构:
系统分为用户服务(管理用户会话、消息路由规则,如群聊、@消息的规则)、消息服务(负责消息的持久化存储与路由转发)、推送服务(通过WebSocket长连接,服务器主动推送消息给客户端)。
3) 【对比与适用场景】
| 特性 | Kafka | RabbitMQ |
|---|---|---|
| 定义 | 分布式流处理平台,支持高吞吐、日志持久化、多分区并行消费、事务消息 | 企业级消息队列,基于交换机/队列/绑定实现可靠通信 |
| 核心特性 | 高吞吐(百万级消息/秒)、日志持久化(追加写入磁盘)、多分区(支持并行消费)、事务消息(确保生产者与消费者事务一致性) | 基于交换机模式(direct、topic、fanout),可靠性(事务消息、死信队列)、消息持久化(可选) |
| 使用场景 | 实时数据流(日志、监控)、大规模异步处理、消息持久化(如消息队列) | 应用间异步通信、事务消息、小规模消息传递(如订单通知) |
| 注意点 | 需手动管理分区/消费者,配置复杂(如分区数、副本因子、事务配置);消息路由需自定义键 | 需配置交换机/队列/绑定,消息路由逻辑复杂(如topic模式按主题分发);事务消息实现较复杂 |
4) 【示例】
用户A给群聊“team1”发消息并@用户B的流程:
POST /api/messages
{
"sender": "A",
"receiver_type": "group",
"receiver_id": "team1",
"content": "项目进度更新",
"mentions": ["B"] // @用户B
}
# 订阅主题
consumer.subscribe(topic="chat_messages")
while True:
msg = consumer.poll(timeout=1)
if msg:
receiver_type = msg.key.split("_")[0]
receiver_id = msg.key.split("_")[1]
if receiver_type == "group":
# 从Redis获取群聊成员的WebSocket连接(key为群聊ID)
members = redis.hgetall(f"group_members_{receiver_id}")
for member_id, conn in members.items():
if member_id in ["B"]: # 仅示例@用户B
ws.send(conn, msg.value)
else:
ws.send(conn, msg.value) # 群聊所有成员
else: # 单聊
receiver_id = msg.key.split("_")[1]
conn = redis.get(f"websocket_{receiver_id}")
if conn:
ws.send(conn, msg.value)
5) 【面试口播版答案】
面试官您好,针对微信实时消息推送系统,我的设计核心是构建一个微服务架构的分布式系统,通过消息队列(Kafka)解耦消息生产与消费,结合WebSocket实现低延迟通信,并采用负载均衡与分布式存储,确保百万级用户下的高可用与消息延迟小于1秒。具体来说:
6) 【追问清单】
7) 【常见坑/雷区】