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

设计一个类似微信的实时消息推送系统,需要支持百万级用户,消息的实时性(延迟<1秒),高可用,请描述系统架构、消息队列、消息持久化、负载均衡等。

微软Software Engineer Intern难度:困难

答案

1) 【一句话结论】
设计一个基于微服务架构的实时消息推送系统,核心是通过消息队列(Kafka)解耦消息生产与消费,结合WebSocket实现低延迟通信,并采用分布式存储与负载均衡策略,确保百万级用户下的高可用与消息延迟小于1秒。

2) 【原理/概念讲解】
老师口吻解释系统架构:
系统分为用户服务(管理用户会话、消息路由规则,如群聊、@消息的规则)、消息服务(负责消息的持久化存储与路由转发)、推送服务(通过WebSocket长连接,服务器主动推送消息给客户端)。

  • 消息队列的作用:像“分布式消息中转站”,生产者(用户发消息)将消息写入中转站,消费者(接收用户)从中转站读取,解耦生产与消费,支持高并发和消息持久化。
  • WebSocket的作用:像“双向实时数据管道”,客户端与服务器建立持久连接,服务器无需等待客户端请求即可推送消息,减少延迟(相比轮询)。

3) 【对比与适用场景】

特性KafkaRabbitMQ
定义分布式流处理平台,支持高吞吐、日志持久化、多分区并行消费、事务消息企业级消息队列,基于交换机/队列/绑定实现可靠通信
核心特性高吞吐(百万级消息/秒)、日志持久化(追加写入磁盘)、多分区(支持并行消费)、事务消息(确保生产者与消费者事务一致性)基于交换机模式(direct、topic、fanout),可靠性(事务消息、死信队列)、消息持久化(可选)
使用场景实时数据流(日志、监控)、大规模异步处理、消息持久化(如消息队列)应用间异步通信、事务消息、小规模消息传递(如订单通知)
注意点需手动管理分区/消费者,配置复杂(如分区数、副本因子、事务配置);消息路由需自定义键需配置交换机/队列/绑定,消息路由逻辑复杂(如topic模式按主题分发);事务消息实现较复杂

4) 【示例】
用户A给群聊“team1”发消息并@用户B的流程:

  • 用户A前端发送消息:
    POST /api/messages
    {
      "sender": "A",
      "receiver_type": "group",
      "receiver_id": "team1",
      "content": "项目进度更新",
      "mentions": ["B"] // @用户B
    }
    
  • 用户服务处理:
    • 验证用户A和群聊“team1”存在,生成消息ID。
    • 根据消息类型(群聊)和接收者(群聊ID),将消息发送到Kafka主题“chat_messages”,键为“group_team1”(路由依据),值为消息内容(包括@用户信息)。
  • 消息服务(消费者)处理:
    # 订阅主题
    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)
    
  • 离线消息处理:用户B下线时,消息服务将消息写入Redis列表(key为“offline_messages_B”),用户上线时,从列表头部批量读取并推送(减少延迟)。

5) 【面试口播版答案】
面试官您好,针对微信实时消息推送系统,我的设计核心是构建一个微服务架构的分布式系统,通过消息队列(Kafka)解耦消息生产与消费,结合WebSocket实现低延迟通信,并采用负载均衡与分布式存储,确保百万级用户下的高可用与消息延迟小于1秒。具体来说:

  • 系统架构分为用户服务(管理用户会话和消息路由规则,如群聊、@消息的规则)、消息服务(负责消息的持久化存储与路由转发)、推送服务(通过WebSocket长连接实时推送消息给客户端)。
  • 消息队列选用Kafka,因为它能支撑百万级消息吞吐、持久化存储(日志追加写入磁盘),支持多分区并行消费,提升处理效率。
  • 消息持久化方面,Kafka配置副本因子≥2,数据同步到多个节点;消息服务二次写入数据库(如MySQL,通过事务提交保证一致性)。
  • 负载均衡方面,前端用Nginx分发请求到多个用户服务实例,消息队列和WebSocket服务器集群通过负载均衡器(如Nginx或LVS)分发请求,避免单点故障。
  • 实时通信通过WebSocket保持客户端与服务器持久连接,服务器主动推送消息,减少连接建立时间,确保延迟小于1秒。
  • 对于群聊消息,通过路由键(如群聊ID)将消息发送到Kafka主题,消费者读取后,从Redis获取群成员的WebSocket连接,逐一推送;@消息则额外推送至被@用户。离线消息存储在Redis队列,用户上线时批量读取并推送。
    这样架构能支撑百万级用户,实现低延迟、高并发的实时消息推送。

6) 【追问清单】

  • 问题1:如何保证消息不丢失?
    回答要点:Kafka配置副本因子(如3),数据同步到多个节点;消息服务二次写入数据库(事务提交,确保消息持久化)。
  • 问题2:用户下线时,未推送的消息如何处理?
    回答要点:维护用户离线消息队列(Redis列表,按用户ID存储消息ID),用户上线时,从队列头部批量读取并推送(减少延迟)。
  • 问题3:如何处理消息重复推送?
    回答要点:消息服务为每条消息添加唯一ID(如UUID),客户端根据ID去重;Kafka实现幂等消费(消费者确认后,生产者标记为已处理,避免重复消费)。
  • 问题4:如何保证消息顺序性(如群聊中消息按发送顺序排列)?
    回答要点:消息服务为每个会话(用户ID+群聊ID)分配有序分区(Kafka分区),消费者按分区顺序消费,确保顺序。
  • 问题5:系统如何扩展?
    回答要点:微服务架构下,各组件可独立扩展(如用户服务增加实例、Kafka增加分区、WebSocket服务器集群),满足业务增长需求。

7) 【常见坑/雷区】

  • 坑1:忽略群聊/@消息的路由逻辑,导致消息无法正确分发。
    • 反问:如果用户A给群聊发消息,如何确保群内所有成员都收到?
    • 答案:通过路由键(如群聊ID)将消息发送到Kafka主题,消费者读取后,从Redis获取群成员的WebSocket连接,逐一推送。
  • 坑2:未考虑消费失败重试机制,导致消息丢失。
    • 反问:如果消息服务消费失败,如何重试?
    • 答案:实现消费重试(如Kafka的rebalance后自动重试,或设置重试策略),并记录失败消息到死信队列,后续人工处理。
  • 坑3:离线消息实现不当,导致用户上线后消息延迟或丢失。
    • 反问:用户下线时,消息如何存储?上线后如何推送?
    • 答案:使用Redis队列存储离线消息(如列表结构,按用户ID排序),上线时批量读取并推送,避免内存泄漏(设置过期时间)。
  • 坑4:负载均衡仅覆盖前端,未覆盖后端服务,导致单点故障。
    • 反问:消息队列或WebSocket服务器集群如何负载均衡?
    • 答案:使用Nginx或LVS作为负载均衡器,分发请求到多个实例,结合Kafka的分区分配策略(如轮询或哈希),确保负载均衡。
  • 坑5:消息持久化策略单一,导致消息丢失风险。
    • 反问:如果Kafka或数据库故障,如何恢复消息?
    • 答案:Kafka配置副本因子(如3),数据同步到多个节点;数据库采用事务提交(如ACID),确保消息持久化。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1