
1) 【一句话结论】
核心设计是构建以Kafka为核心的分布式消息系统,结合Redis缓存和MySQL持久化存储,通过用户ID/会话ID路由实现毫秒级推送,并采用生产者确认、消费者偏移提交、重试与死信队列、幂等处理等机制保障消息不丢失、不重复。
2) 【原理/概念讲解】
老师:我们逐个拆解核心组件的原理,确保每个点都落地。
3) 【对比与适用场景】
| 组件 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 消息队列(Kafka) | 分布式消息系统,基于发布-订阅模式 | 高吞吐、持久化、低延迟、多消费者 | 实时消息推送、日志收集 | 需合理配置分区数(如按用户数或会话ID分区),消费者组管理 |
| 缓存(Redis) | 内存数据库,支持多种数据结构 | 毫秒级读写、高并发、内存限制 | 热数据缓存、会话存储 | 需持久化(RDB/AOF),避免数据丢失 |
| 持久化存储(MySQL) | 关系型数据库 | 事务支持、持久化、查询 | 消息元数据(ID、时间、状态) | 写性能需优化(分库分表),避免单点瓶颈 |
4) 【示例】
# 假设使用Kafka生产者
producer.send(topic='chat_messages', key=user_id, value=message) # key用于路由
producer.flush() # 确保消息发送到Kafka
# 消费者订阅主题,按key分区
consumer.subscribe(topics=['chat_messages'], key_deserializer=lambda k: str(k).encode('utf-8'))
while True:
msg = consumer.poll(timeout=1.0)
if msg:
process_message(msg.value) # 处理消息(更新Redis缓存、推送客户端)
INSERT INTO chat_messages (user_id, session_id, content, send_time, status)
VALUES (user_id, session_id, message, NOW(), 'sent')
// WebSocket连接
socket.onmessage = function(e) {
const msg = JSON.parse(e.data);
// 更新UI,显示消息
}
5) 【面试口播版答案】
面试官您好,针对百万级用户、毫秒级响应的实时消息推送系统,我的核心设计是构建以Kafka为核心的分布式消息架构,结合Redis缓存和MySQL持久化存储,通过用户ID/会话ID路由实现快速推送,并采用生产者确认、消费者偏移提交、重试与死信队列、幂等处理等机制保障消息不丢失、不重复。具体来说,消息由生产者发送到Kafka,通过分区和消费者组实现高并发消费;Redis缓存热数据提升读取速度;MySQL存储消息元数据保证持久化。消息路由根据接收者ID将消息推送到客户端长连接队列,客户端实时接收。容错方面,失败消息会重试,多次失败进入死信队列;通过消息ID或状态机实现幂等,避免重复消费。监控方面,跟踪消息延迟、吞吐量、错误率,确保系统稳定。
6) 【追问清单】
7) 【常见坑/雷区】