kafka如何保证数据不被重复消费并且不丢失数据

Kafka如何保证数据不重复消费,不丢失数据

不重复消费:

1.幂等操作,重复消费不会产生问题

2. dstream.foreachRDD {(rdd, time) =

  rdd.foreachPartition { partitionIterator =>

    val partitionId = TaskContext.get.partitionId()

    val uniqueId = generateUniqueId(time.milliseconds,partitionId)将uniqueID存入数据库中

    //use this uniqueId to transationally commit the data in partitionIterator

 }

}

对每个partitionID,产生一个uniqueID,.只有这个partition的数据被完全消费,才算成功,否则失败回滚。下次若重复执行,就skip

 

不丢失数据:丢失情况: 
1.生产者数据不丢失
      同步模式:配置=1(只有Leader收到,-1所有副本成功,0不等待)。leader partition挂了,数据就会丢失。
                  解决:设置为-1保证produce写入所有副本算成功
          producer.type=sync
          request.required.acks=-1
      异步模式,当缓冲区满了,如果配置为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
2.消费者数据不丢失 :流计算,基本数据源不适用。高级数据源以kafka为例,由2种方式:receiver(开启WAL,失败可恢复)和director(checkpoint保证)
3.   若是storm在消费,开启storm的ackfail机制;若不是storm,数据处理完更新offset,低级API手动控制offset
4.   Kafka发送数据过快,导致服务器网卡流量暴增。或磁盘过忙,出现丢包。
      1》  首先,对kafka进行限速,
      2》  其次启用重试机制,使重试间隔变长。
      3》  Kafka设置ack=all,即需要处于ISR(副本列表)的分区都确认,才算发送成功。    rops.put("compression.type", "gzip");
               props.put("linger.ms", "50");
               props.put("acks", "all")表示至少成功发送一次;
               props.put("retries ", 30);
               props.put("reconnect.backoff.ms ", 20000);

               props.put("retry.backoff.ms", 20000)

 5.消费者速度很慢,导致一个session周期(0.1版本是默认30s)内未完成消费。导致心跳机制检测报告出问题。

   导致消费了的数据未及时提交offset.配置由可能是自动提交

            问题场景:1.offset为自动提交,正在消费数据,kill消费者线程,下次重复消费

         2.设置自动提交,关闭kafka,close之前,调用consumer.unsubscribed()则由可能部分offset没有提交。

              3.消费程序和业务逻辑在一个线程,导致offset提交超时,

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1/kafka是一个分布式的消息缓存系统 2/kafka集群中的服务器都叫做broker 3/kafka有两类客户端,一类叫producer(消息生产者),一类叫做consumer(消息消费者),客户端和broker服务器之间采用tcp协议连接 4/kafka中不同业务系统的消息可以通过topic进行区分,而且每一个消息topic都会被分区,以分担消息读写的负载 5/每一个分区都可以有多个副本,以防止数据丢失 6/某一个分区中的数据如果需要更新,都必须通过该分区所有副本中的leader来更新 7/消费者可以分组,比如有两个消费者组A和B,共同消费一个topic:order_info,A和B所消费的消息不会重复 比如 order_info 中有100个消息,每个消息有一个id,编号从0-99,那么,如果A组消费0-49号,B组就消费50-99号 8/消费者在具体消费某个topic中的消息时,可以指定起始偏移量 每个partition只能同一个group中的同一个consumer消费,但多个Consumer Group可同时消费同一个partition。 n个topic可以被n个Consumer Group消费,每个Consumer Group有多个Consumer消费同一个topic Topic在逻辑上可以被认为是一个queue,每条消费都必须指定它的Topic,可以简单理解为必须指明把这条消息放进哪个queue里。为了使得Kafka的吞吐率可以线性提高,物理上把Topic分成一个或多个Partition,每个Partition在物理上对应一个文件夹,该文件夹下存储这个Partition的所有消息和索引文件。若创建topic1和topic2两个topic,且分别有13个和19个分区 Kafka的设计理念之一就是同时提供离线处理和实时处理。根据这一特性,可以使用Storm这种实时流处理系统对消息进行实时在线处理,同时使用Hadoop这种批处理系统进行离线处理,还可以同时将数据实时备份到另一个数据中心,只需要保证这三个操作所使用的Consumer属于不同的Consumer Group即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值