面试知识库

MQ 可靠性 → 顺序 → 积压 → 事务消息 追问链#

追问路径#

涉及知识点#

核心串联逻辑#

  1. MQ三大价值:解耦让服务独立演进,异步将RT从串行之和变为最长单次,削峰让系统按自身能力消费
  2. 不丢消息:生产端acks=all → Broker同步刷盘/ISR副本 → 消费端手动提交offset
  3. 不重复消费:at-least-once + 幂等消费 ≈ exactly-once语义
  4. 顺序性:Kafka顺序性粒度是partition,全局有序只能单partition(牺牲吞吐)
  5. 积压应急:关键是快速扩大消费能力——消费者少于分区数先补满;存量积压靠多分区临时Topic转发+大量消费者消化,扩partition只分流新消息,跳过消息是下策
  6. Kafka高吞吐:顺序写磁盘(省寻道,远快于随机IO)+零拷贝sendfile+PageCache+批量压缩+分区并行,瓶颈在网络与磁盘带宽而非随机IO
  7. 代码示例:
    // Kafka生产者保证不丢消息
    props.put(ProducerConfig.ACKS_CONFIG, "all");
    // retries 保持默认 Integer.MAX_VALUE,由 delivery.timeout.ms(默认120s)控制重试总时长
    props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true); // 幂等生产者
    java

面试回答串联#

30秒速答#

MQ用于解耦、异步、削峰。不丢消息靠三段保证:acks=all+Broker持久化+手动提交offset。消息重复用幂等消费解决,顺序性靠同key同partition+单线程消费。积压时用临时Topic转发到更多分区+扩消费者实例快速消化。

2分钟展开答#

消息队列的核心价值是解耦、异步和削峰。不丢消息要在三个环节保证:生产端设acks=all让ISR所有副本确认,Broker端设min.insync.replicas=2保证至少两个副本同步,消费端手动提交offset而不是自动提交。消息重复不可避免(at-least-once),通过幂等消费实现近似exactly-once——用全局唯一消息ID配合Redis SET NX或数据库唯一索引去重。顺序性保证把相同业务key(如订单ID)发到同一partition,消费端单线程消费。如果单线程太慢,可以在消费者内部按key hash到多个内存队列,每个队列单线程处理,保证同key有序。百万级积压应急要新建一个多分区的临时topic,把积压消息转发过去,再用大量消费者并行消化;单纯扩partition只能分流新消息,老分区里的存量不会消费得更快。RocketMQ事务消息通过半消息+本地事务+回查机制实现分布式事务最终一致性,比本地消息表方案更轻量不需要额外建表。

相关追问链#