Kafka如何保证消息不丢失?
2023-05-01 本文已影响0人
ssttIsme
Kafka要严格意义上保证消息不丢失,需要从三个方面来设置
- 服务器持久化设置为同步刷盘
- 生产者设置为同步投递
- 消费者设置为手动提交
1.服务器持久化设置为同步刷盘
服务端要设置broker中的一个配置项去保证副本之间的数据同步。
unclean.leader.election.enable = false
同时我们在Producer将消息投递到服务器的时候我们需要将消息进行持久化,也就是我们要去同步到硬盘。注意同步到硬盘过程中会有同步刷盘和异步刷盘。选择同步刷盘就可以保证消息一定不会丢失,就算丢失了我们也可以及时补偿。但是如果选择异步刷盘这个时候消息就有一定的丢失的概率。我们可以通过参数的配置让它去变成同步刷盘。
# 当达到下面的消息数量时,会将数据flush到日志文件中。默认10000
log.flush.interval.messages = 10000
# 当达到下面的时间(ms)时,会执行一次强制的flush操作。interval.ms和interval.messages无论哪个达到,都会flush。默认3000ms
log.flush.interval.ms = 1000
# 检查是否需要将日志flush的时间间隔
log.flush.scheduler.interval.ms = 3000
2.生产者设置为同步投递
生产者使用带有回调通知的send方法
send(msg,callback)
并且设置生产者消息确认机制
acks = all
这样它的消息投递方式采用的才是同步方式。生产者要保证消息能够到达服务器就需要使用到消息的确认机制。也就是说必须确保消息投递到服务器以后并且能够得到投递成功的响应确认服务器它已接收才会继续往下执行。在生产者投递消息的时候它都会去记录日志,然后将消息投递到服务器端,就算服务器宕机了,等到服务器重启之后也可以根据日志信息去完成消息的补偿,这样的话就可以确保消息不丢失。
3.消费者设置为手动提交
在Kafka中消息消费完成之后不会立即删除,而是使用定时的清理策略。也就是说我们消费者要确保消息成功以后我们需要手动ACK提交。如果消息失败的情况下,我们要去不断第重试,所以消费端不能设置自动提交,一定要设置为手动提交才能保证消息不丢失。
enable.auto.commit = false