一、kafka生产者

1.生产者分区的好处

1.1 便于合理的使用存储资源, 每个partition在一个broker上存储,可以把海量数据分割成一块一块数据存储在broker上。合理的控制分区数量实现负载均衡的效果。

1.2 提高并行度,多个生产者 可以以分区为单位发送数据,消费者以分区为单位消费数据。

二、 生产者的三种分区策略

2.1 指定分区 的方式,通过指定分区编号到broker上分区中。

2.2 没有指明partition时,但是key指定时,这时采用哈希来分区:key的哈希值与对用topic的分区数取余来确定分区。

2.3 既没有partition,也没有key时采用粘性分区器,会随机选一个进行分区,当该分区的bath已满或者已完成,kafka会再挑选一个与上个不同的分区。

在3.3.1之前的版本,当该分区batch已满或者linger.ms到达设置时间就会被sender线程读取,再次有新数据进来分区时则不会选择该分区

在3.3.1时则不会考虑linger.ms了,只考虑批次,使得数据均匀分布,在考虑linger.ms时,可能batch.size和linger.ms 设置的不合理导致数据倾斜。

三、自定义分区器

开发人员可以根业务需求使数据2前往不同的分区,需要自定义分区器来实现。

1. 实现接口Partitioner

2.实现3个方法:partition,close,configure

4.编写partition方法,返回分区号

5.在客户端将此类配置进去。

properties.put(ProducerConfig.PARTITIONER_CLASS_CONFIG,"com.atguigu.kafka.producer.MyPartitioner");

四、生产经验——如何提高吞吐量

在生产者中linger.ms的默认是0相当于没有延迟,但是它并不会提高吞吐量,修改它的值(50-100ms),也可以适当提高批处理的大小(batch.size),批处理调大后,可能会导致数据积压,这时会调大缓冲区大小,也可以使用压缩,处理更多的数据。

五、生产者经验——数据可靠性

5.1 ack的应答级别

1)当ack=0时,是不安全的,生产者发送过来的数据是不等数据落盘就应答,数据丢失。

2)当ack=1时,当leader落盘时,才会给回应,但是当leaer落完盘还没来得及follower同步时挂掉,生产者认为发送成功,而新上位的leader并没有数据,造成数据丢失。

3)当ack=-1时,当生产者发送过来的数据,leader和ISR里面的节点都收到后才应答。

5.2 对ack=-1时的分析

当生产者发送过来数据,leader已经落盘,follower同步数据,因为某些故障,一台follower迟迟不能和leader进行数据同步,如何解决这个问题。

leader维护了一个动态ISR,意为和leader保持同步的leader和follower集合。如果followe长时间没向leader发送通信请求或者同步数据,则会将该follower踢出ISR。该时间阈值由replica.lag.time.max.ms参数设定,默认30s

数据可靠性分析,当分区的副本数设为1,或者ISR中应答的最小副本数量设置为1,此时的效果和ack=1一样,也会有丢失数据的风险。

数据完全可靠条件=ACK级别设置为-1 + 分区副本数大于等于2 + ISR里面应答的最小副本数大于等于2

5.3 ack=-1时,数据重复性的分析

当生产者发送过来的数据,leader和ISR里的可用节点全部都落盘后,leader出现故障,选出新的leader,生产者没有收到应答将会重新发送,落盘后则造成数据重复。解决方案:幂等性加事务。

六、生产经验——数据去重

6.1 数据传递语义

至少一次(At least Once)= ACK级别设置为-1 + 分区副本数大于等于2 + ISR中应答的最小副本数量大于等于2

最多一次(At Most Once) =ACK 级别设置为0;

At least once可以保证数据不丢失,但是不能保证数据不重复。

At most once 可以保证数据不重复,但是不保证数据不丢失。

精准一次要求数据不重复也不丢失。

kafka 在0.11版本引入幂等性和事务。

七、幂等性

7.1 幂等性原理

幂等性是指producer不论向Broker发送多少条数据,Broker只会持久化一条,保证不重复。
精确一次(Exactly Once) =幂等性 + 至少一次。

重复数据判断标准:具有<PID,Partition,SeqNumber> 相同主键的消息提交时,Broker只会持久化一条数据。其中PID是Kafka或者每次生产者重启都会生成一个新的pid,partition表示分区编号,Sequence Number是单调自增的。
所以幂等性只能保证单分区单会话的内不重复。

它只能保证单分区上的幂等性,即一个幂等性 Producer 能够保证某个主题的一个分区上不出现重复消息,它无法实现多个分区的幂等性(主键中的分区不同,在不同分区出现重复)。其次,它只能实现单会话上的幂等性,不能实现跨会话的幂等性。这里的会话,你可以理解为 Producer 进程的一次运行。当你重启了 Producer 进程之后,这种幂等性保证就丧失了。

7.2 事务

Kafka 的事务概念类似于我们熟知的数据库提供的事务。在数据库领域,事务提供的安全性保障是经典的 ACID,即原子性(Atomicity)、一致性 (Consistency)、隔离性 (Isolation) 和持久性 (Durability)。