[01]カフカプロデューサー

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.生産者は、スレッドセーフであります

終わり :)

おすすめ

転載: www.cnblogs.com/suyeSean/p/11241900.html