如何保证数据不丢失?
可以从三个方面来考虑实现:producer端、broker端、consumer端
1produce端:
确保消息能够到达broker,并且实现消息的存储。
在这个层面,有可能会存在网络异常导致消息发送失败。所以可以通过三种方式来避免消息丢失。produce默认是异步发送消息的,
1 把异步发送改成同步发送,这样producer就能实时知道消息发送的结果。
2 添加异步回调函数来监听消息发送的结果,如果发送失败,可以在回调中去重试。
3 produce本身提供一个重试参数retries,如果因为网络问题,或者broker故障导致发送失败,会自动重试。
2 broker端
需要保证producer发送过来的消息不丢失,只需要把消息持久化在磁盘就可以了。但是kafka为了提升性能,采用了异步批量刷盘的机制。也就是按照一定的消息量和时间间隔去刷盘,而最终刷新的这个动作,是靠操作系统来调度的。如果在刷盘之前,系统奔溃了,就会导致数据丢失,kafka没有提供同步刷盘的机制,所以需要通过partition副本机制和acks机制来解决。
prtition副本机制:每一个partition的副本集都包含唯一的一个leader和多个follower。leader专门处理事务类型的请求,follower负责同步leader的数据。
producer可以通过设置acks参数,结合partition的副本机制,来共同保障数据的可靠性。
ack机制:
acks=0:表示producer不需要等待broker的响应,就认为消息发送成功了。这种情况下会存在消息丢失。
acks=1:表示broker中的leader partition收到消息之后,不等待其他follower patition的同步,就给producer返回一个确认。这种情况下,如果leader挂了,就会存在数据丢失。
acks=-1:表示broker中的leader patition收到消息后,并且ISR列表中的follower同步完成,再去给producer返回一个确认。这样是可以保证数据的可靠性的。
3 consumer端
必须能够消费到消息。其实,只要producer和broker的可靠性得到了保障,消费端是不太可能出现消息无法消费的问题的。除非是consumer没有消费完这个消息,就已经提交了offset,但是即使是出现这种情况,我们也可以通过重新调整offset的值来实现重新消费。
本文来自博客园,作者:zhangpba,转载请注明原文链接:https://www.cnblogs.com/zhangpb/p/17164696.html