51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

设计一个支持百万级用户并发、低延迟的实时消息系统(类似微信聊天),请描述系统架构、核心组件、数据存储方案以及如何保证消息不丢失、不重复。

Tencent软件开发-测试开发方向难度:困难

答案

1) 【一句话结论】采用“消息队列(如Kafka)+ 分布式存储(如MySQL/Redis)+ 消息持久化 + 幂等处理”的架构,通过消息队列解耦生产者与消费者,结合持久化存储保证消息不丢失,通过幂等机制避免重复消费,最终实现百万级并发、低延迟的实时消息系统。

2) 【原理/概念讲解】老师讲解:实时消息系统需解决高并发、低延迟、消息可靠性三大核心问题。

  • 消息队列(如Kafka):作为缓冲层,解耦生产者(发送消息)与消费者(接收消息),生产者发送后立即返回,避免阻塞;支持高吞吐、低延迟的异步通信。
  • 消息持久化:消息队列将消息写入磁盘日志(如Kafka的日志持久化),即使服务重启也能恢复消息;同时,消息异步写入数据库(如MySQL),保证数据持久性。
  • 消息不丢失:通过消息队列的“持久化日志”+数据库“事务(ACID)”实现,确保中间件故障时消息不丢失。
  • 消息不重复:采用消息唯一标识(如消息ID)+幂等处理(如数据库乐观锁、消息队列幂等消费),重复消息被过滤。
    类比:快递系统,消息队列是“中转仓库”,每个包裹有唯一编号,仓库记录状态(已签收/未签收),消费者(快递员)按顺序取包裹,避免重复派送。

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) 【追问清单】

  • 问:如何检测消息丢失?
    答:通过消息队列“消费确认机制”+数据库“消息处理状态记录”,若消费者超时未确认,生产者重试;若重试失败,标记为“丢失”并触发告警。
  • 问:系统如何扩展?
    答:消息队列水平扩展(增加Broker节点),数据库分库分表,消费者集群(多实例)负载均衡,通过重平衡机制分配积压消息。
  • 问:延迟优化措施?
    答:消息队列批量消费(减少网络开销),数据库读写分离(主从复制),消费者本地缓存(Redis)减少数据库访问,消息队列分区策略优化处理顺序。
  • 问:如何处理消息积压?
    答:增加消费者实例,消息队列重平衡(自动分配积压消息),或部分消息写入冷存储(如HBase)降低实时性要求。
  • 问:跨地域部署时如何保证一致性?
    答:采用分布式事务(如两阶段提交或SAGA),结合消息队列“事务消息”功能,确保跨地域节点一致性,同时考虑网络延迟和分区容错。

7) 【常见坑/雷区】

  • 坑1:仅用数据库存储,忽略消息队列缓冲,导致生产者阻塞,高并发下性能下降。
  • 坑2:未设计幂等机制,重复消息导致业务逻辑错误(如重复发送通知)。
  • 坑3:消息持久化方案选择不当(如仅内存存储),服务重启后消息丢失。
  • 坑4:延迟优化不足(如数据库直接写入),消费者处理延迟高,影响用户体验。
  • 坑5:未考虑消息积压处理,高并发时消息队列积压,导致后续消息延迟。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1