kafka整个架构分为三层:producer,broker,consumer,kafka针对这三层都有相应的机制保证消息不丢.
首先producer端:producer本身提供一个重试参数retries,如果是因为网络问题或broker故障导致发送失败,producer是可以自动重试的,producer是异步发送消息的,可以把异步改为同步这样producer就能实时知道消息的发送结果.
broker端保证消息不丢失就是把消息持久化到磁盘,kafka为了提升性能采用异步刷盘机制,它是按照一定的消息量和时间间隔去刷盘,如果在刷盘之前系统崩溃了,kafka是没有提供同步刷盘的机制的.只能通过partition的副本机制和acks机制来解决,partition是针对数据分区的高可用策略,每个partition副本会包含一个leader和多个follower,leader负责处理事务类型的请求,fowller负责同步leader的数据,在这样的一个机制基础上,kafka提供acks的参数,producer可以设置acks参数结合broker的副本机制共同保障数据可靠性
- acks = 0,表示producer不需要等待broker的响应就返回成功结果,这种行为会存在消息丢失
- acks = 1, 表示副本的leader接收到消息后,不等待follower同步完成就返回成功结果,这种行为也会导致消息丢失
- acks = -1,表示副本中的leader接收到消息后,等待follower同步完成,这个策略是可以保证数据的可靠性
consumer端:只要producer和broker端的消息可靠性都得到的保证,consumer端是不太可能出现消息无法消费问题的,除非消费端没有消费完消息就提交了offset,如果出现这种情况可以重新调整offset值进行重新消费,