赞
踩
Kafka是一个用来实现异步消息通讯的一个中间件,它的整个架构是由Producer、Consumer和Broker来组成。
所以对于Kafka如何去保证消息不丢失这个问题,可以从三个方面来回答。
首先是Producer端,需要去确保消息能够到达Broker,并且能够实现消息的存储。
在这个层面上有可能会出现网络问题导致消息发送失败。
Producer默认是异步发送消息的,所以可以通过以下方式来避免消息丢失:
Broker端需要确保Producer发送过来的消息是不会丢失的。
也就是说只需要去把这个消息持久化到磁盘就可以了。
但是Kafka为了提升性能,采用了异步批量刷盘的实现机制,也就是说按照一定的消息量和时间间隔去刷盘。而最终刷新到磁盘这个动作是由操作系统来调度的,所以如果在刷盘之前系统崩溃了,就会导致数据丢失。
Kafa并没有提供同步刷盘的一个实现机制,所以针对这个问题需要通过Partition的副本机制和acks机制来解决。
Partition副本机制,它是针对每个数据分区的高可用策略,每个Partition副本集会包含唯一的一个Leader和多个Follower。
Leader专门去处理事务类型的请求,而Follower负责同步leader的数据,那么在这样一个机制的基础上,Kafka提供了一个acks的参数,Producer
可以去设置acks参数去结合Broker的副本机制来共同保障数据的可靠性。
acks这个参数的值有几个选择:
最后就是Consumer必须要能够消费这个消息,实际上只要producer和broker的消息可靠性得到保障。那么消费端是不太可能出现消息无法消费的问题的,除非是Consumer没有消费完这个消息,就已经提交了这样一个offset。但是即便是出现了这样一个情况,我们也可以通过重新调整offset的值来实现重新消费。
参考资料:Kafka如何保证消息不丢失
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。