1、kafka0.11.0.0版本之前,Kafka只能支持两种语义:At most once和At least once。Kafka在0.11.0.0版本支持增加了对幂等的支持。幂等是针对生产者角度的特性。幂等可以保证生产者发送的消息,不会丢失,而且不会重复
要实现 exactly-once 在 Kafka 0.11.0 中有两个官方策略:
1)幂等
每个 Producer 在初始化的时候都会被分配一个唯一的 PID,对于每个唯一的 PID,Producer 向指定的 Topic 中某个特定的 Partition 发送的消息都会携带一个从 0 单调递增的 Sequence Number。
1)启用幂等producer:在producer程序中设置属性enabled.idempotence=true,但不要设置transational_id.注意是不要设置,而不是设置为空字符串
幂等性不能跨多个 Topic-Partition,只能保证单个 partition 内的幂等性。即单个分区内数据不丟不重。如果要保证多个分区不丢不重,需要以下事务性来实现
2)事务
保证操作的原子性,要么全部成功,要么全部失败。
启用事务支持:在producer程序中设置属性transcational.id为一个指定字符串(你可以认为这是你的额事务名称,故最好七个有意义的名字),同时设置enable.idempotence=true
2、kafka key为空的时候消息发到哪个分区?
kafka定义了一个全局变量,这个变量值是配置参数中的topic.metadata.refresh.interval.ms设置的值,也就是说在这个时间内,key=null的消息都会往缓存起来的这个分区存储,
当时缓存过时之后,就会重新计算分区号,将计算结果缓存起来。也就是说在key为null的情况下,Kafka并不是每条消息都随机选择一个Partition;而是每隔topic.metadata.refresh.interval.ms才会随机选择一次!
3、kafka底层存储
Partition是以文件的形式存储在文件系统中,比如,创建了一个名为test的topic,其有5个partition,那么在Kafka的数据目录中(由配置文件中的log.dirs指定的)中就会有这样5个目录: test-0,test-1…
partition还可以细分为segment,一个partition物理上由多个segment组成
segment文件由两部分组成,分别为“.index”文件和“.log”文件,分别表示为segment索引文件和数据文件
来源:CSDN
作者:jayolalala
链接:https://blog.csdn.net/laojingyao/article/details/104087726