kafka怎样保证消息的不丢失
kafka怎样保证消息的不丢失
kafka怎样保证消息的不丢失
三个方面考虑与实现
一,从producer端入手
确保消息能够到达到broker端,并且实现消息的存储。有三种方式保证消息的存储:1、生产者默认是使用异步发送消息的,我们可以把异步发送改成同步发送,这样生产者就可以实时的发送消息。2、添加异步回调的函数来监听消息的发送状态,如果发送时报错这就再次调用发送的方法,重新发送。3,生产者本身是提供了回调参数retries的,如果发送失败,则生产者会重新再次的发行消息。
二,从broker端入手
只需要我们将消息持久化到磁盘就可确保消息不丢失,但是kafka为了性能,采用了异步批量刷新磁盘实现存储功能的机制,就会按照一定的消息量以及时间间隔去刷盘存储消息,最终刷新磁盘的任务是由操作系统来调度的,如果在刷盘之前系统奔溃那么消息就会丢失,并没有提供同步刷盘的同步机制,针对这个问题,需要从partition的副本同步机制以及acks机制来解决,副本机制是针对每一个数据分区的高可用策略,每个副本集包含一个leader以及多个副本,leader主要是负责事务类型的请求,而follower是负责同步我们leader上面的数据的,在这个基础上kafka提供了一个acks的参数,在创建broker的时候可以去设置他。acks参数选择如下 0: 表示生产者不需要等待broker的响应就可以认定消息是发送成功了的,这种情况就会出现消息丢失的情况,1:表示leader不需要leader收到消息之后就认定消息是发送成功了的,不需要等待副本的同步,这种情况么当leader挂了消息同样会丢失。 -1:标识leader收到消息并且所有副本都已经同步数据之后再认定消息发送成功。这样就可以保证数据的可靠性。
三,消费端
一般不会出现消息丢失的情况,即使丢失,可以调offset来实现消息的重新消费。
更多推荐
所有评论(0)