如何保证KafKa消息不丢失

1.消息要持久化或者是添加消息确认机制

理解:

1.服务端:保证Brock所有副本同步unclean.leader.election.enable = false

我们要设置broker中的一个配置项,去保证副本之间的数据同步,同时我们在producer将消息投递到服务器的时候,我们需要将消息进行持久化,也就是说我们要去同步到硬盘,注意同步到硬盘过程中,会有同步刷盘和异步刷盘,选择同步刷盘消息一定不会丢失,就算丢失了我们也可以即使补偿,但是选择异步刷盘的话,这个时候消息就有一定的丢失的概率,网上有KafKa不支持同步刷盘,这种不一定全错,但是我们可以通过参数的配置它去变成可同步刷盘。

2.生成者:

我们要去使用带有回调通知的send(msg,callback)方法,并且要设置acks = all,这样的话它的消息投递方式采用的是同步方式,producer要保证消息能够到达服务器,就需要使用到消息的确认机制,也就是说,必须要确保消息投递到服务器以后,并且能够得到投递成功的相应,确认服务器它已经接受,才会绩效往下去执行,那如果producer将消息投递到服务端以后,服务器它没有来得及接收,它就已经宕机了,那投递过来的消息岂不是丢失了,这种情况的话解决方案是producer投递消息的时候它都会去记录日志,然后将消息投递到服务端,就算服务器宕机了,等到服务器重启之后,也可以根据日志信息去完成消息的补偿,这样的话就可以确保消息不丢失

3.消费者:

我们要设置一个自动提交为false enable.auto.commit = false

在KafKa中消费完成之后,它不会立即删除,而是使用定时的清除策略,也就是说我们消息者要确保消息成功以后,我们要手动ACK提交,如果消息失败的情况下,我我们要去不断的去重试,所有消费端不能设置自动提交,一定要设置为手动提交,才能够去保证消息它不丢失

总结:

1.服务端持久化设置为同步刷盘

2.生产者设置为同步投递

3.消费端设置为手动提交

你可能感兴趣的:(kafka,java,分布式)