Kafka - 3.x プロデューサー プロデューサーのベスト プラクティス


ここに画像の説明を挿入します


プロダクション エクスペリエンス - プロデューサーによるスループットの向上

コアパラメータ

ここに画像の説明を挿入します

コード

package com.artisan.pc;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;

/**
 * @author 小工匠
 * @version 1.0
 * @mark: show me the code , change the world
 */
public class CustomProducerParameters {
    
    

    public static void main(String[] args) throws InterruptedException {
    
    

        // 1. 创建kafka生产者的配置对象
        Properties properties = new Properties();

        // 2. 给kafka配置对象添加配置信息:bootstrap.servers
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.126.171:9092");

        // key,value序列化(必须):key.serializer,value.serializer
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

        // batch.size:批次大小,默认16K
        properties.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);

        // linger.ms:等待时间,默认0
        properties.put(ProducerConfig.LINGER_MS_CONFIG, 1);

        // RecordAccumulator:缓冲区大小,默认32M:buffer.memory
        properties.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);

        // compression.type:压缩,默认none,可配置值gzip、snappy、lz4和zstd
        properties.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "snappy");

        // 3. 创建kafka生产者对象
        KafkaProducer<String, String> kafkaProducer = new KafkaProducer<String, String>(properties);

        // 4. 调用send方法,发送消息
        for (int i = 0; i < 10; i++) {
    
    
            kafkaProducer.send(new ProducerRecord<>("artisan", "art-msg-" + i));
        }

        // 5. 关闭资源
        kafkaProducer.close();
    }
}
    

ここに画像の説明を挿入します


制作実績_データの信頼性

メッセージ送信処理

次のようにメッセージ送信プロセスを確認します。

ここに画像を挿入

ACK応答メカニズム

ここに画像の説明を挿入します

背景 Kafka が提供するソリューション
Leader がデータを受信し、すべての Follower がデータの同期を開始しますが、1 つの Follower が障害により同期できず、Leader は同期が完了するまで待機してから ACK を送信します。 - リーダーは、動的な同期レプリカ セット (ISR) と、リーダーと同期されるフォロワー セットを維持します。
- ISR 内のフォロワーがデータ同期を完了すると、リーダーはプロデューサーに ACK を送信します。
- フォロワーがリーダーとデータを長期間 (replica.lag.time.max.ms) 同期しない場合、フォロワーは ISR から削除されます。
- リーダーが失敗した場合、ISR から新しいリーダーが選出されます。

ACK応答レベル

ここに画像の説明を挿入します

重要度の低い一部のデータについては、データの信頼性要件はそれほど高くなく、少量のデータ損失は許容できるため、ISR 内のすべてのフォロワーが正常に受信するまで待つ必要はありません。
したがって、Kafka ではユーザーに 3 つの信頼性レベルが提供されており、ユーザーは信頼性と遅延の要件に応じて次の構成を選択できます。

ありがとう 説明する
0 待ち時間を最小限に抑えるため、リーダー レプリカはメッセージを受信した後、まだディスクに書き込まれていない ack を返します。特にリーダーに障害が発生した場合、データ損失が発生する可能性があります。
1 リーダー レプリカはメッセージをディスクに書き込んだ後に ack を返しますが、フォロワー レプリカがデータを同期する前にリーダーに障害が発生すると、データが失われる可能性があります。
-1 または、(すべて) リーダーとすべてのフォロワー レプリカが、ack を返す前にメッセージをディスクに書き込みます。フォロワー コピーの同期完了後、ack を送信する前にリーダー コピーが失敗すると、データの重複が発生する可能性があります。

応答メカニズムの概要

ここに画像の説明を挿入します


コード

package com.artisan.pc;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;

/**
 * @author 小工匠
 * @version 1.0
 * @mark: show me the code , change the world
 */
public class CustomProducerAck {
    
    

    public static void main(String[] args) throws InterruptedException {
    
    

        // 1. 创建kafka生产者的配置对象
        Properties properties = new Properties();

        // 2. 给kafka配置对象添加配置信息:bootstrap.servers
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.126.171:9092");

        // key,value序列化(必须):key.serializer,value.serializer
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

        // 设置acks
        properties.put(ProducerConfig.ACKS_CONFIG, "all");

        // 重试次数retries,默认是int最大值,2147483647
        properties.put(ProducerConfig.RETRIES_CONFIG, 3);

        // 3. 创建kafka生产者对象
        KafkaProducer<String, String> kafkaProducer = new KafkaProducer<String, String>(properties);

        // 4. 调用send方法,发送消息
        for (int i = 0; i < 10; i++) {
    
    
            kafkaProducer.send(new ProducerRecord<>("artisan", "art-msg-ack" + i));
        }

        // 5. 关闭资源
        kafkaProducer.close();
    }
}
    

ここに画像の説明を挿入します

本番環境_データ重複排除

データ転送セマンティクス

ここに画像の説明を挿入します


冪等性

冪等性原理

ここに画像の説明を挿入します

冪等構成を有効にする (デフォルトで有効)

prudocer の設定オブジェクトに、parameters を追加しますenable.idempotence。パラメータ値のデフォルトは true です。false に設定すると閉じられます。


プロデューサートランザクション

カフカのトランザクション原理

ここに画像の説明を挿入します

トランザクションコードの流れ

// 1初始化事务
void initTransactions();
// 2开启事务
void beginTransaction() throws ProducerFencedException;
// 3在事务内提交已经消费的偏移量(主要用于消费者)
void sendOffsetsToTransaction(Map<TopicPartition, OffsetAndMetadata> offsets,
                              String consumerGroupId) throws ProducerFencedException;
// 4提交事务
void commitTransaction() throws ProducerFencedException;
// 5放弃事务(类似于回滚事务的操作)
void abortTransaction() throws ProducerFencedException;

生産経験_データが整然としている

ここに画像の説明を挿入します


制作経験_データ障害

ここに画像の説明を挿入します


おすすめ

転載: blog.csdn.net/yangshangwei/article/details/134069418