【博学谷学习记录】超强总结,用心分享|Kafka如何保证数据不丢失

【博学谷学习记录】超强总结,用心分享|Kafka如何保证数据不丢失

Kafka如何保证数据不丢失

1 生产端如何保证数据不丢失

在这里插入图片描述
当生产者将数据生产到Broker后,Broker会给予一个ack确认响应,在Kafka中, 主要提供了三种ack的方案:
(1)0:生产者只管发送数据,不关心且不接受Broker的相应;
(2)1:生产者将数据发送到Broker端,需要等待Broker端对应的topic上的对应的分片的主副本接收到消息后, 才认为发送成功;
(3)-1(ALL):生产者将数据发送到Broker端,需要等待Broker端对应的topic上的对应的分片的所有的副本接收到消息后, 才认为发送成功。

从效率角度来看:0 > 1 > -1
从安全角度来看:-1 > 1 > 0
注意:在实际开发应用中,一般根据数据的重要程度来选择采用什么方案,如果数据非常重要,则认为不能丢失,一般设置成-1。

2 生产端如何保证数据不丢失-相关思考

思考1:如果Broker 一直没有给ack响应,如何解决?
解决方案:设置超时时间,如果超时则触发重试策略,如果多次重试依然无法给予响应,此时程序报异常。

思考2:每发送一次,Broker就要给予一次响应,请问这样是否会对网络带宽产生影响呢? 如果产生, 如何解决呢?
解决方案:会,引入缓存池,满足了一批数据后,异步发送给Broker端,Broker端只需要针对这一批数据给予一次响应即可。

思考3:通过一批一批的异步发送方式, 如果Broker端对这一批数据没有给予响应,但是缓存池中数据已经满了,如何解决?
解决方案:选择清空缓存池 / 不清空,如果数据是可重复读的,那么直接让程序报错即可,通知处理。处理后,重新获取发送即可,如果数据是不可重复读,为了避免此种问题,我们可以数据先在某个其他位置保存(备份),当数据生产成功,删除对应的数据,生产不成功,,后续直接从保存的位置中获取生产即可。

buffer.memory : 缓存池的大小 
       默认值:  33554432(32M)

retries: 重试次数
       默认值: 2147483647 (此参数并不代表最终的重试次数, 取决于超时相关参数)

delivery.timeout.ms: 一次发送数据总超时时间
       默认值: 120000(120s)

request.timeout.ms: 一次请求超时时间
       默认值: 30000(30s)

一批数据的阈值: 时间 和 大小
batch.size : 一批数据大小  
       默认值: 16384 (16kb)

linger.ms : 每一批次的间隔时间
        默认值:  0

3 Broker端如何保证数据不丢失

保证方案: 磁盘存储 + 多副本 + ack为-1

4 消费端如何保证数据不丢失

在这里插入图片描述

第一步: 当Consumer启动后,连接Kafka集群,根据group.id 到Kafka中寻找上一次消费到了什么位置(偏移量);
第二步: 
       如果consumer找到了上次消费位置,接着从这个位置开始消费数据;
       如果没有找到上一次消费的位置,说明第一次来,这个时候默认从当前时刻开始消费数据,消费的位置也会从当前这个消息的偏移量位置开始消费;
       
第三步: 消费者开始消费数据,在消费的过程中,每消费完数据后,都要和kafka集群进行汇报,汇报当前消费到了那一个偏移量信息。

汇报方式: 自动 / 手动
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值