flink 卡夫卡_卡夫卡–一次语义学

flink 卡夫卡

在分布式环境中,故障是很常见的情况,可以随时发生。 在Kafka环境中,代理可能崩溃,网络故障,处理故障,发布消息时失败或无法使用消息等。这些不同的场景引入了不同类型的数据丢失和重复。

失败场景

A(确认失败):生产者成功发布了消息,重试> 1,但由于失败而未收到确认。 在这种情况下,生产者将重试相同的消息,可能会引入重复消息。

B(生产者进程在批处理消息中失败):生产者发送了一批失败的消息,但发布的成功很少。 在这种情况下,一旦生产者重新启动,它将再次批量重新发布所有消息,这将在Kafka中引入重复消息。

C(触发并忘记失败)生产者发布的消息,重试= 0(触发并忘记)。 如果失败,发布的消息将不知道并发送下一条消息,这将导致消息丢失。

D(批处理消息中的消费者失败)消费者从Kafka接收到一批消息,并手动提交其偏移量(enable.auto.commit = false)。 如果消费者在提交给Kafka之前失败,则下次消费者将再次使用相同的记录,这些记录将在消费者端复制副本。

精确一次语义

在这种情况下,即使生产者尝试重新发送消息,它也导致消息将被消费者发布和消费一次。

为了在Kafka中实现Exactly-Once语义,它使用以下3个属性

  1. enable.idempotence = true(地址a,b和c)
  2. MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION = 5(生产者每次连接总是有一个飞行中请求)
  3. isolated.level = read_committed(地址d)

启用幂等(enable.idempotence = true)

幂等传递使生产者可以在单个生产者的生命周期内,将消息仅一次写入Kafka到主题的特定分区,而不会造成数据丢失和每个分区的订单。

“请注意,启用幂等性要求MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION小于或等于5,RETRIES_CONFIG大于0且ACKS_CONFIG为'all'。 如果用户未明确设置这些值,则将选择合适的值。 如果设置了不兼容的值,将抛出ConfigException”

为了实现幂等性,Kafka在生成消息时使用唯一的ID(称为产品ID或PID和序列号)。 生产者在发布的每个消息上保持递增的序列号,这些消息具有唯一的PID。 代理始终将当前序列号与前一个序列号进行比较,如果新序列号不比上一个序列号大+1,则它会拒绝,这会避免重复;如果消息中丢失了更大的序列号,则会拒绝同时显示

在失败的情况下,代理将序列号与先前的序列号进行比较,如果序列不增加,+ 1将拒绝该消息。

交易(isolation.level)

事务使我们能够自动更新多个主题分区中的数据。 事务中包含的所有记录将被成功保存,或者没有保存成功,它允许您在同一事务中提交消费者补偿以及已处理的数据,从而允许端到端的一次精确语义。

生产者不等待将消息写入到kafka那里,生产者使用beginTransaction,commitTransaction和abortTransaction(在失败的情况下)消费者使用隔离级别。read_committed或read_uncommitted

  • read_committed:使用者将始终仅读取已提交的数据。
  • read_uncommitted:按偏移顺序读取所有消息,而无需等待事务提交

如果具有Isolation.level = read_committed的使用者到达尚未完成的事务的控制消息,则它将直到该生产者提交或中止该事务或发生事务超时之前,不会再从该分区传递任何消息。 事务超时由生产者使用配置transaction.timeout.ms(默认为1分钟)确定。

生产者和消费者中的确切时间

在正常情况下,生产者和消费者是分开的。 生产者必须具有幂等性并同时管理事务,以便消费者可以使用isolation.level读取read_committed来使整个过程成为原子操作。 这样可以确保生产者将始终与源系统同步。 即使生产者崩溃或事务中止,它也始终是一致的,并且一次将消息或一批消息发布为一个单元。

同一用户一次将收到消息或一批消息。

在Exactly-Once中,语义生产者与消费者一起将作为原子操作出现,它将作为一个单元进行操作。 要么发布一次就被消耗掉,要么中止。

在Kafka Stream中恰好一次

Kafka Stream消耗来自主题A的消息,处理并将消息发布到主题B,并在发布后使​​用commit(commit主要在后台运行)将所有状态存储数据刷新到磁盘。

Kafka Stream中的“一次写入”模式是一次“读取-处理-写入”模式,可确保将这些操作视为原子操作。 由于Kafka Stream可以满足生产者,消费者和交易的需求,因此Kafka Stream带有特殊的参数processing.guarantee,它可以完全地_once或at_least_once使得不单独处理所有参数变得容易。

Kafka Streams原子地更新使用者偏移量,本地状态存储,状态存储changelog主题和生产,以一起输出所有主题。 如果这些步骤中的任何一个失败,则所有更改都将回滚。

processing.guarantee:确切地自动提供以下参数,您无需明确设置

  1. isolated.level = read_committed
  2. enable.idempotence = true
  3. MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION = 5

翻译自: https://www.javacodegeeks.com/2020/05/kafka-exactly-once-semantics.html

flink 卡夫卡

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Word中标题、图表自动编号的方法

转自:http://blog.sciencenet.cn/blog-344887-543229.html一般情况下,Word文档需要为标题提供连续编号,默认的标题样式并没有自动编号的功能,系统默认的标题样式效果如下图:正确设置标题自动编号的方法具体步骤如下&am…

java jsp总结

一、jsp简介 JSP(全称Java Server Pages)是由 Sun Microsystems 公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。 JSP 技术是以 Java 语言作为脚本语言的&am…

maven 构建增量包_使用Maven进行增量构建

maven 构建增量包这是2020年,如果您要开始任何新的基于Java的项目,那么gradle应该是第一选择,但是由于某些原因,如果您仍然对Maven感兴趣,那么您可能会发现这篇文章很有用。 Maven Java / scala编译器插件对增量编译提…

带Quarkus的Qute模板

Quarkus附带了自己的模板引擎Qute,该引擎已经包含了一组有趣的功能。 在下面的视频中,我将展示基于动作的MVC与JAX-RS的基本用法,该行为将我们的请求转发到HTML模板。 要自己尝试Qute,请查看以下资源: 示例项目 Qut…

Spring的IoC与DI差异

一、IoC IoC,全称为Inversion of Control,即控制反转。 IoC是依赖倒置原则的一种代码设计思想,把创建对象的权利交给框架,是框架的重要特征。其包括依赖注入(Dependency Injection,简称DI)和依赖…

jvm(3)-垃圾收集器与内存分配策略

【0】README0.1)本文部分文字转自:深入理解jvm,旨在学习 垃圾收集器与内存分配策略 的基础知识;【1】垃圾回收概述1)GC(Garbage Collection)需要完成的3件事情:哪些内容需要回收&…

防火墙例外里没有远程桌面_证明没有例外

防火墙例外里没有远程桌面您如何证明虚无的存在? 你应该? 在我编写的某些测试中,尤其是围绕验证或创建空对象的测试中,我真正想写的是这样的: assertThat( ... call some code ... ) .doesntThrow(); 您可以合理地编…

Java工程师必备技能

一、JavaSE (1)Java基础 1、数据结构 2、算法 3、包装类 4、字符串 5、异常处理 6、类与接口 7、泛型 8、集合 9、IO操作 10、序列化 11、迭代 12、枚举 13、properties 14、压缩 15、日期 (2)Java进阶 1、多线…

打破双亲委派么,怎么打破_打破了vs你错了

打破双亲委派么,怎么打破为微服务构建REST API时,需要做出一些关于响应的设计决策。 某些响应显然是微服务周围协议的产物-例如3xx代码之类的东西都与重定向和路由有关。 通常,您将尝试获取正确的2xx代码以取得成功。 如有疑问,将为200&…

java如何查看调用记录_查看Java记录

java如何查看调用记录JEP 359 (可在JDK 14中用作预览功能)将记录引入Java。 记录是对普通数据聚合建模的简单方法。 一个简单的范围记录如下所示: record Range( int from, int to) {} 记录定义实际上与具有以下内容的最终类相同&#xff1…

递归 反转字符串_使用递归反转字符串

递归 反转字符串1.简介 在本文中,您将学习如何使用递归方法来反转字符串。 第一个程序是反转字符串,第二个程序将读取用户的输入。 在之前的文章中,我已经展示了如何不使用任何内置函数来反转字符串,以及如何反转字符串中的单词 …

jvm(4)-虚拟机性能监控与故障处理工具

【0】README0.1)本文文字描述转自 “深入理解jvm”,旨在了解 虚拟机性能监控与故障处理工具的基础知识(仅仅在于了解); 【1】概述1)给一个系统定位问题的时候,知识,经验是关键基础&a…

代码大全和新月神话_神话般的代码

代码大全和新月神话考虑以下代码段: int max 10; int a 0; while (true) {// do a thing that may result in an early return if (a > max) {break;} }throw new RuntimeException("It ran out of attempts");上面有一些WTF。 循环有点不可思议&am…

Spring 思维导图,让 Spring 不再难懂(cache篇)

转载自: java思维导图 开源中国关于缓存缓存是实际工作中非常常用的一种提高性能的方法。而在java中,所谓缓存,就是将程序或系统经常要调用的对象存在内存中,再次调用时可以快速从内存中获取对象,不必再去创建新的重…

动手学习_动手选择值

动手学习由于冠状病毒的存在,可选的东西在空中,一切都变得可选,例如可选的公共聚会,可选的在家工作,可选的旅行等。 我现在是时候谈论处理NULL引用的软件工程中真正的“ 可选 ”了。 托尼霍尔(Tony Hoare…

JVM菜鸟进阶高手之路

本文转载自公众号 匠心零度问题现象 代码如下,使用 ParNew Serial Old 回收器组合与使用 ParNew CMS 回收器组合时,结果为什么差异如此之大 ?private static final int _1MB 1024 * 1024;public static void main(String[] args) throws …

事务的状态(状态模式)

【0】README0.1)本文部分文字描述转自 “head first设计模式”,旨在学习 事务的状态(状态模式) 的基础知识;【1】应用场景一1.1)还记得成都市各大高校内的米源自动售卖机吗?售卖机的主要制造商…

ogm neo4j_Neo4J OGM与Quarkus

ogm neo4j在下面的视频中,我演示了一个使用Neo4J数据库和Neo4J OGM的Quarkus应用程序示例。 看一下GitHub上的示例项目 。 我为咖啡豆创建了一个示例域,其中包含我们可以查询和匹配的某些风味配置文件。 红色节点是来自某个国家/地区的咖啡豆&#xff…

什么是ThreadLocal

本文转载自 占小狼的博客前言在面试环节中,考察"ThreadLocal"也是面试官的家常便饭,所以对它理解透彻,是非常有必要的. 有些面试官会开门见山的提问: “知道ThreadLocal吗?”“讲讲你对ThreadLocal的理解”…

Java bytecode instruction listings

【0】README 0.1)these contents are shiped from https://en.wikipedia.org/wiki/Java_bytecode_instruction_listings Mnemonic Opcode (in hexadecimal) Opcode (in binary) Other bytes Stack [before]→[after] Description(no name)cb-fd these values ar…