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

请设计一个支持百万级用户并发、毫秒级延迟的即时通讯消息系统(如微信消息推送),需要考虑消息的实时性、可靠性、可扩展性,并说明关键技术选型与架构设计。

Tencent软件开发-后台开发方向难度:困难

答案

1) 【一句话结论】采用微服务分层架构,核心是分布式消息中间件(以RocketMQ为例)+ Redis + WebSocket,通过异步处理与缓存实现百万级并发与毫秒级延迟的消息系统。

2) 【原理/概念讲解】老师会解释核心概念:

  • 分布式消息中间件(以RocketMQ为例):作为消息中转站,解耦发送与接收,支持持久化存储、事务消息、高可用集群,类比“快递中转站”,接收发件人包裹后,按地址分发给收件人,避免直接联系导致的延迟或失败,且能保证包裹不丢失。
  • Redis(内存+持久化):用于实时消息状态存储(如未读列表),支持毫秒级读写和Pub/Sub,类比“手机内存缓存”,快速获取最新消息,同时持久化防止数据丢失。
  • WebSocket长连接:客户端与服务器保持持久连接,消息直接推送,类比“手机与服务器热线”,无需重复建立连接,实现低延迟。
  • 架构分层:接入层(API网关)负责请求验证与消息封装;消息路由层(RocketMQ)负责消息分发与路由;存储层(Redis+MySQL)负责实时与持久化存储;推送层(WebSocket)负责客户端传递;监控层(Prometheus+Grafana)负责性能监控。

3) 【对比与适用场景】

方案定义特性使用场景注意点
RocketMQ金融级分布式消息中间件高吞吐(单节点10万+TPS)、毫秒级延迟(<1ms)、事务消息、高可用集群业务消息、订单处理、消息异步处理(如微信消息推送)需配置高可用集群,适合高可靠性实时场景
Kafka分布式日志队列高吞吐(单节点百万TPS)、持久化、容错、离线处理日志采集、实时计算、离线分析启动慢,延迟较高(ms级),适合离线场景
Redis内存+持久化数据库毫秒级读写(<1ms)、支持Pub/Sub、RDB/AOF持久化实时消息存储、会话管理、缓存内存有限,需定期持久化,不适合海量持久化存储
MySQL关系型数据库持久化、事务支持、复杂查询消息持久化存储、历史消息查询写入延迟高(ms级以上),不适合实时消息

4) 【示例】
伪代码(发送消息流程):

def send_message(user_id, target_id, content):
    # 接入层:验证用户权限
    if not validate_user(user_id):
        return {"code": 401, "msg": "Unauthorized"}
    
    # 路由层:发送到RocketMQ
    send_to_rocketmq(user_id, target_id, content)
    
    # 存储层:存入Redis(实时消息列表)
    store_in_redis(user_id, target_id, content)
    
    # 推送层:通过WebSocket推送给目标客户端
    push_via_websocket(target_id, content)
    
    return {"code": 200, "msg": "Message sent"}

消息队列消息结构(JSON):

{
  "type": "message",
  "sender": "user123",
  "receiver": "user456",
  "content": "Hello!",
  "timestamp": 1672531200
}

5) 【面试口播版答案】
面试官您好,针对百万级并发、毫秒级延迟的即时通讯消息系统,我的核心设计是分层架构+关键技术选型。整体分为接入层、消息路由层、存储层、推送层和监控层。接入层负责请求验证和消息封装;消息路由层用RocketMQ解耦发送与接收,保证高吞吐和可靠性;存储层用Redis(内存+持久化)存储实时消息状态,支持毫秒级读取;推送层通过WebSocket长连接推送给客户端。关键技术选型上,RocketMQ用于异步处理和路由,Redis用于实时存储,WebSocket用于低延迟。流程是:用户发消息后,接入层将消息发到RocketMQ,路由层分发并同步到Redis,推送层通过WebSocket推送给目标客户端。这样能支撑百万级并发和接近毫秒级的延迟,同时保证可靠性和可扩展性。

6) 【追问清单】

  • 问题1:如何保证消息不丢失?
    回答要点:RocketMQ持久化存储+ACK确认机制,失败后重试,结合事务消息保证最终一致性。
  • 问题2:如何处理消息幂等性?
    回答要点:消息头含唯一ID,消费端检查是否已处理(如Redis SETNX或数据库唯一索引)。
  • 问题3:如何实现消息离线存储与重发?
    回答要点:RocketMQ重试机制+Redis存储未推送消息,定时重发(如5分钟/小时)。
  • 问题4:如何保证群聊消息顺序性?
    回答要点:RocketMQ按顺序写入+消费端顺序处理,或事务消息保证顺序。

7) 【常见坑/雷区】

  • 坑1:忽略可靠性设计(如未提消息重试、幂等性),导致消息丢失。
  • 坑2:使用同步数据库(如MySQL)存储实时消息,导致延迟过高,无法满足毫秒级要求。
  • 坑3:未设计水平扩展方案(如单点消息队列),导致系统无法支撑百万级并发。
  • 坑4:忽略消息顺序性(如群聊消息乱序),影响用户体验。
  • 坑5:未考虑流量削峰(如无缓冲层),导致消息队列压力过大。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1