[Pulsar-源碼] Pulsar client初始化

Pulsar client初始化過程

初始化Pulsar Producer和Consumer都需要先初始化Pulsar client。示例:

PulsarClient client = PulsarClient.builder()
        .serviceUrl("pulsar://127.0.0.1:6650")
        .build();
  1. PulsarClient.builder()

    會創建一個ClientBuilderImpl一個實例, 並用一個 ClientConfigurationData實例來初始化conf對象;

  2. .serviceUrl("pulsar://127.0.0.1:6650")

    爲conf對象設置serviceUrl參數,並判斷是否使用了TLS

  3. .build()

    • 首先簡要serviceUrl參數和serviceUrlProvider,兩者只能存在一個

    • 使用conf初始化PulsarClientImpl

      • 初始化EventLoopGroup:(EpollEventLoopGroup或者NioEventLoopGroup),這個過程會new一個客戶端線程工廠

      • 初始化ConnectionPool:在這裏插入圖片描述初始化bootstrap(client) ,設置channel的一些參數,並且指定PulsarChannelInitializer, channel初始化時,會給channel設置handler,其中包括一個ClientCnx,主要用來處理broker的結果響應;最後會初始化一個DnsNameResolver

      • 初始化producer、consumer以及request的ID生成器

      • 初始化externalExecutorProvider,初始化LookupService, 這個過程中會初始化PulsarServiceNameResolver, 並且在 PulsarServiceNameResolver中解析、記錄url的相關信息;

      • 初始化producers和consumers兩個map,將狀態設置爲OPEN

至此,Pulsarclient初始化完畢。


Producer 初始化

向pulsar生產數據,需要首先初始化一個producer,

final Producer<byte[]> producer = client.newProducer()
                    .topic(topic)
                    .maxPendingMessages(5000)
                    .enableBatching(true)
                    .create();

過程比較簡單,

  • 初始化一個ProducerBuilderImpl

  • 設置 topic 參數

  • 設置最大緩存的Message數量

  • 設置是否支持批量發送

  • 創建Producer

    • 設置消息路由模式,包括SinglePartition, RoundRobinPartitionCustomPartition, 使用 ``CustomPartition`時,需要實現router
    • 異步創建producer,首先需要獲取topic的元數據信息,這是需要創建連接,調用關係如下圖所示:在這裏插入圖片描述 最終會調用bootstrap.connect()方法創建netty連接。netty連接創建完成之後,爲 netty channel 添加closeFuture的清理邏輯,然後創建ClientCnx對象,並設置remoteaddress等屬性信息。
    • 創建連接完成之後,會創建newPartitionMetadataRequest並且攜帶topic作爲參數,然後發送newPartitionMetadataRequest到服務端。服務端會返回對應的分區數量信息。
    • 獲取到topic的分區信息之後,根據分區數量創建PartitionedProducerImpl或者ProducerImpl

    至此,producer創建完畢。

發佈了14 篇原創文章 · 獲贊 0 · 訪問量 3235
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章