
1) 【一句话结论】采用“消息队列(如Kafka)+ 分布式存储(如MySQL/Redis)+ 消息持久化 + 幂等处理”的架构,通过消息队列解耦生产者与消费者,结合持久化存储保证消息不丢失,通过幂等机制避免重复消费,最终实现百万级并发、低延迟的实时消息系统。
2) 【原理/概念讲解】老师讲解:实时消息系统需解决高并发、低延迟、消息可靠性三大核心问题。
3) 【对比与适用场景】
| 对比项 | 消息队列(Kafka) | 关系型数据库(MySQL) |
|---|---|---|
| 定义 | 分布式流处理平台,高吞吐、低延迟 | 关系型数据库,事务支持、持久化 |
| 特性 | 持久化日志、高吞吐、分布式 | ACID事务、数据一致性、事务隔离 |
| 使用场景 | 实时消息、日志收集、流处理 | 业务数据存储、需要强事务的场景 |
| 注意点 | 需管理日志清理,避免磁盘爆炸 | 事务开销大,不适合高并发写入 |
4) 【示例】(伪代码,生产者发送消息+消费者处理)
# 生产者发送消息到Kafka(持久化到磁盘日志)
producer.send(topic="chat_message", key=user_id, value=message)
producer.flush() # 确保消息写入持久化日志
# 消费者消费消息并持久化到数据库
consumer.subscribe(["chat_message"])
while True:
msg = consumer.poll(timeout=1)
if msg:
# 幂等性检查:判断消息是否已处理(数据库中消息ID是否存在)
if not is_message_processed(msg.key, msg.value):
# 持久化消息到数据库(如MySQL)
save_message_to_db(msg.key, msg.value)
# 发送消息给用户(如WebSocket推送)
send_to_client(user_id, msg.value)
5) 【面试口播版答案】(约80秒)
“面试官您好,针对百万级用户并发、低延迟的实时消息系统,我设计的核心架构是‘消息队列 + 分布式存储 + 消息持久化 + 幂等处理’。首先,消息队列(如Kafka)作为缓冲层,解耦生产者和消费者,确保生产者发送后立即返回,避免阻塞。然后,消息持久化:Kafka将消息写入磁盘日志,即使服务重启也能恢复消息;同时,将消息异步写入数据库(如MySQL),保证数据持久性。对于消息不丢失,通过消息队列的持久化日志和数据库事务(ACID)实现,确保中间件故障时消息不丢失。对于消息不重复,采用消息唯一标识(如消息ID)和幂等处理,比如数据库中存储消息ID,重复消息检查后跳过,或者消息队列的幂等消费策略。具体来说,生产者发送消息到Kafka后,消费者按顺序拉取,处理时先检查数据库是否已存在该消息ID,若存在则跳过,否则保存并推送。这样既保证了低延迟(消息队列异步处理,消费者快速拉取),又保证了高并发下的消息可靠性。”
6) 【追问清单】
7) 【常见坑/雷区】