【问题标题】:How does kafka decides the partition if I don't mention any如果我不提,kafka如何决定分区
【发布时间】:2019-01-01 17:20:00
【问题描述】:

这就是我生成消息的方式:

String json = gson.toJson(msg);

ProducerRecord<String, String> record = new ProducerRecord<>(kafkaProducerConfig.getTopic(), json);
long startTime = System.currentTimeMillis();

try {
    RecordMetadata meta = producer.send(record).get(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
    e.printStackTrace();
} catch (ExecutionException e) {
    e.printStackTrace();
} catch (TimeoutException e) {
    e.printStackTrace();
}

我有15这个主题的分区,我在制作时没有提到分区键,默认分配的分区是什么?

【问题讨论】:

    标签: java apache-kafka kafka-producer-api


    【解决方案1】:

    由于您没有将密钥作为记录的一部分发送,因此它为空。

    Kafka 有一个 DefaultPartitioner,它将在每个分区上循环任何空键。

    对于非空键,计算 Murmur2 哈希,然后以主题的分区数取模

    【讨论】:

      【解决方案2】:

      如果您没有定义任何自定义分区,它将按照以下规则使用默认分区器

      1. 如果记录中指定了分区,则使用该分区来 发布。
      2. 如果未指定分区但存在键,则选择一个分区 基于密钥的哈希
      3. 如果不存在分区或键,请选择一个分区 循环时装

      在默认情况下,分区实现以更好地理解

      public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
              List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
              int numPartitions = partitions.size();
              if (keyBytes == null) {
                  int nextValue = nextValue(topic);
                  List<PartitionInfo> availablePartitions = cluster.availablePartitionsForTopic(topic);
                  if (availablePartitions.size() > 0) {
                      int part = Utils.toPositive(nextValue) % availablePartitions.size();
                      return availablePartitions.get(part).partition();
                  } else {
                      // no partitions are available, give a non-available partition
                      return Utils.toPositive(nextValue) % numPartitions;
                  }
              } else {
                  // hash the keyBytes to choose a partition
                  return Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2016-08-03
        • 2018-10-08
        • 1970-01-01
        • 2021-10-27
        • 1970-01-01
        • 2017-05-22
        • 2016-11-15
        • 2021-11-30
        • 2021-08-07
        相关资源
        最近更新 更多