消息模型篇: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-eventspayment-eventsuser-behavior-events

Queue 更像具体待消费队列。RabbitMQ 中消息通常先进入 Exchange,再根据 Binding 路由到 Queue。

Rendering diagram...

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 再删除或标记消息已处理。

这两种机制都在回答同一个问题:这条消息是否已经被可靠处理。

术语对照

概念KafkaRabbitMQRocketMQ
消息分类TopicExchange + QueueTopic
并行单位PartitionQueueMessageQueue
消费组Consumer GroupConsumer 组合Consumer Group
进度OffsetAckOffset / Ack
顺序Partition 内有序Queue 内受消费模式影响Queue 内有序

小结

消息模型决定了系统的扩展性和可靠性。

如果要高吞吐和日志流,重点理解 Topic、Partition、Offset。如果要灵活路由,重点理解 Exchange、Queue、Binding。如果要业务消息、事务消息和延迟消息,RocketMQ 的模型会更贴近业务场景。

参考链接