flink读写kafka保证端到端exactly-once

这篇具有很好参考价值的文章主要介绍了flink读写kafka保证端到端exactly-once。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

内容:
本文主要介绍使用flink读写kafka,如何保证exactly-once

关键点:

Flink的checkpoint机制
Kafka source支持重新消费,手动commit
Kafka sink支持2PC(two-phase commit protocol)

flink实践任务配置:

flink读写kafka保证端到端exactly-once
Kafka端到端一致性需要注意的点:

  • Flink任务需要开启checkpoint配置为CheckpointingMode.EXACTLY_ONCE
  • Flink任务FlinkKafkaProducer需要指定参数Semantic.EXACTLY_ONCE
  • Flink任务FlinkKafkaProducer配置需要配置transaction.timeout.ms,checkpoint间隔(代码指定)<transaction.timeout.ms(默认为1小时)<transaction.max.timeout.ms(默认为15分钟)
  • 消费端在消费FlinkKafkaProducer的topic时需要指定isolation.level(默认为read_uncommitted)为read_committed

例如:
flink任务设置:

env.enableCheckpointing(XXX, CheckpointingMode.EXACTLY_ONCE);

若为生产者,还需设置:

properties.setProperty("transaction.timeout.ms", "900000");
KafkaSink<String> sink = KafkaSink.<String>builder()
        .setBootstrapServers(brokers)
        .setRecordSerializer(KafkaRecordSerializationSchema.builder()
            .setTopic("topic-name")
            .setValueSerializationSchema(new SimpleStringSchema())
            .build()
        )
        .setDeliverGuarantee(DeliveryGuarantee.EXACTLY_ONCE)  // 配置容错
        .build();

若为消费者,还需设置:

properties.setProperty("isolation.level", "read_committed");

说明:

1、生产者

Kafka 的 Exactly Once 语义是通过它的事务和生产幂等两个特性来共同实现的。
kafka从0.11开始支持事务(exactly-once语义),这为实现端到端的精确一致性语义提供了支持。
(1)幂等性:为了实现 Producer 的幂等语义,Kafka 引入了Producer ID(即PID)和Sequence Number。
原理:每个新的 Producer 在初始化的时候会被分配一个唯一的 PID,该 PID 对用户完全透明而不会暴露给用户。
对于每个 PID,该 Producer 发送数据的每个<Topic, Partition>都对应一个从 0 开始单调递增的Sequence Number。
类似地,Broker 端也会为每个<PID, Topic, Partition>维护一个序号,并且每次 Commit 一条消息时将其对应序号递增。对于接收的每条消息,如果其序号比 Broker 维护的序号(即最后一次 Commit 的消息的序号)大1,则 Broker 会接受它,否则将其丢弃:

  • 如果消息序号比 Broker 维护的序号大1以上,说明中间有数据尚未写入,也即乱序,此时 Broker 拒绝该消息,Producer 抛出InvalidSequenceNumber
  • 如果消息序号小于等于 Broker 维护的序号,说明该消息已被保存,即为重复消息,Broker 直接丢弃该消息,Producer 抛出DuplicateSequenceNumber

(2)事务性:幂等设计只能保证单个 Producer 对于同一个<Topic, Partition>的Exactly Once语义。事务保证可使得应用程序将生产数据和消费数据当作一个原子单元来处理,要么全部成功,要么全部失败,即使该生产或消费跨多个<Topic, Partition>。
应用程序必须提供一个稳定的(重启后不变)唯一的 ID,也即Transaction ID。Transactin ID与PID可能一一对应。区别在于Transaction ID由用户提供,而PID是内部的实现对用户透明。
为了保证新的 Producer 启动后,旧的具有相同Transaction ID的 Producer 即失效,每次 Producer 通过Transaction ID拿到 PID 的同时,还会获取一个单调递增的 epoch。由于旧的 Producer 的 epoch 比新 Producer 的 epoch 小,Kafka 可以很容易识别出该 Producer 是老的 Producer 并拒绝其请求。
Kafka 0.11.0.0 引入了一个服务器端的模块,名为Transaction Coordinator,用于管理 Producer 发送的消息的事务性。该Transaction Coordinator维护Transaction Log,该 log 存于一个内部的 Topic 内。Producer 并不直接读写Transaction Log,它与Transaction Coordinator通信,然后由Transaction Coordinator将该事务的状态插入相应的Transaction Log。

主要分为以下步骤:

  1. 查找Tranaction Corordinator

Producer向任意一个brokers发送 FindCoordinatorRequest请求来获取Transaction Coordinator的地址。

  1. 初始化事务 initTransaction

Producer发送InitpidRequest给Transaction Coordinator,获取pid。Transaction Coordinator在Transaciton Log中记录这<TransactionId,pid>的映射关系。另外,它还会做两件事:

恢复(Commit或Abort)之前的Producer未完成的事务
对PID对应的epoch进行递增,这样可以保证同一个app的不同实例对应的PID是一样,而epoch是不同的。
只要开启了幂等特性即必须执行InitpidRequest,而无须考虑该Producer是否开启了事务特性。

  1. 开始事务beginTransaction

执行Producer的beginTransacion(),它的作用是Producer在本地记录下这个transaction的状态为开始状态。这个操作并没有通知Transaction Coordinator,因为Transaction Coordinator只有在Producer发送第一条消息后才认为事务已经开启。

  1. read-process-write流程

一旦Producer开始发送消息,Transaction Coordinator会将该<Transaction, Topic, Partition>存于Transaction Log内,并将其状态置为BEGIN。另外,如果该<Topic, Partition>为该事务中第一个<Topic, Partition>,Transaction Coordinator还会启动对该事务的计时(每个事务都有自己的超时时间)。

在注册<Transaction, Topic, Partition>到Transaction Log后,生产者发送数据,虽然没有还没有执行commit或者abort,但是此时消息已经保存到Broker上了。即使后面执行abort,消息也不会删除,只是更改状态字段标识消息为abort状态。

  1. 事务提交或终结 commitTransaction/abortTransaction

在Producer执行commitTransaction/abortTransaction时,Transaction Coordinator会执行一个两阶段提交:

第一阶段,将Transaction Log内的该事务状态设置为PREPARE_COMMIT或PREPARE_ABORT
第二阶段,将Transaction Marker写入该事务涉及到的所有消息(即将消息标记为committed或aborted)。这一步骤Transaction Coordinator会发送给当前事务涉及到的每个<Topic, Partition>的Leader,Broker收到该请求后,会将对应的Transaction Marker控制信息写入日志。
一旦Transaction Marker写入完成,Transaction Coordinator会将最终的COMPLETE_COMMIT或COMPLETE_ABORT状态写入Transaction Log中以标明该事务结束。

当flink producer配置:Semantic.EXACTLY_ONCE时,flink生产会开启事务;kafka的事务机制底层依赖幂等生产者,因此开启kafka事务,会自动开启幂等生产者。

2、消费者

为了保证事务特性,需要配置isolation.level = read_committed参数
消费者设置read_uncommitted可以读取到未提交的事务数据(默认);
消费者设置read_committed只有在生产者提交事务的时候,才可以读取到数据,如果事务取消了,那么读取不到数据。

kafka事务详情:
https://www.jianshu.com/p/64c93065473e
https://www.modb.pro/db/111263文章来源地址https://www.toymoban.com/news/detail-412800.html

到了这里,关于flink读写kafka保证端到端exactly-once的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 端到端自动驾驶

    自动驾驶主要流程:感知-预测-规划 预测是预测周围目标(车、行人、动物等)的轨迹,规划是规划自车的运动轨迹。 使用transformer架构, 统一自动驾驶流程 ,完成所有检测,跟踪,建图,轨迹预测,占据栅格预测与规划的端到端推理。 参考: CVPR 2023 Award Candidate | 自动驾

    2024年01月25日
    浏览(29)
  • 重估端到端原则

    评价技术迭代的旧的定势眼光来自于该技术诞生时。 1970/80/90 年代,相比传输带宽技术,处理器更强。网络协议倾向于字段多,字段小且紧凑,尽可能减少传输量,用 “算法技巧” 等价,如果 TCP 序列号 48 位,win 48 位,端口号 48 位,所有与 PAWS,win scale option,get unique tup

    2024年02月07日
    浏览(48)
  • 什么是端到端测试?

    端到端测试(End-To-End Testing, 简称E2E测试)是一种 从头到尾测试整个软件产品 以确保应用程序流程按预期运行的技术。它定义了产品的系统依赖性,并确保所有集成部分按预期协同工作。 端到端测试的主要目的是 通过模拟真实用户场景并验证被测系统及其组件的集成和数据

    2024年02月07日
    浏览(47)
  • 【端到端图像压缩】CompressAI运行记录

    目录 0 前言 1 代码来源 2 代码的运行 2.1 CompressAI下载与安装 2.2 运行示例程序 3 结果分析 4 结论 5 参考文献 0 前言 期末作业要求运行端到端的图像压缩代码,过程中学习了csdn上诸多教程。这里将运行的过程分享出来。 1 代码来源 目前大多数文献附带的代码是在Linux平台使用

    2024年02月12日
    浏览(31)
  • 前端实现端到端测试(代码版)

    playwright 、 cypress 、 selenium 对比 个人初步使用后,推荐playwright 框架作为e2e test 下载 cypress npm install cypress --save-dev package.json npm run cypress:open 使用流程 入门官方文档 npm run cypress:open 左侧端测试,右侧组件测试,点击左侧 选择你需要的浏览器,点击开始 自动打开浏览器,点击左侧s

    2024年02月04日
    浏览(29)
  • 单元测试与端到端测试——主要区别

    目录 前言: 什么是单元测试? 单元测试生命周期 单元测试的好处 那么它有什么好处呢? 单元测试示例 单元测试的类型 单元测试工具 什么是端到端测试? 端到端测试 端到端测试的主要好处是什么? 端到端测试示例 端到端测试的类型 横向端到端测试 垂直端到端测试 端到

    2024年02月15日
    浏览(38)
  • 端到端 RAG 解决方案 RAGFlow 正式开源

    继 AI 原生数据库 Infinity 于去年底正式开源之后,我们的端到端 RAG 解决方案 RAGFlow 也于今日正式开源。在回答 RAGFlow 是一款怎样的产品之前,我们先来谈谈为何要做这样一款产品。 RAG 发展到今日,已经成为 LLM 面向 B 端服务的共识,然而时至今日,针对它的疑问却从来没有

    2024年04月08日
    浏览(32)
  • 使用 Python 创建端到端聊天机器人

    聊天机器人是一种计算机程序,它了解您的查询意图以使用解决方案进行回答。聊天机器人是业内最受欢迎的自然语言处理应用。因此,如果您想构建端到端聊天机器人,本文适合您。在本文中,我将带您了解如何使用 Python 创建端到端聊天机器人。 训练的意图及回复越多,

    2024年02月01日
    浏览(30)
  • 4端到端协议-4.3【实验】【计算机网络】

    2023-6-15 12:19:41 以下内容源自《【实验】【计算机网络】》 仅供学习交流使用 Wireshark的安装及基本使用【计算机网络】 4端到端协议-4.2【实验】【计算机网络】 各位同学,大家好,本次实验的内容为TCP的连接管理。 本次实验我们分成四个部分来介绍。我们先介绍实验目的,

    2024年02月10日
    浏览(72)
  • 端到端流式语音识别研究综述——语音识别(论文研读)

    语音识别是实现人机交互的一种重要途径,是自然语言处理的基础环节,随着人工智能技术的发展,人机交互等大量应用场景存在着流式语音识别的需求。流式语音识别的定义是一边输入语音一边输出结果,它能够大大减少人机交互过程中语音识别的处理时间。目前在学术研

    2024年02月04日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包