2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

【干货】Kafka 事务特性分析(下)

  • 2019-10-21
  • 本文字数:2057 字

    阅读完需:约 7 分钟

【干货】Kafka 事务特性分析(下)

Kafka 消息事务

01 基本概念

为了支持事务,Kafka 0.11.0 版本引入以下概念:


1、事务协调者:类似于消费组负载均衡的协调者,每一个实现事务的生产端都被分配到一个事务协调者(Transaction Coordinator)。


2、引入一个内部 Kafka Topic 作为事务 Log:类似于消费管理 Offset 的 Topic,事务 Topic 本身也是持久化的,日志信息记录事务状态信息,由事务协调者写入。


3、引入控制消息(Control Messages):这些消息是客户端产生的并写入到主题的特殊消息,但对于使用者来说不可见。它们是用来让 broker 告知消费者之前拉取的消息是否被原子性提交。


4、引入 TransactionId:不同生产实例使用同一个 TransactionId 表示是同一个事务,可以跨 Session 的数据幂等发送。当具有相同 Transaction ID 的新的 Producer 实例被创建且工作时,旧的且拥有相同 Transaction ID 的 Producer 将不再工作,避免事务僵死。


5、Producer ID:每个新的 Producer 在初始化的时候会被分配一个唯一的 PID,这个 PID 对用户是不可见的。主要是为提供幂等性时引入的。


6、Sequence Numbler。(对于每个 PID,该 Producer 发送数据的每个< Topic, Partition>都对应一个从 0 开始单调递增的 Sequence Number。


7、每个生产者增加一个 epoch:用于标识同一个事务 Id 在一次事务中的 epoch,每次初始化事务时会递增,从而让服务端可以知道生产者请求是否旧的请求。


8、幂等性:保证发送单个分区的消息只会发送一次,不会出现重复消息。增加一个幂等性的开关 enable.idempotence,可以独立与事务使用,即可以只开启幂等但不开启事务。

02 事务流程

如下图所示:



1、查找事务协调者


生产者会首先发起一个查找事务协调者的请求(FindCoordinatorRequest)。协调者会负责分配一个 PID 给生产者。类似于消费组的协调者。


2、获取 produce ID


在知道事务协调者后,生产者需要往协调者发送初始化 pid 请求(initPidRequest)。这个请求分两种情况:


  • 不带 transactionID


这种情况下直接生成一个新的 produce ID 即可,返回给客户端


  • 带 transactionID


这种情况下,kafka 根据 transactionalId 获取对应的 PID,这个对应关系是保存在事务日志中(上图 2a)。这样可以确保相同的 TransactionId 返回相同的 PID,用于恢复或者终止之前未完成的事务。


3、启动事务


生产者通过调用 beginTransaction 接口启动事务,此时只是内部的状态记录为事务开始,但是事务协调者认为事务开始只有当生产者开始发送第一条消息才开始。


4、消费和生产配合过程


这一步是消费和生成互相配合完成事务的过程,其中涉及多个请求:


  • 增加分区到事务请求


当生产者有新分区要写入数据,则会发送 AddPartitionToTxnRequest 到事务协调者。协调者会处理请求,主要做的事情是更新事务元数据信息,并把信息写入到事务日志中(事务 Topic)。


  • 生产请求


生产者通过调用 send 接口发送数据到分区,这些请求新增 pid,epoch 和 sequence number 字段。


  • 增加消费 offset 到事务


生产者通过新增的 snedOffsets ToTransaction 接口,会发送某个分区的 Offset 信息到事务协调者。协调者会把分区信息增加到事务中。


  • 事务提交 offset 请求


当生产者调用事务提交 offset 接口后,会发送一个 TxnOffsetCommitRequest 请求到消费组协调者,消费组协调者会把 offset 存储在__consumer-offsets Topic 中。协调者会根据请求的 PID 和 epoch 验证生产者是否允许发起这个请求。 消费 offset 只有当事务提交后才对外可见。


5、提交或回滚事务


用户通过调用 commitTransaction 或 abortTranssaction 方法提交或回滚事务。


  • EndTxnRequest


当生产者完成事务后,客户端需要显式调用结束事务或者回滚事务。前者会使得消息对消费者可见,后者会对生产数据标记为 Abort 状态,使得消息对消费者不可见。无论是提交或者回滚,都是发送一个 EndTnxRequest 请求到事务协调者,写入 PREPARE_COMMIT 或者 PREPARE_ABORT 信息到事务记录日志中(5.1a)。


  • WriteTxnMarkerRequest


这个请求是事务协调者向事务中每个 TopicPartition 的 Leader 发送的。每个 Broker 收到请求后会写入 COMMIT(PID)或者 ABORT(PID)控制信息到数据日志中(5.2a)。


这个信息用于告知消费者当前消息是哪个事务,消息是否应该接受或者丢弃。而对于未提交消息,消费者会缓存该事务的消息直到提交或者回滚。


这里要注意,如果事务也涉及到__consumer_offsets,即该事务中有消费数据的操作且将该消费的 Offset 存于__consumer_offsets 中,Transaction Coordinator 也需要向该内部 Topic 的各 Partition 的 Leader 发送 WriteTxnMarkerRequest 从而写入 COMMIT(PID)或 COMMIT(PID)控制信息(5.2a 左边)。


  • 写入最终提交或回滚信息


当提交和回滚信息写入数据日子后,事务协调者会往事务日志中写入最终的提交或者终止信息以表示事务已经完成(图 5.3),此时大部分于事务有关系的消息都可以被删除(通过标记后面在日志压缩时会被移除),我们只需要保留事务 ID 以及其时间戳即可。


接口



示例



本文转载自公众号中间件小哥(ID:huawei_kevin)。


原文链接:


https://mp.weixin.qq.com/s/C0dsP_0AkIgAZ_bPSvCsOg


2019-10-21 14:511485

评论

发布
暂无评论
发现更多内容

苏州八大机房20A机柜租用价格范围?应用场景及成功案例分享

苏州服务器托管

苏州服务器托管 苏州机柜租用 IDC机房托管

大数据-73 Kafka 事务与幂等性详解:配置、原理与实战案例全解析

武子康

Java 大数据 kafka 分布式 消息队列

主流内网聊天工具,谁才是企业的最佳选择?

BeeWorks

即时通讯 IM 私有化部署

CST电路监视器第二讲-CST软件教程

思茂信息

cst CST软件 CST Studio Suite

Discord x Pulsar: 使用Pulsar、Flink和Iceburg搭建流式机器学习平台

AscentStream

机器学习 flink pulsar Discord

SEO第二十章 产品经理也需要理解SEO

溪抱鱼

html SEO

开发者空间FastGPT问答系统实战:知识库检索 x 联网搜索

华为云开发者联盟

AI 框架 FastGPT 华为开发者空间

诺亚ARK 最新CIO报告:科技型通缩正重塑资产配置

财见

抖音视频详情API秘籍!轻松获取视频详情数据

tbapi

抖音API 抖音视频数据采集 抖音视频详情API

仓颉之泛型和扩展的神奇天地

华为云开发者联盟

CodeArts 仓颉 华为开发者空间

Apache Doris 4.0 AI 能力揭秘(一):AI 函数之 LLM 函数介绍

SelectDB

实时数仓 Apaache Doris LLM 数据库 大数据 AI 函数

仓颉之函数的魔法宝典

华为云开发者联盟

函数 仓颉 华为开发者空间

gRPC凭什么成为微服务通信首选?深度解析RPC进化史

左诗右码

Word可以转PPT吗,如何进行?4个AI工具大盘点

职场工具箱

人工智能 PPT 办公软件 AIGC AI生成PPT

LLM 中 token 简介与 bert 实操解读

地平线开发者

自动驾驶 算法工具链 地平线征程6

哈尔滨等保测评:不同行业系统的测评重点差异

等保测评

采购议标关键指标:如何评估业务系统的低代码能力?

星云低代码中间件

低代码 数字化转型 企业应用 招投标

mybatis中<if>条件判断带数字的字符串失效问题

刘大猫

人工智能 算法 智慧城市 智慧交通 大模型

把数据分析主导权交给业务,Aloudata Agent 面向全行业公开体验

Aloudata

数据分析 agent 指标平台 ChatBI

Apache Doris 在菜鸟的大规模湖仓业务场景落地实践

SelectDB

数据仓库 数据分析 LakeHouse 湖仓一体 菜鸟

基于开发者空间GaussDB完成AI智能索引和参数自调优实践

华为云开发者联盟

sql Gauss DB 华为开发者空间

内网聊天软件,帮助企业快速构建专属聊天APP!

BeeWorks

即时通讯 IM 私有化部署

即时通讯|BeeWorks企业im系统,生态互连重塑企业协同办公

BeeWorks

即时通讯 IM 私有化部署

龙蜥社区第 35 次运营委员会会议圆满结束

OpenAnolis小助手

操作系统 龙蜥社区 OpenAnolis

内网聊天工具私有化IM选择指南,BeeWorks可能适合你

BeeWorks

即时通讯 IM 私有化部署

哈尔滨等保测评价格构成与影响因素解析

等保测评

基于开发者空间GaussDB数据库的分区表项目实践

华为云开发者联盟

Gauss DB I/O 调度 华为开发者空间

仓颉之结构体、类与接口的奇幻乐园

华为云开发者联盟

仓颉 华为开发者空间

构建全面 GRC 策略的三大关键能力|ADManager Plus 助您实现合规与安全并重

运维有小邓

【干货】Kafka 事务特性分析(下)_文化 & 方法_李浩_InfoQ精选文章