記事ディレクトリ
プロダクション エクスペリエンス - プロデューサーによるスループットの向上
コアパラメータ
コード
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;