プロデューサーパーティションの書き込みルール
概要概要
プロデューサーがトピックにメッセージを書き込むと、Kafkaは異なるルールに従って異なるパーティションにデータを割り当てます。パーティションデータが指定されている場合は、指定されたパーティションに書き込まれます。パーティションが指定されていない場合、指定されたパーティションは次のルールに従って実行されます。
分類
ハッシュパーティション(指定されたキーはデフォルトで有効になっています)
長所:同じキーが同じパーティションに入ります。
短所:同じキーのハッシュの残りが同じであるため、データの偏りが発生します。
ポーリングパーティション(キーが指定されていない場合に開く)
- 最もよく使用される戦略でもあるデフォルトの戦略では、すべてのメッセージが1つのパーティションに均等に分散されるようにすることができます。
- メッセージの生成時にキーがnullの場合、ポーリングアルゴリズムを使用してパーティションを均等に分散します
長所:データ分散がより均一になります。
短所:同じキーを持つデータが異なるパーティションに移動します
。2.xの前:パーティションのポーリング、2.xの後:スティッキーパーティション
ランダムパーティション(未使用)
ランダム戦略。毎回各パーティションにメッセージをランダムに割り当てます。以前のバージョンでは、デフォルトのパーティション戦略はランダム戦略でした。これは、各パーティションにメッセージを均等に書き込むことでもありました。ただし、後続のポーリング戦略のパフォーマンスは向上するため、ランダム戦略が使用されることはめったにありません。
カスタムパーティション
実装コード:
1。カスタムパーティショナーを作成します
import org.apache.kafka.clients.producer.Partitioner;
import org.apache.kafka.common.Cluster;
import java.util.Map;
import java.util.Random;
/**
* @ClassName UserPartition
* @Description TODO 自定义分区器,实现随机分区
* @Date 2021/3/31 9:21
* @Create By Frank
*/
public class UserPartition implements Partitioner {
/**
* 返回这条数据对应的分区编号
* @param topic:Topic的名
* @param key:key的值
* @param keyBytes:key的字节
* @param value:value的值
* @param valueBytes:value的字节
* @param cluster:集群对象
* @return
*/
@Override
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
//获取Topic的分区数
Integer count = cluster.partitionCountForTopic(topic);
//构建一个随机对象
Random random = new Random();
//随机得到一个分区编号
int part = random.nextInt(count);
return part;
}
@Override
public void close() {
//释放资源
}
@Override
public void configure(Map<String, ?> configs) {
//获取配置
}
}
2. Kafkaプロデューサー構成で、カスタムパーティショナーのクラス名をカスタマイズします
props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, 类所在包路径.UserPartition.class);
コピーメカニズム
概要概要
コピーはデータをバックアップするためのものです。Kafkaクラスター内のブローカーのデータ(パーティション)が失われたりダウンしたりした場合、他のブローカーのコピーが利用可能になります。
プロデューサーのACKSパラメーター
ACKSパラメーターは、メッセージのコピーを書き込むためのプロデューサーの要件の厳密さを示します。ACKSパラメーターが異なれば、パフォーマンスとセキュリティも異なります。
パラメータ分類
acksの構成は0です
。acks= 0:Kafkaクラスターがメッセージを受信したかどうかに関係なく、プロデューサーは次のメッセージを直接送信します。長所
と短所:
メリット:優れたパフォーマンスは高速です
デメリット:データ損失が発生しやすく、確率が比較的高い
acksの構成は1です
。acks= 1:プロデューサーはデータをKafkaに送信し、Kafkaはこのパーティションのリーダーコピーの書き込みが成功するのを待ち、ackの確認を返し、プロデューサーは次のパーティションを送信します。
長所と短所:
長所:パフォーマンスとセキュリティのバランスが取れている
短所:データが失われる可能性はありますが、その可能性は比較的小さいです
ACKはように構成され-1又は全てされ
たACK =全/ -1:プロデューサはカフカにデータを送信し、カフカが書き込まれるように、このパーティションのすべてのコピーを待ち、ACK確認を返し、プロデューサは、次のいずれかを送信する
利点と短所:
長所:データセキュリティ
短所:遅い
補足:Kafkaがackを返さない場合はどうなりますか?
- プロデューサーは、KafkaクラスターがACKSを返すのを待ち、待機時間があります。Kafkaが指定された時間内にACKSを返さない場合は、データが失われていることを意味します。
- プロデューサーには、このデータをKafkaに再送信するための再試行メカニズムがあります
既存の問題:Kafkaクラスターデータが正常に書き込まれるたびにackが返されます。返されるプロセス中にKafkaがダウンすると、データの重複が発生します。解決方法は?