这篇文章会对 producer 进行分析.

入口

这里通过org.apache.pulsar.client.tutorial.SampleProducer#main进行分析.

producer client impl

主要有 ProducerImpl 和 PartitionedProducerImpl 两种,

  • ProducerImpl
    • 实例化后, 会创建连接, 触发CONNECT、PRODUCER command
    • 简单的直接发送消息
  • PartitionedProducerImpl
    • 实例化的时候, 遍历partition实例化producer, 并监听partition变化.
    • 发送消息时, 通过partition router选择指定的producer进行发送

初始化

先弄清几个概念, broker有两种角色, 如下

  1. 充当Lookup服务的broker
  2. topic owner broker
  • 在充当Lookup服务的broker, 可以通过提供 域名 + http服务 实现元数据的管理, 也可以通过 broker的二进制协议实现, 无论是 http协议服务, 还是二进制协议服务, 都只是服务的交互方式, 真正的元数据是存在zk中的

  • topic owner broker 只做一件事情, 就是负责处理topic生产的消息, 进行消息的存储和分发.

所以, producer创建的时候, 先连接到Lookup服务, 通过Lookup服务查询到topic的owner broker, 然后连接到 topic owner broker进行消息的发送.

faq

  1. topic partition发生变更了怎么办? producer无法感知, 需要重启.

总结

不足