在《Kafka制作人》中,我发送了两组不同的数据。我有两个主题分区。第一个有钥匙,第二个没有钥匙。据我所知,密钥用于为数据创建分区。如果密钥不存在,则发送null,并通过循环调度进行分区。但问题是,如果我在某个特定的时间段内交替发送带有和不带密钥的数据,会发生什么?除了使用key生成的分区之外的分区会发生循环调度吗?还是所有两个分区都会发生循环调度?
qc6wkl3g1#
在分区中发送和存储记录时,kafka有一个非常有组织的场景。正如您所提到的,密钥用于将相同的密钥记录发送到相同的分区。这有助于保持有关该主题的信息的时间顺序。在您的情况下,这两个分区将数据存储为:分区1:存储包含特定密钥的数据。具有此密钥的记录将始终转到该分区。这就是自定义分区的概念。除此之外,具有空值的键也将转到这个分区,因为它遵循循环方式来存储记录分区2:这个分区将包含不带任何键的记录。i、 e密钥为空。
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
dgiusagp3#
我想纠正你。您说过密钥用于为数据创建分区。发送带有消息的键基本上是为了获取特定字段的消息顺序。如果key=null,数据将被循环发送(到不同的分区和分布式环境中的不同代理)。当然是同一个主题)。如果发送了一个密钥,那么该密钥的所有消息将始终转到同一分区。解释和举例键可以是任何字符串或整数等。。举一个整数雇员id作为键的例子。所以employee\u id 123将始终转到分区0,employee\u id 345将始终转到分区1。这是由密钥散列算法决定的,该算法取决于分区的数量。如果您不发送任何密钥,那么可以使用循环技术将消息发送到任何分区。
3条答案
按热度按时间qc6wkl3g1#
在分区中发送和存储记录时,kafka有一个非常有组织的场景。正如您所提到的,密钥用于将相同的密钥记录发送到相同的分区。这有助于保持有关该主题的信息的时间顺序。
在您的情况下,这两个分区将数据存储为:
分区1:存储包含特定密钥的数据。具有此密钥的记录将始终转到该分区。这就是自定义分区的概念。除此之外,具有空值的键也将转到这个分区,因为它遵循循环方式来存储记录
分区2:这个分区将包含不带任何键的记录。i、 e密钥为空。
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
dgiusagp3#
我想纠正你。您说过密钥用于为数据创建分区。发送带有消息的键基本上是为了获取特定字段的消息顺序。
如果key=null,数据将被循环发送(到不同的分区和分布式环境中的不同代理)。当然是同一个主题)。
如果发送了一个密钥,那么该密钥的所有消息将始终转到同一分区。
解释和举例
键可以是任何字符串或整数等。。举一个整数雇员id作为键的例子。
所以employee\u id 123将始终转到分区0,employee\u id 345将始终转到分区1。这是由密钥散列算法决定的,该算法取决于分区的数量。
如果您不发送任何密钥,那么可以使用循环技术将消息发送到任何分区。