Kafka主题参与程序的数量以及数据中不同键的数量

时间:2020-02-18 17:11:47

标签: apache-kafka partition kafka-topic

我想对Kafka使用键/值模式写入,以便在读取数据时保持相同的数据写入顺序。 我的问题是主题中的分区数应等于传入数据中的不同键数。 我已经知道,具有相同键的键/值模式数据将进入相同的分区。

因此,如果分区数不等于数据中不同键的数目,那么我们可以在同一分区中使数据具有不同键吗?在这种情况下,如何保持数据顺序?

2 个答案:

答案 0 :(得分:0)

来自Kafka文档:

每个分区是记录的有序,不变的序列, 连续附加到结构化提交日志。记录在 每个分区都分配有一个顺序ID号,称为偏移量 唯一地标识分区中的每个记录。


生产者发送到特定主题分区的消息将是 按发送顺序添加。也就是说,如果发送记录M1 由同一生产者作为记录M2,并且先发送M1,然后发送M1 偏移量将小于M2,并在日志中更早出现。


A 消费者实例在存储区中按存储顺序查看记录 日志。

这些是有关Kafka的基本规则,将具有不同密钥的消息发送到同一分区不会更改此规则。您甚至可以将所有消息发送到同一分区,但第一条消息将在后续消息之前附加到日志中,并且偏移值较小。因此,订单将被保留。

答案 1 :(得分:0)

我的问题是主题中的分区数应等于传入数据中不同键的数目。

我认为这通常不是一个好主意。这完全取决于您正在处理的数据。如果您有固定数量的键(例如,女性,男性和多样化),这可能是有道理的。但是,即使那样,您也要小心,因为这可能导致代理上的数据负载不平衡,因为多样性可能较少。因此,您最终可能会将大部分数据存储在一个分区中,而其他分区将留空。通常,分区数量应根据您的吞吐量要求进行调整。

因此,如果分区数不等于数据中不同键的数目,那么我们可以在同一分区中使数据具有不同键吗?在这种情况下,如何保持数据顺序?

是的,您最终可能在同一分区中拥有不同的密钥。然后,将保留该特定分区的顺序,但不能在整个主题中得到保证。因此,假设您具有键A,B和C以及具有两个分区的主题。 A和C转到第一分区,而B存储在第二分区。如果数据正在这样流动: A / V1,A / V2,B / V1,C / V1,B / V2

然后您的分区将像这样填充:

  • 分区0:A / V1,A / V2,C / V1
  • 分区1:B / V1,B / V2

使用此主题时,尚不清楚A和C消息之间的顺序与B消息之间的关系。但是,始终保证消息A / V1在A / V2之前消费,A / V2在C / V1之前消费,而B / V1在B / V2之前消费。

如果您正在寻找一种将消息定向到分区的更灵活的方法,您还可以考虑编写custom partitioner