CodeWalk

Pulsar消费模型(Shared/Exclusive/Failover/Key_Shared)对比与选型

作者:苦行僧 · 2026-05-30 12:55

Pulsar支持四种订阅模式(Subscription Type):Exclusive、Failover、Shared、Key_Shared。请解释每种模式的消息分发策略、消费者与分区的映射关系、消息顺序保证、以及适用场景。对比Kafka的Consumer Group消费模型与Pulsar Shared模式的区别,说明Pulsar在灵活消费方面的优势。

回答

苦行僧

Pulsar四种订阅模式对比:

1. Exclusive(独占模式)

  • 策略:一个Topic只允许一个Consumer消费
  • 顺序:严格顺序
  • 消费者扩展:不支持(只能1个)
  • 适用:需要严格全局顺序的场景(如审计日志)

2. Failover(灾备模式)

  • 策略:多个Consumer,一个Active,其他为Standby
  • 顺序:Active消费时有序,Active宕机后Standby接管
  • 消费者扩展:1个Active + N-1个Standby
  • 适用:高可用的顺序消费场景

3. Shared(共享模式)

  • 策略:消息随机分发给任意Consumer,类似Kafka Consumer Group
  • 顺序:不保证顺序
  • 消费者扩展:支持(可动态增减)
  • 适用:高吞吐、非顺序敏感的日志/通知

4. Key_Shared(Key共享模式)

  • 策略:相同Key的消息发往同一个Consumer(hash路由)
  • 顺序:相同Key内有序
  • 消费者扩展:支持
  • 适用:分区顺序场景(订单/用户维度)

5. 与Kafka Consumer Group对比: | 维度 | Pulsar Shared | Kafka Consumer Group | |------|--------------|---------------------| | 消息分配 | Broker自动随机分发 | 消费者主动拉取特定Partition | | Rebalance | 无Rebalance(新Consumer立即消费)| 需要Rebalance(Stop The World)| | 消费速率 | 慢消费者不影响其他消息 | 慢Partition影响整体进度 | | 消息顺序 | 不保证 | 分区内有序 | | Pulsar Key_Shared | 保证相同Key顺序 | 需手动将相同Key路由同Partition |

6. 选型建议: | 需求 | 推荐模式 | |------|---------| | 全局严格顺序 | Exclusive | | 高可靠顺序消费 | Failover | | 高吞吐、不要求顺序 | Shared | | 分区顺序、高吞吐 | Key_Shared(Pulsar优势)|

7. 使用示例

// Key_Shared订阅
Consumer<byte[]> consumer = client.newConsumer()
    .topic("orders-topic")
    .subscriptionName("my-sub")
    .subscriptionType(SubscriptionType.Key_Shared)
    .subscribe();