AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

【干货】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:511278

评论

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

Java面向对象程序设计|二人间对话示例

TiAmo

Java 三周年连更 点对点通信 socket通信 面向对象程序设计

好用的Angular组件库有哪些推荐的?TinyNG好用吗?

英勇无比的消炎药

开源 前端 angular OpenTiny

企业号 5 月 PK 榜,火热开启!

InfoQ写作社区官方

热门活动 企业号 5 月 PK 榜

LuckyDraw发布啦

进基的小张

开源项目 Github'

如何用 Go 实现一个配置包

江湖十年

【源码分析】【seata】at 模式分布式事务 -rm 实现逻辑

如果晴天

源码分析 分布式事务 seata Seata框架

【Linux】中安装pip(详细教程)

A-刘晨阳

Python Linux 运维 pip 三周年连更

微信小程序开发限制

肥晨

三周年连更

保姆教程 | 用GPU云主机搭建AI大语言模型并用Flask封装成API,实现用户与模型对话 | 京东云技术团队

京东科技开发者

flask gpu GPU服务器 企业号 4 月 PK 榜 AI大语言模型

华为ISDP数字化现场作业在第十七届工程建设行业信息化发展大会亮相,备受企业瞩目

轶天下事

Unity 之 实现背景图动态适配不同分辨率

陈言必行

Unity 三周年连更

Qz学算法-数据结构篇(哈希表)

浅辄

数据结构 三周年连更

企业级统一数据平台建设思路

星环科技

数据平台

当生成式AI照进医疗,医患关系将何去何从?

脑极体

AI

什么是软件开发领域的 obsolete 或者 deprecated 含义

汪子熙

软件开发 三周年连更

AI不会取代打工人,使用AI的人才会! | 社区征文

王中阳Go

程序员 AI GPT ChatGPT 三周年征文

推荐一些好用的ChatGPT扩展工具

石云升

ChatGPT 三周年连更

Unity手机游戏开发:从搭建到发布上线全流程实战

海拥(haiyong.site)

三周年连更

使用 Flomesh 服务网格进行流量拆分

Flomesh

微服务 Service Mesh 服务网格

Spring Boot如何获取Excel sheet页?

bug菌

Spring Boot spring-boot 三周年连更

躬身入局的数科公司,为本就拥挤的数智化赛道带来了什么?

用友BIP

用友iuap 用友技术大会 数科公司

面面俱到!百度出品2023版Java面试指南,囊括面试所有硬核技能

程序员小毕

程序员 后端 架构师 java面试 八股文

华为ISDP数字化现场作业:数字化转型助力电力行业安监风险管控

轶天下事

低代码+智能化,企业数字化提速的又一场革命

科技热闻

Redis Set 用了 2 种数据结构来存储,到现在才知道

Java你猿哥

Java redis string HashMap底层原理

6个优化策略,助你降低K8S成本

SEAL安全

k8s 成本管理

华为ISDP工单宝应邀参加第十七届工程建设行业信息化发展大会

轶天下事

大数据时代数据化转型的多种模式

星环科技

Go并发编程的秘密武器:内存模型和同步原语

Jack

Hi3861开发板入门

鸿蒙之旅

OpenHarmony 三周年连更

跨平台应用开发进阶(五十八):短链基本工作原理与实现方案

No Silver Bullet

短链接 跨平台应用开发 三周年连更

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