8

CECTC/dbpack: 用Golang编写的分布式事务中间件

 1 year ago
source link: https://www.jdon.com/61388
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

CECTC/dbpack: 用Golang编写的分布式事务中间件
DBPack是一种以AT事务模式实现的DB网格解析,是一种分布式事务模型,不侵入业务逻辑,具有高性能。

分布式事务、读写拆分和分片的数据库代理!支持任何语言!它可以部署为 pod 中的 sidecar。

DBPack 意为数据库集群工具包。它可以作为一个Pod中的sidecar部署,它屏蔽了复杂的基础逻辑,使业务开发不需要依赖特定的SDK,简化了开发过程,提高了开发效率。

特征

  • 支持MYSQL协议
  • 受kubernetes启发的简单易用的分布式事务解决方案
  • 支持读写拆分,支持通过Hint自定义SQL路由
  • 作为sidecar部署,支持任何语言
  • sharding:支持分表查询,支持order by,支持limit

DBPack 与 Seata AT 事务有点不同,它可以作为一个 sidecar 部署在 k8s 中,这样任何编程语言都可以使用这个 sidecar 来处理分布式事务。它还支持分片数据库和表

分布式事务中间件的工作流描述:

  1. Slient 向 Aggregation Service 的 DBPack 代理发送 HTTP 请求。(注意:请求地址和端口应该配置为 DBPack 代理而不是实际的聚合服务 API 地址)。
  2. DBPack 生成唯一的 XID(全局事务 ID),并将其存储在 ETCD 中。
  3. 如果全局事务开始成功(失败将结束事务),聚合服务可以通过 HTTP 头(X-Dbpack-Xid)获取 XID。然后聚合服务可以向 Service1 发送 API 请求并将 XID 传递给它。
  4. Service1收到XID后,向DBPack发送业务SQL,代理会为Service1注册分支事务(生成branchID,存入ETCD...)
  5. Service1注册后,DBPack会为业务SQL生成undo_log,然后undo_log会随着Service1的本地事务一起提交。
  6. Service2 将执行与 Service1 相同的 step4、5。
  7. Aggregation Service 可以从 Service1 和 Service2 获取 API 结果,并决定是全局提交还是回滚。如果两个 API 都成功,它会向 DBPack 响应 HTTP 200。如果失败,它会响应除 200 之外的其他状态码。DBPack 将相应地在 ETCD 中将全局事务更新为“commiting”或“rollbacking”。
  8. 通过 ETCD watch 机制,Service1 和 Service2 将知道是提交还是回滚他们的分支事务。(如果是提交,他们会删除 undo_log;如果是回滚,他们会执行 undo_log。)
  9. 在所有分支提交或回滚后,分支状态将在 ETCD 中更新。Aggregation Service 的 DBPack 代理会知道全局事务已经完成,然后它会从 ETCD 中删除 XID 和 BranchID 信息。

 


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK