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

请设计一个用于PC客户端(如QQ/微信)的高并发消息推送系统,要求消息延迟低(毫秒级)、高可用(99.9%以上),并支持大规模用户(千万级)。请说明系统架构、核心组件、数据一致性处理以及如何保证消息不丢失或重复。

Tencent软件开发-PC客户端开发方向难度:困难

答案

1) 【一句话结论】采用基于分布式消息中间件(如Kafka)的推送系统,通过消费者拉取模式、消息持久化、幂等处理及多副本高可用设计,实现毫秒级延迟、99.9%以上可用性,支持千万级用户。

2) 【原理/概念讲解】高并发消息推送的核心是“低延迟”与“高可用”。对于毫秒级延迟,传统推送(如轮询)效率低,故采用消息队列的消费者拉取模式——客户端(消费者)主动从队列拉取消息,避免推送延迟。高可用需消息中间件支持多副本(如Kafka的副本机制),主节点故障时副本自动切换,保证服务不中断。数据一致性采用最终一致性:消息持久化(如Kafka日志持久化)确保不丢失,消费端通过幂等处理(消息ID+业务逻辑)避免重复消费。大规模用户支持通过水平扩展消息队列节点(增加Broker),客户端订阅多个Broker实现负载均衡。

类比:消息队列像快递站,生产者(发消息)把包裹放快递站,消费者(客户端)去取包裹,快递站有多个分站(副本),即使某个分站坏,还能从其他分站取包裹,保证包裹不丢。

3) 【对比与适用场景】

特性KafkaRabbitMQ适用场景
事务支持事务消息(Exactly-Once)简单事务需强一致性场景
吞吐量高(百万级QPS)中(万级QPS)大规模高并发推送
延迟毫秒级(拉取模式)毫秒级(推送模式)低延迟消息
持久化日志持久化,高可靠性队列持久化需消息不丢失
扩展性水平扩展Broker节点水平扩展队列节点千万级用户

注意点:Kafka适合高吞吐、持久化,但消费端需处理大量消息(需批量处理);RabbitMQ适合点对点,但扩展性不如Kafka。

4) 【示例】(伪代码)
生产者发送消息:

producer = KafkaProducer(bootstrap_servers=['broker1:9092', 'broker2:9092'])
topic = "chat_message"
message = {"user_id": 1001, "msg": "hello", "timestamp": 1670000000}
producer.send(topic, value=message)
producer.flush()

消费者拉取消息(幂等+持久化):

consumer = KafkaConsumer(
    "chat_message",
    bootstrap_servers=['broker1:9092', 'broker2:9092'],
    group_id="chat_group",
    auto_offset_reset='earliest',
    enable_auto_commit=False
)
for message in consumer:
    if not is_message_processed(message.value["msg_id"]):
        process_message(message.value)
        commit_message(message)  # 提交偏移量

5) 【面试口播版答案】
“设计一个高并发消息推送系统,核心是采用分布式消息中间件(如Kafka),通过消费者拉取模式实现毫秒级延迟。系统架构包括:生产者(客户端发送消息)、消息队列(Kafka集群,多副本保证高可用)、消费者(客户端拉取消息并处理)。消息持久化确保不丢失,幂等处理避免重复消费。高可用通过副本自动切换,扩展性通过增加Broker节点支持千万级用户。具体来说,生产者将消息写入Kafka主题,消费者以拉取方式从队列获取消息,批量处理减少延迟,消息ID+业务逻辑实现幂等,副本机制保证99.9%可用性。”

6) 【追问清单】

  • 问:如何保证消息不丢失?
    回答要点:消息持久化(Kafka日志持久化),多副本(至少3副本),消费端ACK机制。
  • 问:消息重复消费如何处理?
    回答要点:幂等处理(消息ID唯一,检查是否已处理),补偿机制(重试队列)。
  • 问:延迟如何进一步优化?
    回答要点:消费者批量拉取(减少网络开销),异步处理(消息队列缓冲),客户端缓存(预取消息)。
  • 问:高可用具体如何实现?
    回答要点:副本自动故障转移(Kafka Leader选举),多Broker节点,客户端订阅多个Broker。
  • 问:大规模用户下如何水平扩展?
    回答要点:水平扩展Broker节点(增加集群规模),客户端负载均衡(订阅多个Broker),消息分片(按用户ID分片)。

7) 【常见坑/雷区】

  • 坑1:忽略消费端处理延迟,只考虑推送延迟。
    雷区:消费端处理慢导致消息堆积,延迟升高。
  • 坑2:强一致性导致延迟高。
    雷区:强一致性(如两阶段提交)不适合高并发,会显著增加延迟。
  • 坑3:消息丢失处理不完善。
    雷区:仅靠消息持久化不够,需结合ACK机制和重试策略。
  • 坑4:幂等处理不正确。
    雷区:消息ID重复或业务逻辑未幂等,导致重复消费。
  • 坑5:高可用设计单点故障。
    雷区:仅有一个Broker节点,故障时服务中断,需多副本和故障转移。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1