1、如何保证kafka不丢数据
生产端:ACK设置为-1,at_lest_once
Ack=0,相当于异步发送,消息发送完毕即offset增加,继续生产。
Ack=1,leader收到leader replica 对一个消息的接受ack才增加offset,然后继续生产。
Ack=-1,leader收到所有replica 对一个消息的接受ack才增加offset,然后继续生产。
消费端:设置成手动提交,手动提交offset,也就是当前业务都处理完成的时候,再提交offset,这样会导致重复消费,需要提供幂等性接口
幂等性接口,意思就是,系统A对系统B的接口进行多次调用所产生的结果和调用一次所产生的结果是一致的
2、kafka分区分配策略
kafka内部有两种分区分配策略:Range和 RoundRobin
默认是Range方式,Range是对每个Topic而言(针对topic,逐个分配),首先对同一个Topic里面的分区按照分区号进行排序,并对消费者按照字母顺序进行排序,然后Partitions分区个数除以消费者线程的总数来决定每个消费者线程消费几个分区,如果除不尽,那么前面几个消费者线程将会多消费一个分区
例如:我们有10个分区,两个消费者(C1,C2),3个消费者线程,10 / 3 = 3而且除不尽。
C1-0 将消费 0, 1, 2, 3 分区
C2-0 将消费 4, 5, 6 分区
C2-1 将消费 7, 8, 9 分区
RoundRobin分区分配策略有个前提:每个消费者订阅的主题必须相同,同一个消费者组里的所有消费者的消费者线程数必须相等;
将所有主题分区组成TopicAndPartition列表,然后对TopicAndPartition列表按照hashCode进行排序,最后按照轮询的方式发给每一个消费线程,这样不会出现每一个主题除不尽,就会导致前面部分消费者组会多分配分区的情况
3、Kafka消费数据积压,Kafka消费能力不足怎么办?
1.如果是kafka消费能力不足,则可以考虑增加topic的分区数,并且同事提升消费者组的消费者数量,消费者数=分区数(效果最佳)
2.如果是下游的数据处理不及时:提高每批次拉取的数量,批次拉取数据过少(拉取数据/处理时间<生成速度),使处理的数据小于生产的数据,也会造成数据积压