主题,分区和密钥

时间:2016-05-29 15:52:30

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

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

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

所以这是我的问题:

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

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

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

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

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

2 个答案:

答案 0 :(得分:16)

  

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

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

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

通过这些属性,kafka能够在一组消费者流程中提供ordering guaranteesload balancing

要回答您的问题,是的,在同一组的上下文中,如果您想拥有N consumers,则必须拥有at least N topics

  

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

我认为这已在第一个答案中解释过了。

  

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

可以从一个分区读取的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;

}

在这里,我们必须从班级中了解的字段是partition

来自文档,

  • 如果指定了有效的partition number,则在发送记录时将使用partition
  • 如果未指定分区但存在key,则将使用hash of the key选择分区。
  • 如果keypartition都不存在,则会在round-robin fashion中分配分区。

答案 1 :(得分:12)

伊戈尔,

分区增加了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. 我认为消费者不应该基于分区来假设数据。典型的方法是让消费者组能够从主题的多个分区中读取。如果您想拥有专用渠道,使用单独的主题会更好(更安全/可维护)。