23
2021
01

Kafka 如何保证数据的顺序性,该如何解决?它怎么体现消息顺序性的?

7.1 解决数据顺序性

相同订单的数据,发送同一个分区中去


采用kafka分区策略


第一种分区策略:给定了分区号,直接将数据发送到指定的分区里面去


第二种分区策略:没有给定分区号,给定数据的key值,通过key取上hashCode进行分区


第三种分区策略:既没有给定分区号,也没有给定key值,直接轮循进行分区


第四种分区策略:自定义分区


producer.send(new ProducerRecord<String, String>("test", Integer.toString(i), Integer.toString(i)));

//kafka的第一种分区方式,如果给定了分区号,那么就直接将数据发送到指定的分区号里面去

producer.send(new ProducerRecord<String, String>("test",2,"helloworld",i+""));

//kafka的第二种分区策略,没有给定分区号,给定了数据的key,那么就通过key取hashcode,将数据均匀的发送到三台机器里面去

//注意如果实际工作当中,要通过key取上hashcode来进行分区,那么就一定要 保证key的变化,否则,数据就会全部去往一个分区里面

producer.send(new ProducerRecord<String, String>("test",i+"",i+""));

//kafka的第三种分区策略,既没有给定分区号,也没有给定数据的key值,那么就会按照轮循的方式进行数的发送

producer.send(new ProducerRecord<String, String>("test",i+""));

//kafka的第四种分区策略,自定义分区类,实现我们数据的分区


Flume 整合 Kafka 顺序性


kafka sink


defalutPartitonId


将数据发送到指定的分区中去,例如:将数据发送到 3 号分区,指定 3 就可以了


partitionIdHeader


自定义分区策略指定一个类继承 kafka.partitioner.class


详细配置:


http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html


7.2 Kafka 如何体现消息有序性的

每个分区内,每条消息都有一个offset,故只能保证分区内有序。

如果为了保证topic整个有序,那么将partition调整为1.

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。