消息队列核心概念详解

返回

1)角色与基本对象

  • Producer(生产者):发送消息的一方。
  • Consumer(消费者):处理消息的一方。
  • Broker(消息中间件/服务器):存消息、转发消息的“队列服务器”。
  • Message(消息):传输的数据本体。

2)队列与主题

  • Queue(队列,点对点):消息进入队列后,同一条消息只会被一个消费者处理(同一消费者组内竞争消费)。
  • Topic(主题,发布订阅):消息发到主题后,可以被多个订阅者各自消费一份(广播/多方处理)。

很多系统同时支持 Queue/Topic,只是叫法或实现略不同。

3)消费组织方式

  • Consumer Group(消费者组):一组消费者实例共同消费同一类消息。

    • 组内:负载均衡(一个消息只给组内一个实例)
    • 组间:互不影响(不同组都能各消费一份)
  • Subscription(订阅):消费者对某个 Topic 订阅了才会收到。

4)消息确认与投递语义

  • ACK:确认,消费者处理成功后告诉 Broker:“这条我处理完了”。

  • NACK/Reject(拒绝/失败):处理失败,告诉 Broker:“这条不行”。后续可能重试或进入死信。

  • Delivery Semantics(投递语义)

    • At most once:最多一次(可能丢、不重复)
    • At least once:至少一次(不太丢、可能重复)最常见
    • Exactly once:恰好一次(最难、条件多)

5)幂等与去重(非常关键)

  • Idempotency(幂等):同一条消息即使被消费多次,结果也一样。 常见做法:用业务唯一ID(订单号/消息ID)做去重表、状态机、唯一索引。

因为“至少一次”很常见,所以幂等几乎是必做的

6)重试、死信、延迟

  • Retry(重试):消费失败后再投递(可能立刻重试或延迟重试)。

  • DLQ / Dead Letter Queue(死信队列):多次失败/过期/被拒绝的消息进入这里,方便排查与补偿。

  • Delay / TTL(延迟/过期时间)

    • TTL:消息多长时间没被处理就过期
    • Delay:到时间才投递(比如“15分钟未支付取消订单”)

7)顺序与并发

  • Ordering(顺序消息):要求同一业务维度(如同一订单号)的消息按顺序处理。 常见策略:按 key 分区/同一队列/同一分片保证顺序。
  • Concurrency(并发消费):多个消费者实例并行提高吞吐,但会让顺序更难保证。

8)消费位点/偏移量(Kafka 类特别重要)

  • Offset(偏移量/位点):消费者消费到哪一条了(像“读到第几行日志”)。
  • Commit(提交位点):确认“我已经处理到这里”,用于故障恢复/重启续读。
  • Replay(回放):把位点回退,重新消费历史消息(做补数、重放)。

9)积压与限流

  • Backlog / Lag(堆积/延迟):队列里消息越来越多,消费跟不上。
  • Flow Control(流控):限制生产/消费速率,避免打爆系统。