[{"createTime":1735734952000,"id":1,"img":"hwy_ms_500_252.jpeg","link":"https://activity.huaweicloud.com/cps.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=201905","name":"华为云秒杀","status":9,"txt":"华为云38元秒杀","type":1,"updateTime":1735747411000,"userId":3},{"createTime":1736173885000,"id":2,"img":"txy_480_300.png","link":"https://cloud.tencent.com/act/cps/redirect?redirect=1077&cps_key=edb15096bfff75effaaa8c8bb66138bd&from=console","name":"腾讯云秒杀","status":9,"txt":"腾讯云限量秒杀","type":1,"updateTime":1736173885000,"userId":3},{"createTime":1736177492000,"id":3,"img":"aly_251_140.png","link":"https://www.aliyun.com/minisite/goods?userCode=pwp8kmv3","memo":"","name":"阿里云","status":9,"txt":"阿里云2折起","type":1,"updateTime":1736177492000,"userId":3},{"createTime":1735660800000,"id":4,"img":"vultr_560_300.png","link":"https://www.vultr.com/?ref=9603742-8H","name":"Vultr","status":9,"txt":"Vultr送$100","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":5,"img":"jdy_663_320.jpg","link":"https://3.cn/2ay1-e5t","name":"京东云","status":9,"txt":"京东云特惠专区","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":6,"img":"new_ads.png","link":"https://www.iodraw.com/ads","name":"发布广告","status":9,"txt":"发布广告","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":7,"img":"yun_910_50.png","link":"https://activity.huaweicloud.com/discount_area_v5/index.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=aXhpYW95YW5nOA===&utm_medium=cps&utm_campaign=201905","name":"底部","status":9,"txt":"高性能云服务器2折起","type":2,"updateTime":1735660800000,"userId":3}]
<>【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消息的顺序性。