如果 broker 宕机,消息如何通知到下一个 broker?

Broker 本身无状态。

  • Broker 在宕机时,不会主动通知其他 broker,分布在这个 broker上的所有 bundle(bundle 是 topic 集合,是 Pulsar topic 进行负载均衡的最小单位)都会执行 unload 操作,unload操作的流程:
    a. 关闭 unload 中所有 topic 的生产者、消费者和复制机;
    b. 关闭 Managedledger。当所有 bundle 都 unload 完成后,这个 broker 就可以正常退出。
  • 如果是 broker 异常退出,这个 broker 上的所有 bundle 也会被强行去掉对应归属,即这个 bundle 不在归属于这个 broker。
    当生产者或消费者客户端需要继续向某个 topic 发送/接收消息时,会首先执行 lookup 请求,会按照 loadbalance 策略找到目标broker 节点(当前是 load 最低的节点),将对应 bundle onLoad 到目标 broker。待 onLoad 完成后,这个 broker 就可以继续为该 topic 提供读写服务了。

另外,broker 在 ZooKeeper 上的一些临时节点信息,会主动删除;或因为超时而断开、其他 broker 监听后,会进行相应的操作。