ディレクトリ
0.目次
ステップ1.生産でのメッセージ
- プロデューサークライアントの設定パラメータは、インスタンスのプロデューサーを作成します
- 送信するメッセージの構築
- メッセージを送ります
- 閉じるプロデューサー
2. ProducerRecordプロパティ
public class ProducerRecord<K, V> {
private final String topic;//必填项
private final Integer partition;
private final Headers headers;
private final K key;
private final V value;//必填项
private final Long timestamp;
}
指定されたパーティションに送信されたパーティション番号を計算するために使用されるキーを決定します
3.必要なパラメータ
- bootstrap.servers:あなたが与えられたブローカーから他のブローカーを見つけることができますが、ブローカーのカフカクラスタのアドレスは、デフォルトでは空であることを指定しますが、エラーメッセージで結果が送信されるダウンノードを防ぐために、それは、少なくとも2人のブローカーの住所を記入することをお勧めします。
- key.serializer、value.serializer
- client.id:クライアントのクライアントID、当社の設定した場合は、自動的に非空の文字列を生成します。
- ヒントの設定:
属性名不正なレコードを、あなたが使用することができProducerConfigの定数クラスを。
4.メッセージを送ります
- 髪は、後に忘れる(火-と-foget)
最高のパフォーマンス、信頼性最悪
try {
producer.send(record);
} catch (Exception e) {
e.printStackTrace();
}
- 同期(シンク)
同期転送の性能の違いは、送信が完了した後、次のメッセージを送信するために行く待っているブロックを必要とされます。
この方法自体は、非同期送信、同期取得を使用してメソッドによって返されるFutureオブジェクトです。
try {
producer.send(record).get();
} catch (Exception e | InterruptedException e) {
e.printStackTrace();
}
Future.get()戻り値は、所望であれば、以下のように使用することができます。メッセージの主題に含まれる値を返し、パーティション番号、オフセット、タイムスタンプやその他のメタデータ情報。
try {
Future<RecordMetadata> future = producer.send(record);
RecordMetadata metadata = future.get();
System.out.println(metadata.topic() + "-" +
metadata.partition() + "-" + metadata.offset());
} catch (Exception e | InterruptedException e) {
e.printStackTrace();
}
send()メソッドはFutureオブジェクトを返すので、あなたは金持ち達成するためにJavaの並行処理に関連するメソッドを使用することができます。
同期送信は、クライアントの再試行パラメータの数を設定することができます再試行回数を超えた場合は、例外が処理する必要があります。
- 非同期(非同期)
フューチャー(ProducerRecord <K、V>のレコード、Callbackコールバック)を送ります。
producer.send(record, new Callback() {
@Override
public void onCompletion(RecordMetadata metadata, Exception exception) {
if (exception != null) {
exception.printStackTrace();
} else {
System.out.println(metadata.topic() + "-" +
metadata.partition() + "-" + metadata.offset());
}
}
})
整然とした状況を確実にカフカメッセージパーティションは、コールバック関数が秩序を確保することができます。
producer.close();
public void close(long timeout, TimeUnit timeUnit); //等待超时时间之后,强行退出。
すべてのメッセージの完了を待っているclose()メソッドのブロックが送信され、その後、閉じられます。
5.パーティ
- メッセージ重量指定パーティション、フィールドフィールドの対応するパーティションに従って
- パーティションフィールドは、メッセージ本文によれば、指定されていないキーパーティのパーティションによって割り当てられ、フィールド
kafa使用パーティすなわちクライアントクラスDefaultPartitioner
DefaultPartitioner implements Partitioner {
public int partition(...); //计算分区号
public void close(); //关闭分区器时释放相应资源,空方法
}
- デフォルトのパーティションがある:
(1)キーがnullでない場合、パーティション番号について得られたハッシュキー(、すべてのパーティションのいずれかの利用可能か否か)。
(2)キーをポーリングがそれぞれに送信され、ヌルである利用可能なパーティションのないパーティションは、各パーティションにポーリング利用できない場合、。 - パーティショナをカスタマイズする方法?
(1)インターフェースは、パーティション()メソッド上書き、パーティション分割を実施
(2)構成パラメータクライアント
props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, DemoPartitinoer.class.getName());
6.インターセプター
- 役割:
準備作業(例:フィルターメッセージは、内容の一部を変更)送信する前に
、いくつかのカスタマイズニーズを行い、コールバック・ロジックを送信する前に(例:統計情報) カスタムインターセプタは、
(1)onAcknowledgement()メソッド書き換え、ProducerInterceptor <文字列、文字列>インターフェイス、書き換えOnSend()メソッドを実装し
、(2)構成パラメータクライアント:ProducerConfig.INTECERPTOR_CLASSES_CONFIGは、
クラス名の途中で、複数を指定することができますその後、インターセプタの「」接続、複数の、いずれかに障害が発生し、インターセプタから次の成功の開始7.全体的なアーキテクチャ
メインスレッド:KafkaProducer - >インターセプタ(必須ではないが、一般的にない) - >デバイスシリアル番号(必須) - >パーティ(キーオプション) - >アキュムレータメッセージ- >送信者スレッドの
送信者スレッド: SENDER - >要求を作成- >セレクタを送信するために提出- >要求に応答して受信されていないノードに対応するノードに応じてはInFlightRequestsに配置されます。
次に、送信者スレッド、ノード情報に最初のパーティション情報ので、アプリケーションロジック変換層IOのネットワーク層、及びカフカ要求を満たすためにメッセージ・プロトコルに変換します。
構成パラメータの大きさが、InFlightRequestsでメッセージでInFlightRequests比較をmax.in.flight.requests.per.connectionどの程度によって、各ノードの負荷状態を決定します。
メタデータ、送信者スレッドによって更新されます(テーマのパーティション番号に関する情報は、リーダー、ポートなどは、ノードのコピーを扱う)最も負荷のノードが取得MetaDataRequest送信を選択します。デフォルトは5分ごとに更新されます。
メインスレッドはまた、送信者更新されたメタデータを使用する必要があります。
8.いくつかの重要なパラメータの生産者
- ACK - >何を正常に送信みなさ状況下では
デフォルト:限り、成功した成功に書かれているリーダーとして、1。それは、信頼性とスループットの間の妥協です。
0は、それに関係なく、サーバは、対応する返すかどうかの、送信され成功しています。最大スループット。
-1または全て正常にすべてのISRのコピー。ISRは、この場合には効果は同じ1だけリーダーである可能性があるため、最高の信頼性は、それは、信頼性が保証するものではありません。 - max.request.size
プロデューサーに送信できる最大メッセージ、デフォルトの1メガバイト
9.生産者は、スレッドセーフであります
終わり :)