kafka如何保证消息不丢失?
kafka是实现异步消息通讯的中间件,整个架构Producer Consumer Broker
组成
所以保证消息不丢失从这三个方面考虑和实现
.确保Producer端数据能够到达Broker,并且实现消息的存储
.有可能会出现网络问题,导致消息发送失败
一,Producer默认是异步发送消息,确保消息发送成功
第一种方法 把异步发送改为同步发送,这样就能实时知道消息发送的结果
第二种方法 添加异步或调函数,监听消息发送的结果,如果失败可以在回调中重试
第三种方法 Producer本身提供了一个retries的机制,如果因为网络问题,或者broker故障 导致发送失败,就是重试
二,Broker端 确保发送来的数据不丢失,只需要把这个消息持久化到磁盘。
但是Kafka为了提高性能,采用的是异步批量,存储到磁盘的机制,就是有一定的消息量和时间间隔要求的,刷磁盘的这个动作是操作系统来调度的,如果在刷盘之前系统就崩溃了,就会数据丢失
。
它没有同步刷盘的机制。
针对这个问题,需要Partition的副本机制,acks机制来解决
。Partition的副本机制是针对每个数据分区的高可用策略,每个副本集会包含唯一的一个leader和多个follower,leader负责处理事务类型的请求,follower负责同步leader的数据。
所以Kafka提供了一个 acks的参数,Producer可以设置这个参数,去结合broker的副本机制来共同保障数据的可靠性。
acks=0 表示producer不需要等待broker的响应,就认为消息发送成功了(可能存在数据丢失)
acks=1 表示broker的leader和Partition收到消息之后 不等待其他的follower Partition的同步就给Producer发一个确认,假设leader和Partition
挂了(可能存在数据丢失)
acks=-1 表示broker的leader和Partition收到消息之后 并且等待 ISR列表中的follower同步完成,再给Producer返回一个确认(保证数据不丢失)
三,Consumer 必须要能够消费这个消息。
其实只要Producer和Broker的消息能得到保证,消费端不太可能出现不能消费的问题
除非Consumer没有消费完这个消息就提交了offset
,这个我们可以重新调整offset的值,来实现重新消费
Kafka的副本 分区 刷盘要有深刻的理解。