
1) 【一句话结论】采用“实时消息队列(如Kafka)+分布式消息中间件+客户端长连接+推送服务(APNs/FCM)”的架构,通过消息分片、优先级队列和幂等处理,确保动态消息的低延迟(毫秒级)和高可靠性(不丢失)。
2) 【原理/概念讲解】
老师:咱们先拆解“实时性+低延迟”的核心需求,对应到系统架构的每个环节。首先看消息产生:用户发布动态时,服务端生成包含用户ID、内容、时间戳、优先级等字段的消息对象,写入消息队列(比如Kafka)。
类比:消息队列像“快递中转站”,负责有序暂存消息,保证顺序和可靠性。
然后是存储:消息队列负责暂存消息(保证实时性),同时持久化到数据库(如MySQL)作为备份(防止消息丢失)。
接着是路由:消息处理服务从队列读取消息,根据优先级(系统通知>用户动态)放入不同队列,再根据好友关系(从关系表查询)生成推送任务。
最后是推送:客户端通过WebSocket保持长连接,服务端通过APNs(iOS)或FCM(Android)发送消息,实现毫秒级通知。
3) 【对比与适用场景】
| 对比项 | 消息队列(Kafka) | 数据库(Redis) |
|---|---|---|
| 定义 | 分布式消息中间件,高吞吐、低延迟 | 内存数据库,适合缓存 |
| 特性 | 高吞吐、持久化、可分区 | 低延迟、内存存储、适合小规模 |
| 使用场景 | 实时消息推送、高并发场景 | 小规模、低并发、快速查询 |
| 注意点 | 需要维护分区和消费者 | 内存限制,不适合大流量 |
4) 【示例】
用户A发布动态,服务端生成消息(msg_id=1, user_id=A, content="今天天气真好",priority=普通),写入Kafka主题“dynamic”。
消息处理服务读取该消息,查询好友关系表(A的好友B、C),将消息转换为推送任务(task_id=1, target_user=B, C, msg_id=1),放入优先级队列(系统通知优先级1,普通动态优先级2)。
优先级队列按优先级取出任务,调用APNs发送给B、C的客户端。客户端通过长连接接收推送,展示动态。
5) 【面试口播版答案】
面试官您好,针对社交应用动态消息推送系统,我设计的核心架构是采用“实时消息队列+分布式消息中间件+客户端长连接+推送服务”的组合,目标是保证毫秒级延迟和消息不丢失。首先,用户发布动态时,服务端生成消息对象写入Kafka等消息队列,确保顺序和可靠性;存储层面,消息队列暂存+数据库备份防止丢失。路由环节,根据消息优先级(系统通知>用户动态)放入不同队列,再根据好友关系生成推送任务;推送部分,客户端通过WebSocket保持长连接,服务端通过APNs/FCM发送消息。为防止重复推送,采用消息ID+目标用户ID作为唯一标识(幂等性);优先级通过队列优先级和消息字段区分(系统通知优先处理)。这样整个流程能保证好友收到动态后立即通知,且消息不会丢失或延迟过高。
6) 【追问清单】
7) 【常见坑/雷区】