【发布时间】:2020-06-02 18:48:37
【问题描述】:
我想使用键/值模式写入 Kafka,以便在读取数据时保持相同的数据写入顺序。 我的问题是主题中的分区数量是否应该等于传入数据中不同键的数量。 我已经知道,具有相同键的键/值模式数据将进入同一个分区。
因此,如果分区数不等于数据中不同键的数量,我们可以在同一分区中拥有具有不同键的数据吗?在这种情况下如何保持数据顺序?
【问题讨论】:
标签: apache-kafka partition kafka-topic
我想使用键/值模式写入 Kafka,以便在读取数据时保持相同的数据写入顺序。 我的问题是主题中的分区数量是否应该等于传入数据中不同键的数量。 我已经知道,具有相同键的键/值模式数据将进入同一个分区。
因此,如果分区数不等于数据中不同键的数量,我们可以在同一分区中拥有具有不同键的数据吗?在这种情况下如何保持数据顺序?
【问题讨论】:
标签: apache-kafka partition kafka-topic
我的问题是主题中的分区数是否应该等于传入数据中不同键的数量。
我认为这通常不是一个好主意。这完全取决于您正在处理的数据。如果您有固定数量的键(例如女性,男性和多样化),这可能是有意义的。但是,即使那样,您也需要小心,因为这可能会导致代理上的数据负载不平衡,因为可能存在较少的多样性。因此,您最终可能会将大部分数据放在一个分区中,而其他分区则为空。一般来说,分区的数量应根据您的吞吐量要求进行调整。
因此,如果分区数不等于数据中不同键的数量,我们可以在同一分区中拥有具有不同键的数据吗?在这种情况下如何保持数据顺序?
是的,您最终可能会在同一个分区中拥有不同的密钥。然后为这个特定的分区保留顺序,但不能保证在整个主题中。所以假设你有键 A、B 和 C 以及一个有两个分区的主题。 A 和 C 进入第一个分区,B 存储在第二个分区中。如果数据像这样流动: A/V1、A/V2、B/V1、C/V1、B/V2
然后你的分区会被这样填充:
使用此主题时,不清楚 A 和 C 消息之间的顺序与 B 消息之间的关系如何。但是始终保证消息A/V1在A/V2之前被消费,A/V2在C/V1之前被消费,B/V1在B/V2之前被消费。
如果您正在寻找一种更灵活的方式将消息引导到分区中,您也可以考虑编写custom partitioner。
【讨论】:
来自 Kafka 文档:
每个分区都是一个有序、不可变的记录序列 不断地附加到结构化的提交日志中。中的记录 每个分区都分配有一个称为偏移量的顺序 ID 号 唯一标识分区中的每条记录。
生产者发送到特定主题分区的消息将被 按照发送顺序附加。也就是说,如果发送了一条记录 M1 由与记录 M2 相同的生产者发送,首先发送 M1,然后发送 M1 将具有比 M2 更低的偏移量并在日志中更早出现。
一个 消费者实例按照它们存储的顺序查看记录 记录。
这些是关于 Kafka 的基本规则,将具有不同键的消息发送到同一分区不会改变这一点。您甚至可以将所有消息发送到同一个分区,但第一条消息将在后续消息之前附加到日志中,并且具有较低的偏移值。因此将保留顺序。
【讨论】: