Kafka制作器中两种不同类型的分区

vecaoik1  于 2021-06-06  发布在  Kafka
关注(0)|答案(3)|浏览(403)

在《Kafka制作人》中,我发送了两组不同的数据。我有两个主题分区。第一个有钥匙,第二个没有钥匙。据我所知,密钥用于为数据创建分区。如果密钥不存在,则发送null,并通过循环调度进行分区。
但问题是,如果我在某个特定的时间段内交替发送带有和不带密钥的数据,会发生什么?
除了使用key生成的分区之外的分区会发生循环调度吗?还是所有两个分区都会发生循环调度?

qc6wkl3g

qc6wkl3g1#

在分区中发送和存储记录时,kafka有一个非常有组织的场景。正如您所提到的,密钥用于将相同的密钥记录发送到相同的分区。这有助于保持有关该主题的信息的时间顺序。
在您的情况下,这两个分区将数据存储为:
分区1:存储包含特定密钥的数据。具有此密钥的记录将始终转到该分区。这就是自定义分区的概念。除此之外,具有空值的键也将转到这个分区,因为它遵循循环方式来存储记录
分区2:这个分区将包含不带任何键的记录。i、 e密钥为空。

8mmmxcuj

8mmmxcuj2#

Kafka按照下面的规则选择分区
如果使用自定义分区器,那么将根据自定义分区器逻辑选择分区器。
如果没有自定义分区器,那么kafka使用defaultpartitioner
答。如果密钥为空,则在循环中选择分区。
b。如果该键是非空键,那么它将使用带模的murruse2散列来标识主题的分区。
因此,带有键(null或notnull)的消息将使用默认分区器在两个分区上发布,而没有定义自定义分区器。
要在特定分区中实现消息发布,可以使用以下方法。
在发布消息时显式传递分区
/**创建要发送到指定主题和分区的记录/public producerrecord(string topic,integer partition,k key,v value){this(topic,partition,null,key,value,null);}
您可以创建自定义分区器并实现逻辑来选择分区
https://kafka.apache.org/10/javadoc/org/apache/kafka/clients/producer/partitioner.html

dgiusagp

dgiusagp3#

我想纠正你。您说过密钥用于为数据创建分区。发送带有消息的键基本上是为了获取特定字段的消息顺序。
如果key=null,数据将被循环发送(到不同的分区和分布式环境中的不同代理)。当然是同一个主题)。
如果发送了一个密钥,那么该密钥的所有消息将始终转到同一分区。
解释和举例
键可以是任何字符串或整数等。。举一个整数雇员id作为键的例子。
所以employee\u id 123将始终转到分区0,employee\u id 345将始终转到分区1。这是由密钥散列算法决定的,该算法取决于分区的数量。
如果您不发送任何密钥,那么可以使用循环技术将消息发送到任何分区。

相关问题