Apache kafka 主题、分区和键

Apache kafka 主题、分区和键,apache-kafka,kafka-consumer-api,kafka-producer-api,Apache Kafka,Kafka Consumer Api,Kafka Producer Api,我想澄清一下这个问题。 在卡夫卡文献中,我发现了以下内容: Kafka只提供分区内消息的总顺序,而不是主题中不同分区之间的顺序。对于大多数应用程序来说,每个分区的顺序加上按键对数据进行分区的能力就足够了。但是,如果您需要对消息进行总排序,则可以使用只有一个分区的主题来实现,尽管这意味着每个使用者组只有一个使用者进程 下面是我的问题: 这是否意味着如果我想让多个消费者(来自同一组)阅读一个主题,我需要多个分区 这是否意味着我需要与同一组的使用者数量相同的分区数量 一个分区可以读取多少用户 还有一些

我想澄清一下这个问题。 在卡夫卡文献中,我发现了以下内容:

Kafka只提供分区内消息的总顺序,而不是主题中不同分区之间的顺序。对于大多数应用程序来说,每个分区的顺序加上按键对数据进行分区的能力就足够了。但是,如果您需要对消息进行总排序,则可以使用只有一个分区的主题来实现,尽管这意味着每个使用者组只有一个使用者进程

下面是我的问题:

  • 这是否意味着如果我想让多个消费者(来自同一组)阅读一个主题,我需要多个分区

  • 这是否意味着我需要与同一组的使用者数量相同的分区数量

  • 一个分区可以读取多少用户

  • 还有一些关于API的键和分区之间关系的问题。我只看了.NETAPI(特别是来自MS的API),但看起来像是模拟JavaAPI。 我发现,当使用制作人向主题发送消息时,有一个关键参数。但当消费者从一个主题中读取时,有一个分区号

  • 分区是如何编号的?从0或1开始
  • 键和分区之间的关系到底是什么? 据我所知,键上的某些函数将决定分区。对吗
  • 如果我在一个主题中有两个分区,并且希望一些特定的消息转到一个分区,而其他消息转到另一个分区,那么我应该为一个特定分区使用一个特定的键,其余的用于另一个分区
  • 如果我有3个分区,一种类型的消息发送到一个特定分区,其余的消息发送到另2个分区,会怎么样
  • 一般来说,我如何将消息发送到特定分区,以便让消费者知道从何处读取? 还是我最好多谈几个话题
  • 提前谢谢。

    伊戈尔

    分区增加了卡夫卡主题的并行性。任何数量的使用者/生产者都可以使用同一分区。由应用层定义协议。卡夫卡保证交货。关于API,您可能希望查看Java文档,因为它们可能更完整。根据我的经验:

  • 分区从0开始
  • 密钥可用于将消息发送到同一分区。例如,哈希(键)%num\u分区。该逻辑可插入到生产者
  • 对。但是要小心,不要以某个键结束,这将导致“专用”分区。为此,您可能需要有专门的主题。例如,控件主题和数据主题
  • 这似乎和第三个问题是同一个问题
  • 我认为消费者不应该基于分区对数据进行假设。典型的方法是让消费者组可以从一个主题的多个分区中读取内容。如果您想拥有专用频道,最好(更安全/可维护)使用单独的主题
  • 这是否意味着如果我想拥有多个消费者(来自同一个客户) 组)从一个主题阅读我需要有多个分区

    让我们看看卡夫卡的以下特性:

    • 每个分区仅由组中的一个使用者使用
    • 组中的一个使用者可以使用多个分区

    • 组中的使用者进程数必须是发送到哪个分区的消息最好的规则。感谢您解释密钥和分区号之间的区别。这让我在试用卡夫卡控制台制作工具时感到很不舒服。消息并没有出现在我以为已经指定了键值的分区中。两个键可以有相同的分区吗?如何使用不同的键将消息存储在同一分区中?当键和分区都存在分区记录时,会发生什么情况?它将根据分区号或按键保存记录?
      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;
      
      }