结果接口协议
当前页面介绍的结果口协议,适用于1.9.x及更低版本,如果您的dtm版本大于等于1.10.x,采用本协议不会出错,但是建议采用新的协议。升级指南参考升级指南
角色间通信协议
目前dtm只支持了http和grpc协议。由于分布式事务涉及多个角色协作,某些参与者可能出现暂时不可用,需要重试;某些参与者明确告知失败,需要进行回滚。
HTTP
下面对各种情况进行分类说明,定义各类情况的返回值。接口类似微信/支付宝订单成功回调的接口:
- 如果接口返回的结果中,包含SUCCESS,则表示成功;
- 如果接口返回的结果中,包含FAILURE,则表示失败;
- 如果接口返回的结果中,包含ONGOING,则表示正常进行中,需要按照指定的时间间隔重试;
- 其他则表示出错,需要进行重试,重试时采用退避算法,避免雪崩。
上面的架构图中,主要有以下几类接口:
AP调用TM的接口,主要为全局事务注册、提交,子事务注册等:
- 成功:
- 失败: { dtm_result: "FAILURE" },表示这个请求状态不对,例如已经走fail的全局事务不允许再注册分支
- 其他表示状态不确定,可重试
TM调用RM的接口,主要为二阶段的提交、回滚,以及saga的各分支操作
- 成功:
- 失败: { dtm_result: "FAILURE" },表示这个接口业务失败,全局事务需要进行回滚。例如saga中的正向操作如果返回FAILURE,则整个saga事务失败回滚
- 进行中: { dtm_result: "ONGOING" },表示这个接口正常进行中,后续按照固定间隔重试
- 其他结果则重试,一直按照退避算法重试,直到返回上述的两个结果之一
AP调用RM的接口,跟业务相关,主要是被TCC、XA两种模式调用。
考虑到许多微服务的治理,都有失败重试的机制,因此建议接口设计(由于是AP和RM之间的接口,dtm不做强制要求)如下:
- 成功: { dtm_result: "SUCCESS" }。返回的结果可以额外包含其他业务数据。
- 失败: { dtm_result: "FAILURE" },表示这个接口业务失败,全局事务需要进行回滚。例如tcc中的Try动作如果返回FAILURE,则整个tcc全局事务回滚
- 其他返回值,应当允许重试,重试如果还是失败,需要允许全局事务回滚。主要是因为TCC、XA事务的下一步操作不保存在数据库,而是在AP里,它需要及时响应用户,无法长时间等待故障恢复。
接口数据注意点
dtm框架通过resp.String()是否包含SUCCESS/FAILURE/ONGOING来判断成功和失败,因此请避免在子事务接口返回的业务数据里包含这两个词。
GRPC
由于GRPC为强类型协议,并且定义好了各个错误状态码,并且能够定义不同的错误码,采用不同的重试策略,因此GRPC的协议如下:
GRPC协议
- 成功: OK。对应上述http协议中的
- 失败: Aborted && Message=="FAILURE"。对应上述http协议中的{ dtm_result: "FAILURE" },表示失败;
- 进行中: Aborted && Message=="ONGOING"。对应上述http协议中的{ dtm_result: "FAILURE" },则表示正常进行中,需要按照指定的时间间隔重试;
- 其他错误吗:状态未知,可重试,重试时采用退避算法,避免雪崩。
AP调用TM的接口,主要为全局事务注册、提交,子事务注册等:
- nil:成功
- Aborted:表示这个请求状态不对,例如已经走fail的全局事务不允许再注册分支
- 其他错误:表示状态未知,可重试
type DtmServer interface {
...
Submit(context.Context, *DtmRequest) (*emptypb.Empty, error)
}
TM调用RM的接口,主要为二阶段的提交、回滚,以及saga的各分支操作
- nil:成功
- Aborted && Message=="FAILURE":表示失败,需要回滚事务
- Aborted && Message=="ONGOING":表示进行中,后续采用固定间隔重试
- 其他错误:表示出错,采用退避算法重试
AP调用RM的接口,跟业务相关,主要是被TCC、XA两种模式调用。返回的结果
- 这部分接口用户完全自定义,dtm并不关心。建议用户采用“TM调用RM的接口”相同的设计,保持统一
重试策略
失败重试是微服务治理中,很重要的一个环节,上述http和grpc协议,能够很好的与主流的失败重试策略兼容
当全局事务由于某些组件导致临时故障,那么全局事务会暂时中断,后续dtm会定时轮询未完成的全局事务,进行重试。一般多次重试则间隔每次加倍,避免雪崩。
许多事务模式中的操作是要求不允许失败/最终成功的,含义见最终成功