zoukankan      html  css  js  c++  java
  • Kafka 之 如何保证数据不丢失?不重复?

    见:https://www.cnblogs.com/sabertobih/p/14092290.html

    数据不丢失

    1)从生产端:acks = -1,(ack应答机制)从生产端到节点端,当所有isr集合里的节点备份完毕后返回成功;

    2)从节点端:每个partition至少需要一个isr节点(同步)存活保证数据安全

    3)从消费端:关闭自动提交,使用手动提交。

    数据不重复消费

    1)生产端

    生产者幂等性实现:PID和Sequence Number
    为了实现Producer的幂等性,Kafka引入了Producer ID(即PID)和Sequence Number。 PID:每个新的Producer在初始化的时候会被分配一个唯一的PID,这个PID对用户是 不可见的。
    Sequence Numbler:(对于每个PID,该Producer发送数据的每个<Topic, Partition> 都对应一个从0开始单调递增的Sequence Number。
    Broker端在缓存中保存了这seq number,对于接收的每条消息,如果其序号大于Broker 缓存中序号则接受它,否则将其丢弃。这样就可以避免消息重复提交了。

    但是,只能保证单个Producer对于同一个<Topic, Partition>的Exactly Once语义。不能保证同一个Producer一个topic不同的partion幂等。

    2)消费端

    消费者幂等处理:

    1.将消息的offset存在消费者应用中或者第三方存储的地方
    可以将这个数据存放在redis或者是内存中,消费消息时,如果有这条数据的话,就不会去做后续操作
    2.数据落库的时候,根据主键去过滤
    在落库时,如果不不在这条数据,则去新增,如果存在则去修改

    如果不能幂等处理,则将consumer的提交方式设置为同步提交,是最大程度地保证一致性的方法,缺点是性能会降低很多。

  • 相关阅读:
    线程3 线程池和文件下载服务器
    线程 2
    线程 1
    线程间操作
    编写高质量的代码-------从命名开始
    基于.NET平台常用的框架整理
    消息队列
    我是一个线程
    linux 网络命令
    css hack比较全 --- 转
  • 原文地址:https://www.cnblogs.com/sabertobih/p/14106827.html
Copyright © 2011-2022 走看看