【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

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

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

    阅读完需:约 6 分钟

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

特性背景

消息事务是指一系列的生产、消费操作可以要么都完成,要么都失败,类似数据库的事务。这个特性在 0.10.2 的版本是不支持的,从 0.11 版本开始才支持。华为云 DMS 率先提供 Kafka 1.1.0 的专享版服务,支持消息事务特性。


支持事务消息有什么作用?消息事务是实现分布式事务的一种方案,可以确保分布式场景下的数据最终一致性。例如最常用的转账场景,小王 转账到小明,实际操作是小王账户减去相应金额,小明的账户增加相应金额,在分库分表的前提下,2 个账户存储在不同的数据库中,这时需要分布式事务才能保证数据库一致性,单个数据库的事务无法保证跨库之间的原子性。如果小王账户先扣钱,再去发送消息到小明所在的数据库去通知增加钱,在没有事务消息的情况下,无论是先扣钱或者先发送通知增加钱,都会有数据不一致的问题,因为无法保证两者的原子性。而有了事务消息,可以保证发送通知与本地事务(扣钱)是一个原子操作,本地事务与发送通知可以同时成功或者同时失败,确保数据一致。


除了数据最终一致性外,还实现了消息 Exactly once 语义。所谓 Exactly once 语义是消息传递语义中最难实现的一种,包括 At most once:最多一次(不会重复,但是可能丢失数据); At least once:至少投递一次(不会丢失,但是会导致重复)和 Exactly once: 刚好一次(不丢不重),也即幂等性。Kafka 的幂等性可以保证生产只对一个分区实现 Exactl once 语义,需要多个分区也实现这个语义,还需要引入消息事务确保原子性。

分布式事务介绍

当前系统架构主流是分布式架构与微服务架构,在这种架构下数据源不是单一的数据库,业务逻辑往往需要在多个数据库中实现原子操作,单个数据库中的强大的本地事务无法保证多节点原子操作。 此时需要分布式事务来确保数据的一致性。目前使用较多的分布式事务解决方案有几种:

01 XA 事务:两阶段/三阶段提交

XA 是由 X/Open 组织提出的分布式事务的规范。XA 规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接口。XA 接口是双向的系统接口,在事务管理器(Transaction Manager)以及一个或多个资源管理器(Resource Manager)之间形成通信桥梁。实现 XA 事务的关键是两阶段和三阶段提交协议。


两阶段提交协议(Two-phase Commit,2PC)经常被用来实现分布式事务。一般分为协调器 C 和若干事务参与者 Si 两种角色,这里的事务参与者就是具体的数据库,协调器可以和事务参与者在一台机器上,如下图



二阶段提交协议主要包括由 2 个阶段:第一个阶段为准备阶段(prepare),第二阶段为提交阶段。准备阶段由事务协调者向事务参与者发送 prepare 消息,各个参与者处理本地事务但不提交,然后向事务协调者返回事务状态。 提交阶段根据准备阶段各参与者的执行请求,协调者确定事务是提交或者回滚,向各个参与者发送命令。


二阶段提交协议主要的问题是在提交执行过程中,所有的参与者都需要听从协调者的统一调度,期间处于阻塞状态而不能从事其他操作,这样效率及其低下。特别是当协调者发出提交通知到部分参与者后宕机,其他参与者就会阻塞。


针对二阶段提交存在的问题,三阶段提交协议在 prepare 与 commit 阶段之间增加一个 pre-commit 阶段。Prepare 阶段只询问参与者而不做事务,而在 pre-commit 阶段各个参与者才会执行本地事务但不提交。Commit 阶段就是直接提交。这样做可以避免二阶段当协调者迟迟没有发出 commit 或者 rollback 通知,参与者在超时后可以自行提交或者回滚,避免阻塞事务(这是因为经过了 prepare 阶段已经确认了各个参与者是可以执行的,最后第三阶段直接执行即可)。 三阶段提交也存在很多问题,也不能完全保证数据一致,完全一致需要用到 Paxos 算法。

02 TCC 补偿性事务解决方案

TCC 分别对应 Try、Confirm 和 Cancel 三种操作,含义如下:


  • Try:预留业务资源

  • Confirm:确认执行业务操作,执行事务

  • Cancel:取消执行业务操作


TCC 解决了跨应用业务操作的原子性问题,在诸如组合支付、账务拆分场景非常实用。TCC 实际上把数据库层的二阶段提交上提到了应用层来实现,对于数据库来说是一阶段提交,规避了数据库层的 2PC 性能低下问题。TCC 需要业务提供使用,开发复杂和成本高。

03 事务消息

基于消息中间件的事务消息来完成分布式事务。事务消息可以确保本地执行事务与消息发送是原子的:先发送一条消息到消息中间件,然后执行本地事务,当本地事务成功后再发送提交确认到消息中间件,然后这条消息才能被其他业务消费者所能感知,从而确保原子性。


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


原文链接:


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


2019-10-21 14:51999

评论

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

及时恢复,华为云灾备数据解决方案让你无忧办公

科技之光

JS词法环境和执行上下文

hellocoder2029

JavaScript

ES6 Promise、Generator与async简单介绍与应用

木偶

前端 ES6 异步 10月月更

8K AV1视频解码大战:Intel神奇、NVIDIA差点、AMD无语

科技之家

基于网络安全的Docker逃逸

网络安全学海

黑客 网络安全 信息安全 渗透测试 WEB安全

Spring Boot 应用使用 application.yml 和 application.properties 的区别

Jerry Wang

Java mvc spring 后端开发 10月月更

2022 云栖大会 | 开源人说预约:听百味技术人生,品激荡开源江湖

阿里云大数据AI技术

阿里云 开源

诺亚财富 X Hologres : 统一OLAP分析引擎,全面打造金融数字化分析平台

阿里云大数据AI技术

大数据 数据分析 企业号十月 PK 榜

“程”风破浪的开发者|OpenHarmony设备开发-开发板介绍

坚果

OpenHarmony 10月月更 “程”风破浪的开发者

一文详解MySQL事务底层原理,全是干货,推荐收藏

一灯架构

Java 10月月更

十年磨一剑,华为云数据灾备解决方案为你解决后顾之忧

科技之光

云堡垒机相关概念汇总说明-行云管家

行云管家

云计算 网络安全 数据安全 堡垒机

软件测试 | 测试开发 | 使用 Zabbix + Grafana 搭建服务器监控系统

测吧(北京)科技有限公司

测试

js对象和原型、原型链的关系

hellocoder2029

JavaScript

股票价格跨度

掘金安东尼

算法 10月月更

Hacker 资讯 | 10 月中旬区块链黑客松活动汇总

TinTinLand

创业 defi 区块链、 黑客马拉松 web3、

JavaScript知识点总结

木偶

前端 js 10月月更

如何通过C#/VB.NET重命名Excel表格并设置选项卡颜色

在下毛毛雨

C# .net Excel 重命名工作表

JS知识点梳理之作用域、作用域链、柯里化、闭包

hellocoder2029

JavaScript

Wallys/IPQ4018/IPQ4028 2x2 2.4Ghz 2x2 5Ghz Industrial-grade //wifi5 Support 11ABGN/AC

wallys-wifi6

IPQ4018 IPQ4028

2022 云栖大会 | 一体化大数据智能峰会预约开启

阿里云大数据AI技术

大数据 阿里云 开源

何为云管平台?有什么作用?哪家好?

行云管家

云计算 云主机 云管理 云成本

80Gbps 双向带宽,120Gbps 疾速传输,英特尔携新一代 Thunderbolt 引领行业快步向前

科技之家

细说JavaScript闭包

hellocoder2029

JavaScript

技术强、资源多,华为云等保合规解决方案助力企业快速过等保!

科技之光

可适配多企业需求,华为云等保合规安全解决方案选择灵活!

科技之光

万物皆可DAO?一文带你全方位解读DAO类型

One Block Community

区块链 开发者 治理 DAO web3、

新来个技术总监,仅花2小时,撸出一个多线程永动任务,看完直接跪了,真牛逼!

程序知音

Java 架构 多线程 多线程与高并发 后端技术

Docker | 容器数据卷详解

甜点cc

Docker 前端 10月月更

你的下一个电脑桌面,为何是云桌面?

科技之光

软件测试 | 测试开发 | 测试人生 | 疫情之下涨薪70%从手工转到测试开发,是种什么样的体验?

测吧(北京)科技有限公司

测试

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