カフカプロデューサー

KafkaProducerはSender.run方法を実行するためのKafkaThreadを作成します。

1.入口KafkaProducer#doSendではなく、メッセージをバッチに追加され、実際に送信されるメッセージ。

メッセージはプロデューサーのカフカバッチで送信され、RecordAccumulatorクラス変数はのConcurrentMap <TopicPartition、のDeque <ProducerBatch >>バッチを持って、
KafkaProducer#doSend現在の方法はProducerBatchにこのメッセージを入れてしまうでしょう。そして、送信者#ウェイクアップメソッドを呼び出して、ブロックされたIOスレッドをウェイクアップしてみてください。


2.、入り口Sender.runで、データ伝送から抽象二つの主要な論理的な手順をバッチを削除します。

NetworkClient.send 2.1
ここで送信をオブジェクトにシーケンスを送る、第一ProducerReuquestを送信するために、真のネットワークではなく、その後inFlightRequestsヘッドに加え、呼び出しセレクタを送信実際KafkaChannel.setSend(IS)

=送信を送るrequest.toSend(のnodeId、ヘッダ); 

この.inFlightRequests.add(inFlightRequest)。

selector.send(inFlightRequest.send)。

 

2.2 NetworkClient.poll
送信するために、実際のネットワークを

セレクタ位pollSelectionKeys、すなわちメッセージの書き込みイベントを送信し、応答がセレクタ#1 completedReceives用に格納され、処理ネットワークイベントを書き込む
のACKの= -1と1が、すなわち、生産要求応答が、必要とされる場合、メッセージを送信するプロデューサ
ないでNetworkClient#1 handleCompletedSendsに要求が応答を必要とするから除去inFlightRequests
応答NetworkClient#1 handleCompletedReceivesのプロセス
プロデューサが設定された値は、必要に応じてまたはプロデューサまたは応答が必要とされないで、固定されているACK。
新しい要求の先頭に、受信した応答、すなわち要求テール、最も古い要求に対応します。

 

3.主なクラス
KafkaProducer:直接ユーザーのクラスにさらさAPI;送信者:鍵管理ProducerBatch
NetworkClient:ネットワーク経由で送信ProducerBatchオブジェクト、シリアル化する必要がある、このような接続管理、近い層IO
セレクタは、セレクタNIOのJavaをカプセル化し
KafkaChannel

 

4.のByteBuffer

// のByteBuffer的使用
 // のByteBuffer初始是写模式
パブリック 静的 ボイドメイン(文字列[]引数)をスローにUnsupportedEncodingException {
     // 容量= 512、限界= 512、位置= 0 
    のByteBufferバッファー= ByteBuffer.allocate(512 )。
    buffer.put((バイト) 'H' )。
    buffer.put((バイト) 'E' ); 
    buffer.put((バイト) 'L' )。
    buffer.put((バイト) 'L' )。
    buffer.put((バイト) 'O' ); 

    // 限界=位置、位置= 0
    buffer.flip(); 

    // バイト数を取得する
    int型のlen = buffer.remaining();
     バイト [] = DST 新しい新しい バイト[lenの]; 
    BUFFER.GET(DST); 
    System.out.printlnは(新しい新しい文字列(DST) );
     // 結論:ByteBufferのちょうど[]パッケージは、バイト
} 

// のSocketChannel
 // 出力
 // )のSocketChannel#ライト(java.nio.ByteBufferのを、
 // 入力読み取る
 // のSocketChannel#リード(java.nio.ByteBufferのを)

 

おすすめ

転載: www.cnblogs.com/allenwas3/p/11615210.html