消息模型篇:Topic、Queue、Partition 与 Consumer Group
理解消息队列,关键是理解 Topic、Queue、Partition、Consumer Group 和 Offset 如何共同决定投递、并发和顺序。
消息模型篇:Topic、Queue、Partition 与 Consumer Group
不同消息队列产品术语不完全一样,但核心问题相似:消息发到哪里,谁来消费,如何扩展消费能力,如何记录消费进度。
Kafka 里常见 Topic、Partition、Consumer Group、Offset。RabbitMQ 里常见 Exchange、Queue、Binding、Consumer Ack。RocketMQ 里常见 Topic、MessageQueue、Consumer Group。
Topic 和 Queue
Topic 更像逻辑分类。比如 order-events、payment-events、user-behavior-events。
Queue 更像具体待消费队列。RabbitMQ 中消息通常先进入 Exchange,再根据 Binding 路由到 Queue。
Partition 为什么重要
Partition 是 Kafka 高吞吐和水平扩展的基础。一个 Topic 可以拆成多个 Partition,每个 Partition 内部是有序日志。
同一个 key 的消息通常会进入同一个 Partition,因此可以保证同一业务对象在分区内有序。
{
"topic": "order-events",
"key": "order_10001",
"value": {
"event_type": "OrderPaid"
}
}
如果 key 是 order_id,同一个订单的创建、支付、取消事件更可能落在同一分区,从而维持订单维度的顺序。
Consumer Group
Consumer Group 用来扩展消费能力。同一个 Group 内,多个消费者共同消费一个 Topic,每个分区通常只分配给组内一个消费者。
不同 Group 之间互不影响。一个 Topic 可以同时被报表服务、搜索服务、推荐服务消费,每个服务使用自己的 Consumer Group。
Offset 和 Ack
Kafka 使用 Offset 记录消费位置。消费者处理完消息后提交 Offset,下次从新位置继续消费。
RabbitMQ 更强调 Ack。消费者处理完成后向 Broker 确认,Broker 再删除或标记消息已处理。
这两种机制都在回答同一个问题:这条消息是否已经被可靠处理。
术语对照
| 概念 | Kafka | RabbitMQ | RocketMQ |
|---|---|---|---|
| 消息分类 | Topic | Exchange + Queue | Topic |
| 并行单位 | Partition | Queue | MessageQueue |
| 消费组 | Consumer Group | Consumer 组合 | Consumer Group |
| 进度 | Offset | Ack | Offset / Ack |
| 顺序 | Partition 内有序 | Queue 内受消费模式影响 | Queue 内有序 |
小结
消息模型决定了系统的扩展性和可靠性。
如果要高吞吐和日志流,重点理解 Topic、Partition、Offset。如果要灵活路由,重点理解 Exchange、Queue、Binding。如果要业务消息、事务消息和延迟消息,RocketMQ 的模型会更贴近业务场景。