主题,分区和密钥

Igo*_* K. 20 apache-kafka kafka-consumer-api kafka-producer-api

我正在寻找关于这个问题的一些澄清.在Kafka文档中,我发现了以下内容:

Kafka仅对分区内的消息提供总订单,而不是在主题中的不同分区之间.对于大多数应用程序而言,按分区排序与按键分区数据的能力相结合就足够了.但是,如果您需要对邮件进行总订单,则可以使用仅包含一个分区的主题来实现,但这意味着每个使用者组只有一个使用者进程.

所以这是我的问题:

  1. 这是否意味着如果我想拥有超过1个消费者(来自同一组)从一个主题中读取我需要超过1个分区?

  2. 这是否意味着我需要相同数量的分区作为同一组的消费者数量?

  3. 有多少消费者可以从一个分区读取?

关于API的关键和分区之间的关系也有一些问题.我只看了.net API(特别是来自MS的API),但看起来像模仿Java API.我看到当使用生产者向主题发送消息时,有一个关键参数.但是,当消费者从主题中读取时,存在分区号.

  1. 分区是如何编号的?从0或1开始?
  2. 密钥和分区之间究竟有什么关系?据我所知,键上的某些功能将决定一个分区.那是对的吗?
  3. 如果我在一个主题中有2个分区,并希望某些特定消息转到一个分区而其他消息转到另一个分区,那么我应该为一个特定分区使用特定密钥,其余部分用于另一个分区?
  4. 如果我有3个分区和一种类型的消息到一个特定的分区,其余的到另外2个怎么办?
  5. 一般来说,我如何向特定分区发送消息,以便了解消费者从何处阅读?或者我最好有多个主题?

提前致谢.

obl*_*ion 22

这是否意味着如果我想拥有超过1个消费者(来自同一组)从一个主题中读取我需要超过1个分区?

让我们看看kafka的以下属性:

  • 每个分区仅由组中的一个消费者使用
  • 组中的一个使用者可以使用多个分区
  • 组中的使用者进程数必须是<分区数

有了这些特性,卡夫卡是巧妙地能够同时提供ordering guaranteesload balancing对消费者进程池.

要回答你的问题,是的,在同一群体的背景下,如果你想拥有N consumers,你必须拥有at least N partitions.

这是否意味着我需要相同数量的分区作为同一组的消费者数量?

我认为这在第一个答案中有所解释.

有多少消费者可以从一个分区读取?

number of consumers可以从一个分区读取总是等于number of consumer groups订阅该主题.

关于API的密钥和分区之间的关系

首先,我们必须明白,producer负责选择分配给主题中哪个分区的记录.

现在,让我们看看制作人是如何做到的.首先,让我们看一下类的定义ProducerRecord.java:

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;

}
Run Code Online (Sandbox Code Playgroud)

在这里,我们必须从班级中了解的领域是partition.

从文档中,

  • 如果partition number指定了有效,partition则在发送记录时将使用该有效.
  • 如果未指定分区但key存在a,则将使用a选择分区hash of the key.
  • 如果既不存在key也不partition存在,则将在a中分配分区round-robin fashion.

  • 分区消息发送到的规则很好。 (2认同)
  • 感谢您解释密钥和分区号之间的区别。这让我在尝试 kafka-console- Producer 工具时感到困惑。消息并未最终出现在我认为已在结果为键值中指定的分区中。 (2认同)

小智 15

伊戈尔,

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

  1. 分区从0开始
  2. 密钥可用于将消息发送到同一分区.例如hash(key)%num_partition.逻辑可以插入Producer.https://kafka.apache.org/090/javadoc/index.html?org/apache/kafka/clients/producer/Partitioner.html
  3. 是.但要注意不要使用一些会导致"专用"分区的密钥.为此,您可能希望有专门的主题.例如,控制主题和数据主题
  4. 这似乎是与3相同的问题.
  5. 我认为消费者不应该基于分区来假设数据.典型的方法是让消费者组能够从主题的多个分区中读取.如果您想拥有专用渠道,则使用单独的主题会更好(更安全/可维护).