消息队列核心概念详解
返回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(流控):限制生产/消费速率,避免打爆系统。