GLCC Dashboard - lunarwhite/seata-golang Wiki

题目:完成 Seata-Golang TCC 事务模式的注解支持

issue 页面:https://github.com/opentrx/seata-golang/issues/118

活动页面:https://www.gitlink.org.cn/glcc/subjects/detail/71

任务描述与背景

  • ⽤户使⽤ Seata-Golang TCC 模式协调分布式事务时,需要将 Try 请求的上下⽂信息告诉 TC,即 Commit 操作应该调⽤哪个⽅法、Cancel 操作应该调⽤哪个⽅法,以及 Try 请求的参数。当 TC 发起全局提交、回滚的时候,才能根据事务分⽀决定调⽤哪个⽅法提交、调⽤哪个⽅法回滚。这⼀切由框架来完成
  • 为了告诉 TC Server 这些信息,需要⽤户实现⼀个 TCC Service 接⼝,通过接口约束开发者实现 TryCancelComfirm 方法,接口三个方法的参数都封装到一个 BusinessActionContext

    // https://github.com/opentrx/seata-golang/blob/v2/pkg/client/tcc/proxy.go
    type TccService interface {
    	Try(ctx *ctx.BusinessActionContext, async bool) (bool, error)
    	Confirm(ctx *ctx.BusinessActionContext) bool
    	Cancel(ctx *ctx.BusinessActionContext) bool
    }
  • 调用 Try 方法之前,事务分支要加入事务组,且需要把 Try 方法执行的上下文,即 BusinessActionContext 存到 TC,这样框架在提交或回滚时,才能把 BusinessActionContext 参数传给 ConfirmCancel 方法,这部分逻辑通过代理实现。所以开发者还需要创建一个代理类,并实现接口 TccProxyService

  • 在程序初始化时,调⽤ tcc.ImplementTCC() ⽅法,该⽅法会通过反射获取 Commit 操作对应的 Confirm ⽅法,以及 Cancel 操作对应的 Cancel ⽅法,然后将上下⽂信息发送到 TC Server

    // https://github.com/opentrx/seata-go-samples/blob/v2/tcc/main.go
    tcc.ImplementTCC(service.TccProxyServiceA)
    tcc.ImplementTCC(service.TccProxyServiceB)
    tcc.ImplementTCC(service.TccProxyServiceC)
  • 原来通过反射注册方法,现在通过注解来注册可以简化该过程。只需在对应的 Try ⽅法上打上注解 @TCC(Commit="xxx",Cancel="xxx"),再配合注解的扫描初始化,即可完成告诉 TC Server Try 请求上下⽂信息的过程。可以更加⽅便⽤户使用,简化开发(少实现一个 service 接口),提升效率

实现方案

annotation 定义如 @TCC(name="action",commit="method_a",cancel="method_b")

  • 实现 annotation 解析,在 pkg/client/tcc 目录下增加相关代码
    • 输入代码文件,将源代码转换为 token
    • 将 token 转换为 AST,获取代码中所定义的 annotation
    • 解析出 annotation,获取 Name、Attributes(attrName,attrValue)
  • 支持 Seata TCC 操作
    • 修改 ImplementTCC(),去掉"通过反射获取 Commit/Cancel 操作对应的⽅法"逻辑,保留"通过反射注册 branch session"逻辑
    • 代理被 @TCC 标记的方法,实现全局事务的开启、提交或回滚

时间规划

[7.01 - 7.10, week1 ~ 2]

  • 前置知识准备充足,包括不限于分布式 TCC、注解、Go 高级语法(如反射)
  • 明确任务要求,确保方案的正确性与可行性
  • 规划任务,制定看板(可借助 Github Wiki 与 Project 功能)
  • 熟悉社区协作的流程、代码与提交规范

[7.11 - 9.04, week3 ~ 10]

  • 编写代码,测试+文档
    • 划分模块,描述模块功能、模块间的逻辑、如何跟现有模块通信
    • 具体要修改、新增哪些文件
    • 设计函数签名/API
    • 给出关键算法、示意图
    • 把 Feature 细化成可交付的任务,分配到每周
  • 定期与 Mentor 沟通、回顾并改进
  • 把握进度,留出时间以灵活调整

[9.05 - 9.30, week11 ~ 14]

  • 完善开发文档与单元测试,做性能对比,可对已有方案进行优化
  • 把该有的 Feature 做完,提交所有 Pull requests ,经 Review 后成功合入主分支
  • 输出总结博文与结项报告,准备结项考核材料

[10.01 - ∞]

  • 在对 Seata 项目有整体深入了解后,进一步参与社区开发

已做的尝试

  • 加入社区钉钉群,了解社区工作方式,保持信息的同步
  • 参考官方文档,完成 Newcomer’s guide,成功在本地部署主项目
  • 阅读目前的技术博客和技术文档,对项目有更全面的了解,并产出文章总结:
  • 提前熟悉并参与 Community,了解社区开发流程与注意事项:
  • 针对性阅读源码
    • seata-java 如何利用注解实现 TCC 事务模式
    • seata-golang 实现细节
    • seata-golang-samples 如何应用框架
    • 第三方库 golang-annotation 如何实现注解

参考

快捷链接

⚠️ **GitHub.com Fallback** ⚠️