kafka保证消息不丢失
简述
在kafka的使用过程中,消息传递有下图三个步骤,消息的丢失也就在这三个步骤中:发送过程中丢失、同步过程中丢失、拉取过程中丢失。
发送过程中丢失
发送方式
生产者的发送方式有三种:
1、简单发送,不关心发送结果,所以发送失败消息丢失也不知道。
1 | ProducerRecord<String,String> record = new ProducerRecord<>("topicName","key","value"); |
2、同步发送,等待发送返回
1 | ProducerRecord<String,String> record = new ProducerRecord<>("topicName","key","value"); |
3、异步发送,执行回调方法
1 | private class DemoProducerCallback implements Callback{ |
在这三种发送方法中,第一种方法,无返回,不感知,所以也无法保证消息不丢失。所以要保证消息不丢失,只能选择第二种或者第三种,一般情况下更推荐第三种。
acks参数设置
在生产者中有acks参数,该参数指定了kafka的多少个副本同步后才算消息发送成功。该参数取值范围:
1、acks=0,表示生产者在消息后不管有没有在leader磁盘上落盘,就认为消息发送成功。
2、acks=1,表示生产者在消息后,在leader磁盘上落盘,就认为消息发送成功,不管其他follower有没有同步。
3、acks=all,表示生产者在消息后,在leader磁盘上落盘,其他follower都同步落盘, 认为消息发送成功。
小结
通过设置发送方式和acks参数,可以保证在发送方式中不丢失,甚至acks参数都可以保证后面的同步过程中消息不丢失。
发送方式一般设置为异步发送,acks参数默认设置为1。
同步过程中丢失
在同步过程中,除了上面说的答acks参数,还有其他副本机制保证消息不丢失。避免leader节点的崩溃导致消息的丢失。
broker中的配置项,unclean.leader.election.enable = false,表示不允许非ISR中的副本被选举为首领,以免数据丢失。
ISR:是指与leader保持一定程度(这种范围是可通过参数进行配置的)同步的副本和 leader 共同被称为ISR
OSR:与leader同步时,滞后很多的副本(不包括leader)被称为OSR
AR,分区中所有的副本统称为AR。AR = ISR + OSR
拉取过程中丢失
设置 enable.auto.commit = false,在consumer端消费消息操作完成以后再手动提交 offset,类似于下文中的代码示例
1 | public void consumerMsg(){ |