14 幂等生产者和事务生产者

kafka消息交付可靠性保障和精确一次语义处理

消息交付可靠性保障,指的kafka对Producer和Consumer要处理的消息提供什么样的承诺。总共就三种:at most once 、at least once、axactly once
kafka默认提供的是 at least once。原因是只有Broker提交消息并且Producer收到Broker的应答才会认为该消息已经成功发送,如果应答的过程网络抖动了,则生产者没有收到应答只能选择重试。
kafka可以提供 exactly once,通过幂等生产者或者事务生产者实现。

幂等性

幂等性操作可以安全地重试而不会破坏系统状态。如果是非幂等性操作,还要担心多次执行对系统状态的影响。

幂等性Produder

开启:props.put(“enable.idempotence”, ture)
原理:空间换时间的思路。在Broker端多保留一些字段,在Producer发送了具有相同字段的消息后,将重复的消息“丢弃”。大致这么理解,原理还需要深究。
局限性
1.只能保证单分区的幂等性,即只能保证某个主题的某个分区上不出现重复的消息。无法实现多个分区的幂等性。
其实这里指的应该是不能保证消息原子性写入到多个分区(一批消息要么全部写入成功,要么全部失败)?看了后面的评论感觉是的。
一个幂等的Producer,保证单分区的幂等性,Producer消息会发给主题的多个分区,每个分区都保证幂等性,实际上就是实现了多分区的幂等性。
2.不能实现跨会话的幂等性。会话可以理解为Producer的一次运行。
重启后producer进程的PID就变化了,broker就不认识了。想要broker能够认识,就需要做更多事情,也就是kafka事务做的事情。

事务Producer

数据库安全特性ACID,I指的是隔离性,即并发执行的食物彼此隔离互不影响。隔离级别中,read commited指的是读取数据库只能读取已提交的消息,写数据只能覆盖已提交的消息。

kafka提供事务的支持,主要是在read commited隔离级别。事务Producer提供了两个特性:
1.保证一批消息原子性写入多个分区,要么全部成功,要么全部失败。

producer.initTransactions();
try {producer.beginTransaction();producer.send(record1);producer.send(record2);producer.commitTransaction();
} catch (KafkaException e) {producer.abortTransaction();
}

record1和record2当作一个事务提交到kafka

2.Producer重启,kafka依然能保证它发送消息的精确一次处理。

使用
Producer端

  • 开启 enable.idempotence = true
  • 设置Producer参数transaction.id
  • 在Producer中显式调用事务API
    Consumer端
  • 设置参数isolation.level为read_committed。如果设置为read_uncommitted,则Consumer可以读取所有消息,包括事务成功和事务中指写入的消息(无论事务成功失败都会写入消息,kafka事务失败不会回滚,写入日志是append-only风格)。当然事务Consumer是能看到非事务Producer的所有消息的。

评论区精选

1.对kafka事务的其他描述:能够保证一条消息仅仅保存在kafka的某一分区上,不会出现在多个分区上。另外能保证多条消息原子性发送到多个分区。也就是只保证Producer到Kafka Broker的消息不重复不丢失。
2.如何保证消费者精确一次消费:kafka事务只保证Producer到Kafka Broker的消息不重复不丢失,Consumer端由于提交偏移量和消息处理的顺序有前有后,依然可能导致重复消费或者消息丢失,如果要实现消费者端精确一次消费,还需要额外的机制实现偏移量提交和消息消费的事务处理。

重复消费例子:Consumer端处理逻辑比较重超时没提交ACK(比如顺序是改库-远程调用-提交偏移量,远程调用超时了),但是处理逻辑已经执行了,下次重新消费还会消费到重复的数据,所以业务上要做幂等。

消息丢失例子:先提交偏移量在处理消息,处理消息过程发生异常。

3.事务Producer是怎么实现多分区以及多会话上的消息无重复(原理)?
主要机制是两阶段提交(2PC)。引入事务协调器帮助完成分布式事务。

4.不启用幂等也能保证同分区下无消息乱序的方法。比如消息发送失败重发,会导致在broker的消息顺序和producer发送消息的顺序不一样。max.in.flight.requests.per.connection = 1来实现。这样producer会等待之前请求的消息发送成功才会发送下一个(对吞吐量的影响?)

5.producer retry会保证消息发送到同一个分区,不然幂等性无法保障。

6.幂等kafka有局限性,说明kafka不能完全保证消费者重复消费,最好使用业务去重。即使consumer读到了事务消息,但还是可能由于rebalance等原因导致重复消费

7.“那么你可能会问,如果我想实现多分区以及多会话上的消息无重复,应该怎么做呢?答案就是事务(transaction)或者依赖事务型 Producer。这也是幂等性 Producer 和事务型 Producer 的最大区别!”这句话的意思是说事务本身已经保证了事务内所有消息的幂等性了么?
答曰事务提供的一致性要高于幂等性

8.我理解幂等是保证消息不重复,事务是保证“批量消息”原子性写入不丢失。因为kafka本身已经保证当broker响应peoducer已提交后消息不丢失,如果我没有批量写入需求,是否就单独通过幂等保证精确一次呢
答曰依然不能保证多个分区同时写入消息的事务性

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

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

相关文章

【广州华锐互动】人体血管器官3D动态展示为医学生提供哪些便利?

人体血管器官3D动态展示是一种采用先进的计算机图形技术和立体成像技术,对人体内部结构和功能进行三维可视化的教学方法。这种教学方式以其独特的优势,正在改变传统的解剖学教学模式,为医学教育带来了革新。 首先,3D动态演示能够提…

基于nodejs+vue网课学习平台

各功能简要描述如下: 1个人信息管理:包括对学生用户、老师和管理员的信息进行录入、修改,以及老师信息的审核等 2在库课程查询:用于学生用户查询相关课程的功能 3在库老师查询:用于学生用户查询相关老师教学的所有课程的功能。 4在库学校查询:用于学生用户查询相关学…

解密JavaScript的异步机制:打破单线程限制,提升性能与用户体验

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 一、JavaScript的异步编步机制 二、事件循环…

剑指offer(C++)-JZ50:第一个只出现一次的字符(算法-其他)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 在一个长为 字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分…

SpringBoot面试题7:SpringBoot支持什么前端模板?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:SpringBoot支持什么前端模板? Spring Boot支持多种前端模板,其中包括以下几种常用的: Thymeleaf:Thymeleaf是一种服务器端Java模板引擎,能够…

SSM - Springboot - MyBatis-Plus 全栈体系(三十)

第七章 MyBatis-Plus MyBatis-Plus 高级用法:最优化持久层开发 一、MyBatis-Plus 快速入门 1. 简介 版本:3.5.3.1MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window) 的增强工具,在 MyBa…

上海亚商投顾:沪指震荡调整跌 减肥药、华为概念股持续活跃

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪 沪指上个交易日低开后震荡调整,深成指、创业板指盘中跌超1%,宁德时代一度跌超3%&#xff…

高效工具类软件使用

高效工具类软件使用 目录概述需求: 设计思路实现思路分析1.Leanote2.Obsidian 的使用 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for…

面向红队的自动化引擎工具

gogo 介绍 面向红队的、高度可控的可拓展的自动化引擎。特征如下: 自由的端口配置 支持主动/主动指纹识别 关键信息提取,如标题、证书以及自定义提取信息的正则 支持nuclei poc,poc目录:https://chainreactors.github.io/wiki/…

阿里云云服务器实例使用教学

目录 云服务器免费试用 详细步骤 Xshell 远程连接 云服务器免费试用 阿里云云服务器网址:阿里云免费试用 - 阿里云 详细步骤 访问阿里云免费试用。单击页面右上方的登录/注册按钮,并根据页面提示完成账号登录(已有阿里云账号)…

torch.cat 使用小节

torch.cat 使用小节 torch.cat 要求在所指定拼接维度之外的所有维度都要匹配,例如 import torch v1 torch.tensor([[1, 2, 3], [4, 5, 6], [4, 5, 6]]) # 3*3 v2 torch.tensor([[3, 6, 8]]) # 1*3 torch.cat([v1, v2], dim1)运行之后会报错 Sizes of tensors…

【网络安全 --- win10系统安装】win10 系统详细安装过程(提供资源)

一,资源下载 百度网盘镜像下载地址链接: 百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.ba…

webrtc快速入门——使用 WebRTC 拍摄静止的照片

文章目录 使用 getUserMedia() 拍摄静态照片HTML 标记JavaScript 代码初始化startup() 函数获取元素引用获取流媒体 监听视频开始播放处理按钮上的点击包装 startup() 方法 清理照片框从流中捕获帧 例子代码HTML代码CSS代码JavaScript代码 过滤器使用特定设备 使用 getUserMedi…

RabbitMQ内容

RabbitMQ是一款开源的消息中间件,支持多个消息协议,包括AMQP、STOMP、MQTT等,它的主要功能是将分散的应用程序连接在一起,以便它们可以相互通信,从而构建可靠的、高效的分布式系统。 RabbitMQ的基础概念包括&#xff…

Vue中如何处理表单数据的双向绑定和验证

在前端开发中,表单是非常常见的交互组件之一。为了实现表单数据的双向绑定和验证,Vue提供了一些强大的功能和方法。以下将详细介绍Vue中如何处理表单数据的双向绑定和验证,并提供具体的代码示例,以帮助读者更好地掌握这方面的知识…

单例模式之「双重校验锁」

单例模式之「双重校验锁」 单例模式 单例即单实例,只实例出来一个对象。一般在创建一些管理器类、工具类的时候,需要用到单例模式,比如JDBCUtil 类,我们只需要一个实例即可(多个实例也可以实现功能,但是增…

(ubuntu) 安装JDK

文章目录 前言参看java版本的命令:安装jdk命令安装jps关闭防火墙:查看端口占用:(坑)ubuntu上Mysql默认标明 区分大小写 前言 提示:常以为人是一个容器,盛着快乐,盛着悲哀。但是人不…

使用 Tkinter Canvas 小部件添加放大镜功能?

一、说明 据我所知,内置的 Tkinter Canvas 类比例不会自动缩放图像。如果您无法使用自定义小部件,则可以缩放原始图像并在调用缩放函数时将其替换在画布上。 二、实现图像放大镜技术细节 我如何将放大和缩小添加到以下脚本中,我想将其绑定到…

初阶数据结构-常见的排序算法

排序 排序的概念常见的排序算法常见排序算法的实现数组的打印 插入排序直接插入排序的实现希尔排序( 缩小增量排序 )希尔排序的实现 交换排序冒泡排序冒泡排序的实现选择排序选择排序的实现堆排序堆排序的实现快速排序快速排序非递归 归并排序归并排序的递归实现归并排序的非递…

Vue 3.0 使用的 diff 算法相比 Vue 2.0 中的双端比对有什么优势?

1、最长递增子序列算法 Vue 3.0 的 diff 算法采用了最长递增子序列算法,能够减少不必要的 DOM 操作,提升性能。 2、静态标记 Vue 3.0 中,编译器会对静态节点进行标记,在更新时可以直接跳过这些静态节点,减少 DOM 操作…