Kafka之精确一次处理语义

【kafka系列】At Least Once语义 通过合理配置和业务设计,At-Least-Once可平衡可靠性与性能,是大多数场景的推荐选择。若Broker写入成功但网络超时,生产者重试会导致消息重复发送到Topic。失败(如消费者崩溃),下次启动时会重新拉取并处理同一消息,导致积分重复增加。复杂(需生产者、Broker、消费者协同)允许重复的业务(如日志采集)高(事务与协调开销) 阅读详情

 

 

文章目录

 

精确一次处理语义

  1. 消息处理语义

    • 最多一次(at most once):消息可能丢失也可能被处理,但最多只会处理一次
    • 至少一次(at least once):消息不会丢失,但可能被处理多次
    • 精确一次(exactly once):消息被处理且只会被处理一次
  2. producer:

    • 在0.11.0.0之前,kafka producer默认提供至少一次(at least once)语义(重试机制)
    • kafka在0.11.0.0开始引入producer精确一次性语义EOS(exactly-once semantics)。即瞬时发送错误导致的producer重试,在broker端这条消息只会被写入日志一次。如果要启用幂等性producer以及获取EOS语义,需要显示设置producer参数enable.idempotence=true
  3. consumer:

    • 最多一次(at most once): consumer首先获取消息,然后提交offset,之后再处理消息。当提交offset后,consumer崩溃,消息可能永远不会被处理,即消息丢失
    • 至少一次(at least once):consumer先获取消息,然后处理消息,最后提交offset。当消息处理完,consumer崩溃,此时可能会重复处理
  4. 案例

    
    @Test
    public void testIdempotence() {
        Properties props = new Properties();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka-master:9092,kafka-slave1:9093,kafka-slave2:9094");
        props.put(ProducerConfig.ACKS_CONFIG, "all");
        props.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "lz4");
        props.put(ProducerConfig.RETRIES_CONFIG, "10");
        //开启幂等性
        props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true);
        props.put(ProducerConfig.RETRY_BACKOFF_MS_CONFIG, "1000");
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
    
        KafkaProducer<Integer, String> producer = new KafkaProducer<>(props);
        String topic = "testTopic";
        for (int i = 0; i < 100; i++) {
            String messageStr = "hello world " + i;
            ProducerRecord producerRecord = new ProducerRecord(topic, null, messageStr);
            producer.send(producerRecord, (recordMetadata, e) -> {
                if (e != null) {
                    if (e instanceof RetriableException) {
                        //处理可重试瞬时异常
                    } else {
                        //处理不可重试瞬时异常
                        logger.error(e.getMessage(), e);
                    }
                }
                if (recordMetadata != null) {
                    logger.info(ToStringBuilder.reflectionToString(recordMetadata));
                }
            });
        }
        producer.close();
    }
    

幂等性实现原理

  1. 实现原理

    • Producer发送到broker端的每批消息都会被赋予一个序列号用于去重,从0开始严格单调递增。

    • 每个Producer实例都有一个producer ID,producer在初始化时必须分配一个producer ID(每个topic每个分区都有自己的序列号)

    • broker会将序列号与消息一起保存在日志中。这样即使leader副本挂掉,新选择的leader也能执行消息去重

    • 如果发送消息的序列号小于或者等于broker端保存的序列号,那么broker会拒绝这条消息的写入操作

  2. kafka以上的设计确保了即使出现重试操作,每条消息也仅仅在日志中保存一次。不过由于每个新的producer实例都会有不同的producer ID,同一个分区下序列化是递增的,所以只能保证单个producer实例的EOS语义,无法保证多个producer实例一起提供EOS语义,只能保证单个topic 分区的幂等性

流处理平台Kafka--消息队列 1 Kafka是什么 Kafka是一个基于ZooKeeper协调的流处理平台,它由Scala和Java开发,可以实时处理大量数据,并且可以方便的扩展。Kafka由LinkedIn开发,并由LinkedIn在2010年贡献给Apache基金会,成为顶级开源项目。这篇文章主要是一些关于其核心组件消息队列的内容。 2 Kafka的特性 持久化:Kafka的消息实时持久化,允许数据在不同的broker上做备份,提高了安全性,并且不会因为消息已消费而被删除。 高吞吐量:Kafka每秒可以处理数十万条消息。 可扩展: 阅读详情

相关推荐

一碰就头疼的 Kafka 消息重复问题,立马解决!

数据重复这个问题其实也是挺正常,全链路都有可能会导致数据重复。通常,消息消费时候都会设置一定重试次数来避免网络波动造成的影响,同时带来副作用是可能出现消息重复。遇到异常,基本解决措施都是重试。leader分区不可用了,抛异常,等待选出新leader分区。Controller所在Broker挂了,抛异常,等待Controller重新选举。场景三:网络异常、断网、网络分区、丢包等,抛异常,等待网络恢复。poll一批数据,处理完毕还没提交offset,机子宕机重启了,又会poll。

m0_71777195的博客 1493

Kafka核心原理之精准一次性投递

在Kafka中,精准一次性投递(Exactly Once)=至少投递一次(At Least Once)+幂等性。至少投递一次(At Least Once):将生产端参数acks设置为-1(all),可以保证生产端发送到Broker的消息不会丢失,即:至少投递一次(At Least Once)。

南秋同学的博客 2353

电力电子技术速通复习

一种完全纯净,结构完整的半导体晶体,其含有两种载流子而且,自由电子的浓度和空穴的浓度总是相等,一般情况下,在硅晶体中掺入P(磷)五价元素,多子为自由电子,少子为空穴;在硅晶体中掺入B(磷)三价元素,多子为空穴,少子为自由电子;6.PN结具有单相导电性,PN结具有雪崩击穿(T越高,击穿电压越大)和齐纳击穿(T越高,击穿电压越小),均可逆,热击穿不可逆;PN结具有电容效应,势垒电容(耗尽层变化等效的电容)扩散电容(非平衡少子引起的电荷量的变化等效出来的电容效应)

qq_62873973的博客 2507

干货:Flink+Kafka 0.11端到端精确一次处理语义实现

干货:Flink+Kafka 0.11端到端精确一次处理语义实现 2018年08月03日 00:00:00Spark高级玩法阅读数:1566 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/rlnLo2pNEfx9c/article/details/81369878 实时处理里消息的仅一次处理是大家关注的重点吧,前面浪尖分享过一篇对...

大JAVA解决方案 1136

XCP_Basic 移植步骤

XCP_Basic 移植步骤

ggzzc的博客 2319

从零玩转显示屏:手把手教你用Arduino驱动SPI屏幕(附引脚定义图)

本文提供了一份详尽的Arduino驱动SPI屏幕的入门指南。从SPI接口的核心引脚定义(如DC、RESET)与RGB接口的区别讲起,手把手指导硬件连接与软件库配置,并最终通过一个天气显示器实战项目,帮助读者掌握驱动SPI屏幕、显示RGB色彩内容的核心技能。

weixin_29189987的博客 132

Kafka-精确处理一次语义

常见的消费处理语义有3种: 最多一次(at most once):消息可能会丢失,但绝不会被重复发送。 至少一次(at least once):消息不会丢失,但有可能被重复发送。 精确一次(exactly once):消息不会丢失,也不会被重复发送。 Kafka 默认提供的交付可靠性保障是第二种,即至少一次。 Kafka 也可以提供最多一次交付保障,只需要让 Producer 禁止重试即可。这样一来,消息要么写入成功,要么写入失败,但绝不会重复发送。 Kafka 是怎么做到精确一次的呢?简单来说,这是通

weixin_42560294的博客 590

NSGA(非支配排序遗传算法)

在多目标优化问题中,往往存在多个相互冲突的目标需要同时优化。传统的单目标优化算法无法直接应用于这类问题,因此需要专门的多目标优化算法。非支配排序遗传算法(Non-dominated Sorting Genetic Algorithm,NSGA)是一种经典的多目标优化算法,由印度科学家 Kalyanmoy Deb 等人于 1995 年提出。NSGA 通过非支配排序和拥挤度距离来引导种群向 Pareto 最优前沿进化,从而得到一组具有良好分布性和收敛性的 Pareto 最优解。

2979

kafka实现无消息丢失与精确一次语义(exactly once)处理

在很多的流处理框架的介绍中,都会说kafka是一个可靠的数据源,并且推荐使用Kafka当作数据源来进行使用。这是因为与其他消息引擎系统相比,kafka提供了可靠的数据保存及备份机制。并且通过消费者位移这一概念,可以让消费者在因某些原因宕机而重启后,可以轻易得回到宕机前的位置。 但其实kafka的可靠性也只能说是相对的,在整条数据链条中,总有可以让数据出现丢失的情况,今天就来讨论如何避免kafka数...

zzzzMing -大数据/数据分析/数据挖掘 645

从毫米波到计算机视觉:智能座舱监控系统的多模态技术融合

本文探讨了智能座舱监控系统中多模态技术融合的创新应用,涵盖毫米波雷达、红外传感与计算机视觉的协同架构。通过传感器时空对齐、低光照算法突破及隐私保护设计,系统在DMS、OMS等场景实现99.7%的检测准确率,同时优化成本至$45以内,为汽车智能化提供关键技术支撑。

d6e7f8的博客 904

基于python的电商评论文本分析

本文基于京东平台安井手抓饼2000余条评论数据,运用Python文本分析技术(包括分词、词频统计、LDA主题模型等)探究消费者评价特征。研究发现:1)产品评价聚焦口味("好吃")、性价比("一分钱")和便捷性("早餐");2)京东物流服务获得高度认可;3)销售旺季集中在11月至次年1月。分析揭示了速冻食品消费者的核心关注点,为商家优化产品与服务提供数据支持,同时展示了文本挖掘技术在电商评论分析中的实用价值。

weixin_50902344的博客 8348

Apache Kafka Streams 入门指南:用客户端库构建弹性、有状态、精确一次语义的实时流处理应用

Kafka Streams 是 Apache Kafka 提供的一个**客户端库**,用于构建输入/输出数据都存储在 Kafka 集群中的应用与微服务。它把"编写并部署标准 Java / Scala 客户端程序"的简单性,与 Kafka 服务端集群技术的弹性、可扩展、容错能力结合到了一起,是当前 Kafka 生态中编写生产级实时流处理应用最直接的方式之一。读完本文,你将掌握 Kafka Strea

gitblog_00226的博客 623

FPGA 学习笔记:Vivado 配置IO引脚约束

FPGA 学习笔记:Vivado 配置IO引脚约束

坚韧与专注 2万+

Flink + Kafka 0.11端到端精确一次处理语义的实现

2017年12月Apache Flink社区发布了1.4版本。该版本正式引入了一个里程碑式的功能:两阶段提交Sink,即TwoPhaseCommitSinkFunction。该SinkFunction提取并封装了两阶段提交协议中的公共逻辑,自此Flink搭配特定source和sink(特别是0.11版本Kafka)搭建精确一次处理语义(下称EOS)应用成为了可能。作为一个抽象类,TwoPha...

张伯毅的专栏 1221

华为OD机试 - 机器人活动区域(Python/JS/C/C++ 双机位C卷 200分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。现有一个机器人,可放置于 M × N的网格中任意位置,每个网格包含一个非负整数编号。当相邻网格的数字编号差值的绝对值小于等于 1 时,机器人可在网格间移动问题:求机器人可活动的最大范围对应的网格点数目。说明:1)网格左上角坐标为 (0, 0),右

学Java,找哪吒 1435

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Kafka设计解析(二十二)Flink + Kafka 0.11端到端精确一次处理语义的实现

转载自huxihx,原文链接【译】Flink + Kafka 0.11端到端精确一次处理语义的实现 本文是翻译作品,作者是Piotr Nowojski和Michael Winters。前者是该方案的实现者。 原文地址是An Overview of End-to-End Exactly-Once Processing in Apache Flink® (with Ap...

dlx29376的博客 228

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

flink checkpoint 恢复_干货:Flink+Kafka 0.11端到端精确一次处理语义实现

2017年12月Apache Flink社区发布了1.4版本。该版本正式引入了一个里程碑式的功能:两阶段提交Sink,即TwoPhaseCommitSinkFunction。该SinkFunction提取并封装了两阶段提交协议中的公共逻辑,自此Flink搭配特定source和sink(特别是0.11版本Kafka)搭建精确一次处理语义(exactly-once semantics)应用...

weixin_31192609的博客 724

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【译】Flink + Kafka 0.11端到端精确一次处理语义的实现

本文是翻译作品,作者是Piotr Nowojski和Michael Winters。前者是该方案的实现者。 原文地址是https://data-artisans.com/blog/end-to-end-exactly-once-processing-apache-flink-apache-kafka 2017年12月Apache Flink社区发布了1.4版本。该版本正式引入了一个里程碑式的功能...

weixin_33836874的博客 566

kafka(十五)实现无消息丢失与精确一次语义(exactly once)处理

kafka实现无消息丢失与精确一次语义(exactly once)处理

qq_41982570的博客 687

Kafka 消息交付可靠性保障以及精确处理一次语义的实现。

所谓的消息交付可靠性保障,是指 Kafka 对 Producer 和 Consumer 要处理的消息提供什么样的承诺。常见的承诺有以下三种: 最多一次(at most once):消息可能会丢失,但绝不会被重复发送。 至少一次(at least once):消息不会丢失,但有可能被重复发送。 精确一次(exactly once):消息不会丢失,也不会被重复发送。 目前,Kafka 默认提供的交付可靠性保障是第二种,即至少一次。 只有 Broker 成功“提交”消息且 Producer 接到 Broker

qq_3316359388的博客 315

Flink+Kafka 0.11端到端精确一次处理语义实现

2017年12月Apache Flink社区发布了1.4版本。该版本正式引入了一个里程碑式的功能:两阶段提交Sink,即TwoPhaseCommitSinkFunction。该SinkFunction提取并封装了两阶段提交协议中的公共逻辑,自此Flink搭配特定source和sink(特别是0.11版本Kafka)搭建精确一次处理语义( exactly-once semantics)应用成为了可能...

ChengYanan的博客 928

Kafka学习笔记:Kafka 消息交付可靠性保障以及精确处理一次语义的实现

幂等性 Producer 只能保证单分区、单会话上的消息幂等性;而事务能够保证跨分区、跨会话间的幂等性。 所谓的消息交付可靠性保障,是指 Kafka 对 Producer 和 Consumer 要处理的消息提供什么样的承诺。 常见的承诺有以下三种: 最多一次(at most once):消息可能会丢失,但绝不会被重复发送。 至少一次(at least once):消...

张伯毅的专栏 3123

Kafka消息交付可靠性保障以及精确处理一次语义的实现

kafka对producer和consumer要处理的消息提供3中承诺: at most once: 最多一次,消息可能会丢失,不会重复发送 at least once: 至少一次,消息不会丢失,可能重复发送。Kafka 默认这种方式,当网络瞬时抖动,broker的应答无法成功发送给producer端,那么producer不确定消息写入是否成功,会选择重新发送一次。 exactly once...

异度空间 602
上一篇: Flink基于Kafka-Connector 数据流容错回放机制
下一篇: kafka怎么保证数据消费一次且仅消费一次?
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值