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