Skip to content

ikenchina/octopus

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

分布式事务

简介

Octopus是一个基于Golang的分布式事务解决方案,目前支持两种类型的分布式事务

  • Saga
  • TCC

事务角色

一般分为三个事务角色

  • 事务提交者AP : 发起分布式事务的业务方
  • 事务参与者RM : 子事务实现者
  • 事务协调者TC : 分布式事务的管理者,管理事务的提交,回滚等

Octopus已经实现TC,AP和RM的相关封装,用户只需要实现业务逻辑即可,不需要关心分布式事务的细节以及各种异常情况的处理。

使用octopus实现一个分布式事务

使用octopus可以非常便利地实现一个分布式事务。

如下,以saga为例,实现一个分布式事务。

事务发起方AP

// 使用SagaTransaction启动一个分布式Saga 事务,然后添加子事务分支
resp, err := saga.SagaTransaction(ctx, app.tcClient, sagaExpiredTime, 
  func(txn *saga.Transaction, gtid string) error {   
    txn.AddGrpcBranch(1, server1, commitMethodName, compensateMethodName)
    txn.AddGrpcBranch(2, server2, commitMethodName, compensateMethodName)
    return nil
})

事务参与方RM

Saga分布式事务的RM要实现commit和compensation接口,开发者也只需要实现相关业务逻辑。

// 提交逻辑,在HandleCommit的func(tx *sql.Tx)实现业务逻辑
err := saga.HandleCommit(ctx, rm.db, gtid, bid, func(tx *sql.Tx) error {
  // 实现业务逻辑即可
  ......
})

// 回滚逻辑(补偿)
err := saga.HandleCompensation(ctx, rm.db, gtid, bid, func(tx *sql.Tx) error {
  // 实现业务逻辑即可
  ......
})

事务管理方TC由octopus实现,开发者只需要部署,无须开发任何代码。

可以看出,只需要几行代码就可以实现一个分布式事务,开发者不用考虑幂等,乱序等异常情况,只需要实现业务逻辑即可。

相关文档

具体理论和实现:

测试

单元测试

各单元测试均通过,若提交PR,请确保单元测试通过,且覆盖到新代码。

压力测试

压力测试请见文档 : 压力测试