中国电子云数据库 Mesh 项目 DBPack 的实践

🚀 优质资源分享 🚀

学习路线指引(点击解锁)知识定位人群定位
🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

作者:刘晓敏

2022 年 4 月,中国电子云开源了其云原生数据库 Mesh 项目 DBPack。该项目的诞生,旨在解决用户上云过程中面临的一些技术难点,诸如分布式事务、分库分表等。由于它数据库 Mesh 的定位,意味着它可以支持任意微服务编程语言。

分布式事务

DBPack 的分布式事务致力于实现对用户的业务无入侵,它对 HTTP 流量和 MYSQL 流量做了拦截代理,支持 AT 模式(自动补偿 SQL)和 TCC 模式(自动补偿 HTTP 请求)。

DBPack 从 Kubernetes control loop 思想中获得灵感,采用 ETCD Watch 机制来驱动分布式事务提交回滚。在采用代理使连接增加一跳的情况下,它的性能相比采用 MYSQL 存储的分布式事务解决方案 seata-golang 性能提高了百分之 50。

AT 模式

AT 模式的性能取决于全局锁的释放速度,哪个事务竞争到了全局锁就能对业务数据做修改,在单位时间内,全局锁的释放速度越快,竞争到锁的事务越多,性能越高。从 ETCD 官方 Bench 测试数据中可以看到,ETCD 在高并发下,读写延迟很低,不同并发压力下写延迟 2 毫秒到 20 毫秒不等,读延迟基本在 10 毫秒以内。采用 ETCD 来存储全局锁是 DBPack 分布式事务性能提升的关键。

上图展示了 seata-golang 协调一个分布式事务的交互逻辑。从图上我们可以看出,事务发起者(TM)和事务协调者(TC)间存在创建(开始)全局事务提交(回滚)全局事务 RPC 交互。事务参与者(RM)和事务协调者(TC)间存在注册分支事务报告分支事务执行状态 RPC 交互。事务协调者(TC)和 MYSQL 交互保存状态数据。

而 DBPack 创建全局事务、注册分支事务只是在 ETCD 插入两条 KV 数据,事务提交回滚时修改对应数据的状态,DBPack Sidecar 通过 ETCD Watch 机制感知到数据的变化就能立即处理数据的提交回滚,从而在交互上减少了很多 RPC 请求。

各 Sidecar Watch 应用产生的数据,各自处理,实际上已经没有中心化的事务协调者,架构也变得简单了。核心的事务协调逻辑代码包括配置代码都比 Seata-golang 大幅减少。所以 DBPack 以全新的云原生的思路,带了更简洁的架构和更高的性能。

seata-golang 事务协调核心代码

dbpack 事务协调核心代码

DBPack 支持所有微服务编程语言,samples 中已提供了 Go 语言和 Java 语言的例子,PHP 和 Python 的例子也在开发中。

TCC 模式

提到 TCC 模式,大家可能第一时间想到 TCC 模式可能存在的问题:幂等性、防悬挂等。事务悬挂产生的原因是什么?其实这是一个很的问题!

APP1 在调用 APP2 的 Prepare 方法之前,事务框架根据上下文信息,自动把 Commit、Cancel 需要执行的方法名以及 Prepare 方法执行的上下文告诉事务协调者(注册分支事务),再执行 Prepare 方法。如果执行 APP1 调用 APP2 的 Prepare 方法的时候,发生网络问题,导致 APP2 迟迟没有收到 Prepare 请求,事务协调者经过一定时间后,认为全局事务超时,则 TC 根据注册上来的事务分支信息发起全局回滚,此时,APP1 向 APP2 发起一个 Cancel 请求,很巧的是,APP2 端 Cancel 请求比 Prepare 请求先到达,事务空回滚后,再收到 Prepare 请求,Prepare 如果正常执行了,那就完了,全局事务已经回滚了,这个 Prepare 操作永远也不会提交、回滚,事务挂起了,数据不一致了。

首先,这种概率很小,其次,为什么一定要在 Prepare 网络请求之前注册分支事务,可不可以在 APP2 收到 Prepare 请求执行业务代码之前注册,这时候一定能确定 Prepare 请求已经到了,Cancel 请求确定能在 Prepare 请求之后发生,是不是就不存在悬挂问题了。

实际上 seata-golang 诞生之时就支持在分支业务执行端注册 TCC 事务分支,但大家可能没有深入思考这个问题,机械地认为事务悬挂必然会发生。

DBPack 也是在请求到达 sidecar 后再注册 TCC 事务分支,确保 Prepare 先于 Cancel 执行。有人说因为 CPU 调度的原因,还是可能出现 Cancel 先于 Prepare 执行的情况,但这种概率非常非常低。具体到操作的业务数据,建议使用 XID 和 BranchID 加锁。

读写分离

DBPack 当前支持对 SQL 请求自动路由,写请求路由到写库,读请求路由到读库。在开启事务的情况下,请求自动路由到写库。同时,也可以通过 SQL Hint 自动路由读请求到用户指定的数据库。

分库分表

分库分表的功能目前还在开发中,当前已经支持跨分片、跨 DB 的查询请求,支持 Order By 和 Limit。

结语

更多特性我们也在积极开发中,DBPack 社区非常 Open,进入到社区我们都是平等的开源爱好者,在这里你也可以成长为大佬,欢迎感兴趣的同学与我们一起建设 DBPack 社区。进群或参与社区建设请添加微信:scottlewis。

链接

DBPack 项目地址:https://github.com/cectc/dbpack

DBPack 文档:https://cectc.github.io/dbpack-doc/#/

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

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

相关文章

(百度、谷歌)地图经纬度gps偏移解决办法:gps纠偏数据库纠偏

使用方法: 1、假设原始gps数据为(73.528888,39.368888) 2、查询数据库:SELECT * FROM offset where lng73.52 and lat39.36,得出offsetlat、offsetlng 3、用原始的lat加上offsetlat,lng加上offs…

国产开源优秀新一代MPP数据库StarRocks入门之旅-数仓新利器(中)

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

(数据科学学习手札136)Python中基于joblib实现极简并行计算加速

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

date数据要在前台显示

date数据要在前台显示,如果要截取一部分使用,最好用SimpleDateFormat不要用toString不牢靠。 转载于:https://www.cnblogs.com/king12345678/archive/2012/12/07/2807604.html

被迫开始学习Typescript —— class

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

ASP.NET实现二维码(QRCode)的创建和读取

一、项目引用QRCode的DLL文件&#xff08;ThoughtWorks.QRCode.dll&#xff09; 二、ASPX页面&#xff08;两个jquery的js文件请自行去官网下载&#xff09;&#xff1a;[html] <html xmlns"http://www.w3.org/1999/xhtml"> <head runat"server"…

杨玉基:知识图谱在美团推荐场景中的应用

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

Redis进阶知识一览

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

UI代码练习-视图的层次关系

2019独角兽企业重金招聘Python工程师标准>>> // // AppDelegate.h // 视图的层次关系 // // Created by on 14-12-17. // Copyright (c) 2014年 apple. All rights reserved. //#import <UIKit/UIKit.h> #import <CoreData/CoreData.h>interface Ap…

arthas学习图文记录

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

利用矩阵的n次方求图的连通性

设A&#xff08;n x n&#xff09;为一个图的邻接矩阵&#xff0c;则a(i,j)表示两个点之间是否连通&#xff08;1&#xff1a;连通&#xff0c;0&#xff1a;不连通&#xff09;。那么A的k次方中的每一个a&#xff08;i&#xff0c;j&#xff09;表示点i和j之间长度为k的路的条…

使用HBuilder新建项目

依次点击文件→新建→选择Web项目(按下CtrlN,W可以触发快速新建(MacOS请使用CommandN,然后左键点击Web项目)) 如上图&#xff0c;请在A处填写新建项目的名称&#xff0c;B处填写(或选择)项目保存路径(更改此路径HBuilder会记录&#xff0c;下次默认使用更改后的路径)&#xff0…

iOS应用开发视频教程笔记(二)My First iOS App

这课主要是以一个计算器一个用为例子&#xff0c;教你怎么使用XCode&#xff0c;如何使用MVC设计模式创建应用。 (1)新建一个single view application模版的应用 打开xcode并点击“创建一个新xcode项目”&#xff0c;进入项目创建界面&#xff0c;这个界面让我们为应用选择一个…

牛顿迭代法(Newton#39;s Method)

牛顿迭代法&#xff08;简称牛顿法&#xff09;由英国著名的数学家牛顿爵士最早提出。可是&#xff0c;这一方法在牛顿生前并未公开发表&#xff08;讨厌的数学家们还是鼓捣出来了&#xff09;牛顿法的作用是使用迭代的方法来求解函数方程的根。简单地说&#xff0c;牛顿法就是…

【深入理解计算机系统CSAPP】第六章 存储器层次结构

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

【转】无刷新验证用户名可用性

在用户注册时&#xff0c;我们经常需要检查用户名是否存在&#xff0c;本文就是实现无刷新验证用户名 打开开发环境VS 2005,新建项目(或打开现有项目),新建一个Web窗体,命名为 Default.aspx 代码如下&#xff1a; View Code <% Page Language"C#" AutoEventWireu…

Python数据分析--Numpy常用函数介绍(2)

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

bzoj3224: Tyvj 1728 普通平衡树(打个splay暖暖手)

&#xff08;其实今天好热啊&#xff1f; 题目大意&#xff1a;插入&#xff0c;删除&#xff0c;k小&#xff0c;前驱后继&#xff0c;数的排名。 splay和treap裸题...过几天补个treap的 splay: #include<iostream> #include<cstdlib> #include<cstring> #i…

手机相机自动识别语音提示

技术背景&#xff1a; 时下流行的手机拍照功能越来越多&#xff0c;在众多的手机拍照过程中&#xff0c;我们只在于手机拍照的效果和风景是否美好&#xff0c;甚至拿着手机自我狂拍&#xff0c;留下美好的记忆和回忆。 有时候根据手机相机的已有技术功能随便一设置就能拍到理想…

c# Invoke和BeginInvoke 区别

转自http://www.cnblogs.com/c2303191/articles/826571.html Control的Invoke和BeginInvoke是相对于支线线程&#xff08;因为一般在支线线程中调用&#xff0c;用来更新主线程ui&#xff09;Invoke立即插入主线程中执行&#xff0c;而BeginInvoke 要等主线程结束才执行 近日&a…