【kafka面试题】如何保证kafka消息的顺序性
一、整体策略
如何保证kafka消息的顺序性呢,其实整体的策略就是:我们让需要有序的消息发送到同一个分区Partition。
为什么说让有序的消息发送到同一个分区Partition就行呢,,下面我们来详细分析一下子。
二、分析
首先,我们知道kafka消息的收发是基于Topic(主题),消息通过Topic进行分类。单个Topic可以有多个Partition(分区,可以理解为一个队列),消息以追加的方式写入分区(Partition),然后以先入先出的方式读取。需要注意,由于一个主题一般包含几个分区,因此无法在整个主题范围内保证消息的顺序,但可以保证消息在单个分区内的顺序。同时,单个Partition在同一个消费者组内,只能被一个消费者消费。
所以基于上述kafka的特性,要保证kafka消息的顺序性,我们只要让需要有序的消息发送到同一个分区就行。
那么,kafka生产者如何将消息发送到同一个分区呢,这就涉及到了另一个问题kafka生产者的分区选择策略。
三、kafka生产者的分区选择策略
Kafka生产者的分区选择策略是指在将消息发送到Kafka集群时,生产者决定将消息发送到哪个分区(Partition)。kafka分区选择策略如下:
1、指定了分区
当发送时指定了partition就使用该partition。即kafka生产者发送的消息ProducerRecord(String topic, Integer partition, K key, V value)指定了发送到哪个具体的分区。
2、通过默认分区器(partitioner)实现指定分区
如果kafka生产者发送的消息ProducerRecord(String topic, Integer partition, K key, V value)没有指定发送到哪个具体的分区,即partition=null(并且key也为空时,如果此时key不为空的话就会采用另一种分区策略key哈希分区策略,这个咱在第四条给你讲,别急!!!),并且使用了默认的分区器,那么消息将被随机的发送到主题的各个可用分区上,分区器使用轮询的算法将消息均衡的分布到各个分区。
3、自定义分区策略(即自定义Partitioner)
用户可以根据自己的需求实现自定义的分区策略,通过实现org.apache.kafka.clients.producer.Partitioner接口来自定义分区选择逻辑。
4、key哈希分区策略
根据消息的key进行哈希计算,并将消息发送到对应的分区。保证相同key的消息始终被发送到同一个分区,确保消息的顺序性。
综上所述,如果要保证kafka生产者发送的消息(局部)顺序性,我们就可以将需要保证顺序性的kafka消息发送到同一个分区,而如何将kafka消息发送到同一个分区呢,我们就可以使用上述第四种分区选择策略,即key哈希分区策略,我们可以使用Id或者能标记记录的标识作为key,这样key相同的消息就会呗分发到同一个分区进行消费,即保证了kafka消息的顺序性。