DBPack v0.1.1 发布公告


2022 年 5 月 24 日,我们发布了 DBPack v0.1.0 版本,该版本主要 release 了分布式事务功能。在我们的规划里,DBPack 是要支持所有微服务开发语言协调分布式事务的,但经过社区反馈,dotnet core 并不支持。于是,我们在 v0.1.1 对 dotnet core 进行了支持。下面就如何支持 dotnet core 做一个说明。

MySql 协议

先请允许我对 MySql 的通信协议做一个简单的介绍。MySql 支持两种协议,一种是文本(Text)协议,一种是二进制(Binary)协议。MySql 客户端使用 COM_QUERY 发出的请求,MySql 服务端会以文本协议响应结果;使用 COM_STMT_EXECUTE 命令发出的请求,会以二进制协议响应结果。

在我们用程序调用 MySql Client SDK 发起请求的时候,不同的 MySql Client SDK 会默认使用不同的协议发送请求,但大部分 MySql Client SDK 都支持文本协议和二进制协议,我们可以通过修改属性配置改变 MySql Client SDK 的默认行为。比如:

  • JAVA

@Mapper
public interface ProductMapper {
@Update("UPDATE /*+ XID('${xid}') */ `product`.`inventory` SET `available_qty` = `available_qty` - #{qty}, allocated_qty = allocated_qty + #{qty} WHERE product_sysno = #{productSysNo} AND available_qty >= #{qty}")
boolean allocateInventory(@Param("xid") String xid, @Param("productSysNo") long productSysNo, @Param("qty") int qty);
}

在 java 语言编写的微服务中,我们写了一个方法去修改商品的库存,当我们传入参数提交执行的时候,默认该 SQL 请求会被编码成

update /*+ XID('gs/aggregationSvc/81336085455405058') */ product.inventory set available_qty = available_qty - 2, allocated_qty = allocated_qty + 2 where product_sysno = 1 and available_qty >= 2;

通过 COM_QUERY 命令发出。

我们可以通过修改连接字符串,在原来的 jdbc:mysql://dbpack2:13307/product 上加上 useServerPrepStmts=true,改为 jdbc:mysql://dbpack2:13307/product?useServerPrepStmts=true,再次执行时,会首先发出 COM_STMT_PREPARE 请求:

UPDATE /*+ XID('gs/aggregationSvc/2612341069705662465') */ product.inventory set available_qty = available_qty - ?, allocated_qty = allocated_qty + ? WHERE product_sysno = ? and available_qty >= ?

获取到 statement id 后,再将 statement id 和请求参数编码后通过 COM_STMT_EXECUTE 命令发出。

  • Golang

Golang MySql driver 默认是以二进制协议发送带参数的 DML 请求的,通过在 dsn 上加上参数 interpolateParams=true,才会以文本协议发送。例如:

dksl:123456@tcp(127.0.0.1:13306)/employees?interpolateParams=true&timeout=10s&readTimeout=10s&writeTimeout=10s&parseTime=true&loc=Local&charset=utf8mb4,utf8

Dotnet Core

Dotnet core 如果使用 EntityFrameworkCore 或者 Dapper 来访问数据库,目前还不支持使用 Prepared Statement,下面这两个 issue 有相关说明:

https://github.com/dotnet/efcore/issues/5459

https://github.com/DapperLib/Dapper/issues/474

在 v0.1.0 版本,我们只对 COM_STMT_EXECUTE 请求做了拦截处理,来协调分布式事务问题。dotnet core 使用 COM_QUERY 提交请求自然无法协调分布式事务,在 v0.1.1 我们增加了 COM_QUERY 请求协调分布式事务的支持,这样真正做到了支持所有微服务语言协调分布式事务。

dotnet core sample 见:https://github.com/cectc/dbpack-samples/tree/main/dotnet。

其他特性

本次发版,还修复了一些 bug,增加了 status api 用于查询 dbpack 的运行状态:

$ curl http://localhost:9999/status
$ {
"listeners": [{
"protocol_type": "mysql",
"socket_address": {
"address": "0.0.0.0",
"port": 13306
},
"active": true
}],
"distributed_transaction_enabled": true,
"is_master": true
}

至此,我们有了

  • /live

  • /ready

  • /status

  • /metrics

这些 api 辅助我们查看 dbpack 的运行状态。

完整的版本变更日志请看 https://github.com/cectc/dbpack/releases。

在下一个版本,我们会增加 tracing 和审计日志的功能。

一些链接

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

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

DBPack-samples:https://github.com/cectc/dbpack-samples

DBPack 介绍:https://mp.weixin.qq.com/s/DmXfk5bAcVYdnOwvp8ocHA

事件驱动的分布式事务架构设计:https://mp.weixin.qq.com/s/r43JvRY3LCETMoZjrdNxXA


相關推薦

2023-02-27

Fastcms 是基于 SpringBoot 前后端分离技术,且具有插件化架构的 CMS 系统,系统具有高扩展性,易维护性,可以快速搭建网站,微信小程序,是开发微信营销插件的基石 Fastcms 是真正意义上的插件化开源项目,支付,搜索,订单催

2023-06-05

你是否曾经因为服务器太多记不住,而喜欢的 ssh 终端又没有服务器管理功能而苦恼? tssh v0.1.1 已实现 ssh 客户端常用的基本功能( 除了 ssh 端口转发 ),一般人用到的 ssh 功能都已支持,欢迎各位大佬试用。 两大额外功能

2023-08-24

Fixed 修复特定字符可能会破坏文件路径的问题 Enhancements 为SFTP新增一些集成测试 支持软链接本身的同步 实现通过文件查询接口获取链接信息 新增go1.21支持 移除go1.19支持 新增symlink动作 为FileInfo结构新增LinkTo字

2022-10-31

距离2.1.1版本发布2个月后,Nacos社区又迎来一波大更新。本次发布包含了2个server版本,1个go-sdk版本以及新语言sdk的预告。 以下内容来自发布公告: Nacos 2.1.2 2.1.2 主要增强了控制台的UI效果,变更了控制台的样式,使得内容更

2023-02-21

认为无主键,业务控制实现 (艰难取舍) 集成 seata-go,hptx,dbpack 支持全局托管,不修改业务代码,零侵入分布式事务 支持 clickhouse, 更新,删除语句使用 SQL92 标准语法 更新: 感谢 @encircles 的pr,使用FuncWrapFieldTagName函数自定义

2023-03-07

认为无主键,业务控制实现 (艰难取舍) 集成 seata-go,hptx,dbpack 支持全局托管,不修改业务代码,零侵入分布式事务 支持 clickhouse, 更新,删除语句使用 SQL92 标准语法 更新: 感谢 @gxdvip 的反馈,修复指针类型nil值异常 使用

2023-04-16

认为无主键,业务控制实现 (艰难取舍) 集成 seata-go,hptx,dbpack 支持全局托管,不修改业务代码,零侵入分布式事务 支持 clickhouse, 更新,删除语句使用 SQL92 标准语法 更新: 自动生成CountFinder.InjectionCheck和查询Finder保持一致

2023-08-22

认为无主键,业务控制实现 (艰难取舍) 集成 seata-go,hptx,dbpack 支持全局托管,不修改业务代码,零侵入分布式事务 支持 clickhouse, 更新和删除语句使用 SQL92 标准语法 更新: DefaultValue默认值仅用于Insert和InsertSlice Struct,对Upda

2023-08-30

认为无主键,业务控制实现 (艰难取舍) 集成 seata-go,hptx,dbpack 支持全局托管,不修改业务代码,零侵入分布式事务 支持 clickhouse, 更新和删除语句使用 SQL92 标准语法 更新: 废弃BindContextDefaultValue函数   完善文档,注

2023-10-02

认为无主键,业务控制实现 (艰难取舍) 集成 seata-go,hptx,dbpack 支持全局托管,不修改业务代码,零侵入分布式事务 支持 clickhouse, 更新和删除语句使用 SQL92 标准语法 更新: 增加OverrideFunc复写增删改查的SQL语句函数,用于全

2023-01-21

认为无主键,业务控制实现 (艰难取舍) 集成 seata-go,hptx,dbpack 支持全局托管,不修改业务代码,零侵入分布式事务 支持 clickhouse, 更新,删除语句使用 SQL92 标准语法.clickhouse-go 官方驱动不支持批量 insert 语法,建议使用 http

2022-11-11

无主键,业务控制实现 (艰难取舍) 集成 seata-golang,hptx,dbpack 支持全局托管,不修改业务代码,零侵入分布式事务 支持 clickhouse, 更新,删除语句使用 SQL92 标准语法.clickhouse-go 官方驱动不支持批量 insert 语法,建议使用 https:

2022-08-05

无主键,业务控制实现 (艰难取舍) 集成 seata-golang,hptx,dbpack 支持全局托管,不修改业务代码,零侵入分布式事务 支持 clickhouse, 更新,删除语句使用 SQL92 标准语法.clickhouse-go 官方驱动不支持批量 insert 语法,建议使用 https:

2022-10-06

无主键,业务控制实现 (艰难取舍) 集成 seata-golang,hptx,dbpack 支持全局托管,不修改业务代码,零侵入分布式事务 支持 clickhouse, 更新,删除语句使用 SQL92 标准语法.clickhouse-go 官方驱动不支持批量 insert 语法,建议使用 https: