kafka如何保证数据不丢失

生产者数据不丢失

       生产者发送数据有同步方式和异步方式,先来看一下生产者一些关键配置项,

       同步方式下配置

producer.type=sync 
request.required.acks=1

       在同步方式下发送数据,在发送的时候会产生阻塞,等待ack反馈,acks有三个参数0, 1,all,acks参数设置为0表示不等待反馈,表示不需要等待kafka完成同步确认接收消息,风险很大,数据可能丢失,设置为1表示必须kafka集群中的leader节点接收到消息并确认当前的生产者可以发送下一条消息,但是如果这个时候leader挂掉了,集群中尚未完成其他机器的同步,这时候导致数据丢失,设置为all表示等待kafka集群所有节点反馈,可以保证不丢失数据,三种参数的性能上有差异,比如一些允许丢失的消息,又想提升吞吐量,可以配置成0

       异步方式下配置

producer.type=async 
request.required.acks=1 
queue.buffering.max.ms=5000 
queue.buffering.max.messages=10000 
queue.enqueue.timeout.ms = -1 
batch.num.messages=200

       producer.type=async表示异步方式

       request.required.acks=1表示leader接收到消息并反馈 上面的这些参数其他值已经解释了

       queue.buffering.max.ms=5000表示异步模式下缓冲数据的最大时间。例如设置为100则会集合100ms内的消息后发送,这样会提高吞吐量,但是会增加消息发送的延时

       queue.buffering.max.messages=10000表示异步模式下缓冲的最大消息数,同上

       queue.enqueue.timeout.ms=-1表示异步模式下,消息进入队列的等待时间。若是设置为0,则消息不等待,如果进入不了队列,则直接被抛弃

       batch.num.message=200表示异步模式下,每次发送的消息数,当queue.buffering.max.messages或queue.buffering.max.ms满足条件之一时producer会触发发送

通过以上配置能保证同步或者异步的情况下生产者不丢失数据

 

消费者数据不丢失

       kafka里面一个主题可以有多个分区,一个分区同时只能被同一个消费者组中的一个消费者消费,消费者组可能包含多个消费者,消费者组下面会记录某个主题某个分区的offset值,来记录消费的到哪里

       具体偏移量可以在zk中输入指令,后面的 get /kafka/consumers/(消费者组)/offsets/(主题)/(分区)

       下面看一下消费者的配置

#是否自动提交  如果设置成false需要手动提交
auto.commit.enable = true
# 自动提交的时间间隔
auto.commit.interval.ms = 60 * 1000

       如果是设置自动提交,会在 consumer.poll()方法之后自动提交偏移量,这种情况可能导致在取得数据之后,自动提交了偏移量,然后在应用中处理业务的时候事物失败了,导致丢失数据,offset值又加1了,那么下次消费的时候就丢失了数据,如果对于允许丢失的数据,比如日志生成环境N多个集群对接的日志服务系统,使用kafka作为消息中间件,日志这种可以允许丢失的话设置为自动提交无所谓,如果对于数据一定不能丢失,这里需要配置为false,调用kafka提供的API手工提交

       虽然可以设置为手工提交,但是好像并不能保证数据库事物与offset一起提交成功,因为 手工提交之后offset变了,但是最后面执行数据库事物操作异常了,这种情况下又感觉消费者数据丢失了,那么这种情况下如何保证消费者不重复消费数据或者,一定保证提交偏移量的数据消费了?

       下面有一种办法,就是把主题,分区,消费者组,offset这些关系存到数据库当中,消费者每次取数据的时候设置一下偏移量,调用消费的seek()方法,这些API可以具体参考kafka的文档,让保存偏移量和应用的事物保持一致就行,具体需不需要这些场景根据业务情况而定

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值