面试官:Kafka中的key有什么用?

我们在使用 Kafka 时,最简单、最常用的方式是只设置 topic(主题)和 value(消息体),如下所示: 

 这样的话获取消息的代码也很简单,如下所示:

 

java

代码解读

复制代码

@KafkaListener(topics = "mytopic", groupId = "my-group") public void listen(String data) { System.out.println("监听到消息:" + data); }

但是,除了我们可以设置和传递 topic 和 value 之外,我们还可以传递 key,如下图所示: 

 那问题来了,发送消息时设置这个 key 有什么用呢?

key的作用

发送消息时,设置 key 的作用如下: 

1.决定分区

当生产者发送消息时,如果指定了 key,Kafka 会根据 key 的 hash 值来决定这条消息应该发送到哪个分区。

如果没有指定 key,Kafka 会采用轮询(早期版本)或随机(最新版本)的方式将消息分配到其他分区中。

分区的具体实现源码在 DefaultPartitioner 中 partition 方法中体现,核心源码如下:

这边整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

 需要全套面试笔记的【点击此处即可】免费获取

java

代码解读

复制代码

public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster, int numPartitions) { return keyBytes == null ? this.stickyPartitionCache.partition(topic, cluster) : BuiltInPartitioner.partitionForKey(keyBytes, numPartitions); }

指定 key 之后的分区实现代码如下:

 

java

代码解读

复制代码

public static int partitionForKey(byte[] serializedKey, int numPartitions) { return Utils.toPositive(Utils.murmur2(serializedKey)) % numPartitions; }

以上源码的大概含义是:使用 MurmurHash2 算法对字节数组 serializedKey 进行哈希运算,并将其结果转换为正数,然后对 numPartitions 取模,以确定键在分区中的位置,返回值表示键所在的分区编号。

所以,从上述源码可以看出,发送消息如果设置了 key 之后,会将相同 key 放到同一个分区中。

2.保证消息顺序

在 Kafka 中,同一个分区中的消息是有序的。而相同的 key,根据上面的分区算法可知,它们会存放到同一个分区,这样就能保证消息的有序性了。

3.消息过滤

对于某些应用场景,消费者可以根据消息的键来进行过滤或聚合操作。例如,在实时数据分析场景中,可能需要对具有相同键的消息进行分组处理。

Kafka 设置了 key 之后,可以通过以下方式实现消息过滤,如下代码所示:

 

java

代码解读

复制代码

@KafkaListener(topics = "topicName", groupId = "groupId") public void listen(String message, ConsumerRecord<?,?> record) { Object key = record.key(); if (key instanceof String && ((String) key).matches("regexPattern")) { // 处理满足正则表达式条件的消息 } }

也就是,我们在接收到消息之后,通过对 key 的正则匹配实现消息的过滤和聚合等操作。

课后思考

保证 Kafka 消息的有序性,除了设置 key 之外,还有哪些实现手段?

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kafka和RabbitMQ都是流行的消息代理,但它们在设计和使用上有很大的区别。Kafka是一个分布式的流平台,而RabbitMQ是一个消息代理,支持多种消息协议。 Kafka最初由LinkedIn开发,用于处理LinkedIn网站的实时数据流。它是一个分布式的、可水平扩展的、高性能的、基于发布/订阅模型的消息队列。Kafka最初开发的目的是为了处理大量的日志数据,但现在它已被广泛应用于各种不同的用例,例如实时流处理、数据集成和消息传递等。 相比之下,RabbitMQ是一个可靠、高效的开源消息代理,采用AMQP协议。它支持多种消息传递模式,例如点对点、发布/订阅和请求/响应。RabbitMQ架构简单,易于集成和部署,而且拥有丰富的插件生态系统。 要简要概括: - Kafka 是一个分布式流平台,支持发布/订阅模型,用于处理大量的实时数据流。 - RabbitMQ 是一个消息代理,支持多种消息协议,例如AMQP,支持多种消息传递模式,例如点对点、发布/订阅和请求/响应。 以下是两者主要的区别: - Kafka将数据存储在磁盘上,因此可以扩展到数百个服务器并处理大量数据。另一方面,RabbitMQ将所有消息保留在内存,因此它不能扩展到太多的服务器或处理大量数据。 - Kafka的优点在于它可以处理大量数据,同时提供低延迟和高吞吐量。RabbitMQ的优点在于它易于集成和部署,并且支持多种消息协议和传递模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值