面试知识库

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

追问路径#

涉及知识点#

核心串联逻辑#

  1. MQ三大价值:解耦让服务独立演进,异步将RT从串行之和变为最长单次,削峰让系统按自身能力消费
  2. 不丢消息:生产端acks=all → Broker同步刷盘/ISR副本 → 消费端手动提交offset
  3. 不重复消费:at-least-once + 幂等消费 ≈ exactly-once语义
  4. 顺序性:Kafka顺序性粒度是partition,全局有序只能单partition(牺牲吞吐)
  5. 积压应急:关键是快速扩大消费能力——扩partition+消费者是正解,跳过消息是下策
  6. Kafka高吞吐:顺序写磁盘(接近内存速度)+零拷贝sendfile+PageCache+批量压缩+分区并行,瓶颈在网络与磁盘带宽而非随机IO
  7. 代码示例
    // Kafka生产者保证不丢消息
    props.put(ProducerConfig.ACKS_CONFIG, "all");
    props.put(ProducerConfig.RETRIES_CONFIG, 3);
    props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true); // 幂等生产者
    java

面试回答串联#

30秒速答#

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

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有序。百万级积压应急方案是临时扩partition数和消费者实例,或者写入临时topic用大量消费者快速消化。RocketMQ事务消息通过半消息+本地事务+回查机制实现分布式事务最终一致性,比本地消息表方案更轻量不需要额外建表。“

相关追问链#