在 Kafka 中,消费组是一个集群的概念,一个消费组订阅多个 topic,所有 consumer 都受这个消费组 rebalance 的影响。Pulsar是否像 Kafka 一样,在用同一个订阅名订阅不同的 topic 时存在潜在的风险?

答:
没有类似 Kafka 的风险。Kafka 的 group 是不和任何 topic 绑定的,元数据记录的是 group 下面有多少个 topic。当一个 consumer 加入时,经过 JOIN_GROUP 和 SYNC_GROUP 操作,group leader(client)会完成 assignment,借由 broker(group coordinator)通知到 group followers(其它 client)。即使分配方案不变,其它 topic 也会进行 rebalance。

Pulsar 的 subscription 是隶属于 topic 的,在 broker 内部实现中,每个 topic 被抽象为 PersistentTopic(这里以默认的持久化 topic 为例),而 PersistentTopic 下面可以有多个 PersistentSubscription,对应每个 subscription(也就是 Kafka 的 group)。由于 Pulsar 是 push 消费模型,每个 PersistentSubscription 都会根据订阅类型(比如 Failover)创建对应的 Dispatcher。

Pulsar 没有 rebalance,新的 consumer 加入 subscription 后,也会连接到 owner broker(对应 Kafka 的 topic leader),只不过 broker 端的 dispatcher 可能不发消息给它罢了。Broker 感知到 namespace bundle ownership 发生变化时,如果有 topic/partition 不再属于当前 broker,会主动断开连接,然后 consumer 重连到新的 owner broker。

简单说:

  • 在 Pulsar 中,新 consumer 加入 subscription,影响的 dispatcher 是对应 topic 下面的 subscription 所拥有的,不会影响其它 topic 的 subscription 的 dispatcher。
  • 在 Kafka 中,新 consumer 加入 group,group 所拥有的 topic 都要进行 rebalance。