Pulsar client初始化過程
初始化Pulsar Producer和Consumer都需要先初始化Pulsar client。示例:
PulsarClient client = PulsarClient.builder()
.serviceUrl("pulsar://127.0.0.1:6650")
.build();
-
PulsarClient.builder()
會創建一個ClientBuilderImpl一個實例, 並用一個
ClientConfigurationData
實例來初始化conf對象; -
.serviceUrl("pulsar://127.0.0.1:6650")
爲conf對象設置serviceUrl參數,並判斷是否使用了TLS
-
.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
,RoundRobinPartition
和CustomPartition
, 使用 ``CustomPartition`時,需要實現router - 異步創建producer,首先需要獲取topic的元數據信息,這是需要創建連接,調用關係如下圖所示: 最終會調用
bootstrap.connect()
方法創建netty連接。netty連接創建完成之後,爲 netty channel 添加closeFuture的清理邏輯,然後創建ClientCnx對象,並設置remoteaddress等屬性信息。 - 創建連接完成之後,會創建
newPartitionMetadataRequest
並且攜帶topic作爲參數,然後發送newPartitionMetadataRequest
到服務端。服務端會返回對應的分區數量信息。 - 獲取到topic的分區信息之後,根據分區數量創建
PartitionedProducerImpl
或者ProducerImpl
。
至此,producer創建完畢。
- 設置消息路由模式,包括