源码地址:https://github.com/sunpengChina/dog
Dog Tcc是什么?
- DogTcc是一个2019年3月开源的,基于注解的高性能 分布式事务 TCC框架。感谢于他的框架设计,可达到2ms/事务,支持链式调用,损耗线性增长。
框架特性
- 高速,事务发起方损耗 2.15ms每事务,事务被调方损耗 2.13ms每事务
- 损耗随事务链变宽[A 调用B,C,D,E…],或者变深[A 调用B,B调用C,C调用D…],线性增长
- 对原有服务无侵入,标注是基于方法而不是RPC接口的,可以在需要回滚的最小单位方法上添加标注
- 框架自动实现幂等
- 框架实现分布式环境下的可重入锁
- 易用性高,使用者通过标注,和实现指定的回滚和确认接口,即可集成框架
- 节点无本地状态,部署多台即可实现集群,无需多余配置
- 和协议无关,使用者只要实现事务的协议注入即可集成到框架中,可参照Spring模块
- 和消息服务器无关,框架提供了消息服务接口,使用者可使用其他消息中间件,可参考zookeeper模块
- 支持事务链,事务链长度不影响事务性能
- 故障恢复,任何服务节点丢失都不会影响最终一致性,丢失节点的事务会被同类节点托管,或者在丢失节点启动时候恢复
- 错误通知,对于极端情况,Confirm或者Cancel失败,系统会通过第三方接口通知,用户需要实现该接口定义的方法
性能报告
-
测试机配置
- Cpu
cpu family : 6
model : 63
model name : Intel® Xeon® CPU E5-2620 v3 @ 2.40GHz- 操作系统
Linux version 3.10.0-327.el7.x86_64
- 内存
4G
-
启动配置
-
zookeeper 默认配置启动
-
注册中心 和 Server1 Server2 Server3
启动参数:-Xms256m -Xmx512m
-
-
测试用例 [见Server1工程的Server1ApplicationController]
-
链式调用:Server1 调用 Server2 ,Server3 ; Server2 调用 Server3
-
单次调用:Server1 调用 Server3
-
为了降低业务对框架性能测试的影响,Server2 和 Server3 的业务代码为空。
-
Server2 中有一个Call单元
Call(有回滚需求的方法)定义请见: https://github.com/sunpengChina/dog/wiki/DogTcc-architecture
-
Server3 中有两个Call单元
-
-
性能报告
- [1]非线程5000次非TCC事务调用: 11325ms
- [2]非线程5000次TCC事务单次调用: 34133ms
- [3]10线程,各500次循环,共5000次链式,TCC事务调用:49826ms
- [4]10线程,各500次循环,共5000次链式,非TCC事务调用:6458ms
- [5]10线程,各500次循环,共5000次,TCC事务单次调用:35566ms
- [6]10线程,各500次循环,共5000次,非TCC事务单次调用:2884ms
-
结论
设tcc单次调用,发起方损耗为x (ms),call损耗为y (ms)
- 根据性能报告的[3]和[4],可得 x + 3y = (49826 - 6458)/5000 = 8.67 ms
- 根据性能报告的[5]和[6], 可得 x + 2y = (35566-2884)/5000 = 6.52 ms
- 可得tcc发起方单次损耗为:2.25 ms ; Call方损耗为 2.13 ms
快速开始
-
准备zookeeper
wget https://raw.githubusercontent.com/wiki/sunpengChina/dog/zookeeper-3.4.13.zip
解压文件 unzip zookeeper-3.4.13.zip
进入zk目录 cd zookeeper-3.4.13/bin
启动zk服务器 ./zkServer.sh start
打开zk客户端 ./zkCli.sh
在zk 客户端中执行 create /dog “dog”
-
下载源码
进入源码根目录,编译源码 mvn clean install
-
启动服务
启动springCloud配置中心: cd jar -jar eureka/target/eureka-1.0-SNAPSHOT.jar
启动服务Server1:jar -jar Server1/target/Server1-1.0-SNAPSHOT.jar
启动服务Server2:jar -jar Server2/target/Server2-1.0-SNAPSHOT.jar
启动服务Server3:jar -jar Server3/target/Server3-1.0-SNAPSHOT.jar
-
在浏览器中测试
http://127.0.0.1:8081/chainTcc 一次链式事务调用,检验你的系统是否正常部署
http://127.0.0.1:8081/noTcc5000 5000次无事务调用的时间
http://127.0.0.1:8081/singleTcc5000 5000次简单事务单元的时间
http://127.0.0.1:8081/chainTcc5000thread 10个线程各500次调用TCC链式事务,调用需要的时间
http://127.0.0.1:8081/chainNoTcc5000thread 10个线程各500次调用链式非TCC事务,调用需要的时间
http://127.0.0.1:8081/singleTcc5000thread 10个线程各500次调用非链式TCC事务,调用需要的时间
http://127.0.0.1:8081/singleNoTcc5000thread 10个线程各500次调用非链式非TCC事务,调用需要的时间