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のを)