Apache kafka kafka producer中的两种不同类型的分区

Apache kafka kafka producer中的两种不同类型的分区,apache-kafka,Apache Kafka,在Kafka producer中,我发送了两组不同的数据。对于这个主题,我有两个分区。第一个有钥匙,第二个没有钥匙。据我所知,密钥用于为数据创建分区。如果缺少密钥,将发送null,分区将通过循环调度进行 但问题是,如果我在某一特定时间段内交替发送带有和不带密钥的数据,会发生什么 除了使用键创建的分区外,是否会对分区执行循环调度,还是对所有两个分区执行循环调度?在分区中发送和存储记录时,Kafka有一个非常有组织的方案。正如您所提到的,密钥用于将相同的密钥记录发送到相同的分区。这有助于维护有关该主

在Kafka producer中,我发送了两组不同的数据。对于这个主题,我有两个分区。第一个有钥匙,第二个没有钥匙。据我所知,密钥用于为数据创建分区。如果缺少密钥,将发送null,分区将通过循环调度进行

但问题是,如果我在某一特定时间段内交替发送带有和不带密钥的数据,会发生什么


除了使用键创建的分区外,是否会对分区执行循环调度,还是对所有两个分区执行循环调度?

在分区中发送和存储记录时,Kafka有一个非常有组织的方案。正如您所提到的,密钥用于将相同的密钥记录发送到相同的分区。这有助于维护有关该主题的消息的时间顺序

在您的情况下,两个分区将数据存储为:

  • 分区1:存储包含特定密钥的数据。具有此键的记录将始终转到此分区。这就是自定义分区的概念。除此之外,具有null值的键也将转到该分区,因为它遵循循环方式来存储记录
  • 分区2:该分区将包含不带任何键输入的记录。i、 e密钥为空

  • 卡夫卡根据以下规则选择分区

  • 如果使用自定义分区器,则将根据自定义分区器逻辑选择分区器
  • 如果没有自定义分区器,则Kafka使用DefaultPartitioner
  • a。如果密钥为空,则在循环中选择分区

    b。如果该键是非空键,那么它将使用带模的杂音2散列来标识主题的分区

    因此,带有键(null或NOTNULL)的消息将使用默认分区器在未定义自定义分区器的情况下在两个分区上发布

    要在特定分区中实现消息发布,可以使用以下方法

  • 发布消息时显式传递分区

    /** *创建要发送到指定主题和分区的记录 */ 公共产品记录(字符串主题、整数分区、K键、V值){ 这(主题、分区、null、键、值、null); }

  • 您可以创建自定义分区器并实现逻辑来选择分区


  • 我想纠正你。您说过密钥用于为数据创建分区发送带有消息的键基本上是为了获取特定字段的消息顺序。

    • 如果key=null,数据将被循环发送(到分布式环境中的不同分区和不同代理,当然也发送到同一主题)
    • 如果发送了一个密钥,那么该密钥的所有消息将始终转到同一分区
    举例说明

    • 键可以是任何字符串或整数等。。以一个整数employee_id作为键为例
    • 因此,employee_id 123将始终转到分区0,employee_id 345将始终转到分区1。这是由密钥散列算法决定的,该算法取决于分区的数量
    • 如果您不发送任何密钥,那么消息可以使用循环技术发送到任何分区

    欢迎使用堆栈溢出。请阅读。空键记录应在两个分区中结束。分区程序不知道还有其他带有键的记录,因此只会排除这些分区