dtm分布式事务——saga事务超时多次触发

简介: saga属于长事务,因此持续的时间跨度很大,可能是100ms到1天,因此saga没有默认的超时时间。dtm支持saga事务单独指定超时时间,到了超时时间,全局事务就会回滚。

问题背景


在使用saga分布式事务的时候,接口执行时间过长,导致 dtm-server多次重发 请求到节点


在dtm文档中,关于超时的说明如下


saga属于长事务,因此持续的时间跨度很大,可能是100ms到1天,因此saga没有默认的超时时间。


dtm支持saga事务单独指定超时时间,到了超时时间,全局事务就会回滚。


saga.TimeoutToFail = 1800


这里的Timeout指的是 整个事务的超时时间,而我们这里出现的问题是单个节点(子事务)的超时时间导致重发


排查


dtm-server的报错日志


{"level":"info","ts":"2022-03-01T21:37:15.276+0800","caller":"dtmsvr/trans_status.go:27","msg":"TouchCronTime for: {\"ID\":0,\"create_time\":\"2022-03-01T21:30:53.3232344+08:00\",\"update_time\":\"2022-03-01T21:37:15.2743237+08:00\",\"gid\":\"ghXUgV63AnsBwtxa6LtY5o\",\"trans_type\":\"saga\",\"steps\":[{\"action\":\"http://127.0.0.1:8888/order_create\",\"compensate\":\"http://127.0.0.1:8888/order_create_compensate\"},{\"action\":\"http://127.0.0.1:8889/goods_inventory\",\"compensate\":\"http://127.0.0.1:8889/goods_inventory_compensate\"}],\"payloads\":[\"{\\\"goods_id\\\":1,\\\"number\\\":3}\",\"{\\\"goods_id\\\":1,\\\"number\\\":3}\"],\"status\":\"submitted\",\"protocol\":\"http\",\"next_cron_interval\":20,\"next_cron_time\":\"2022-03-01T21:37:35.2743237+08:00\",\"wait_result\":true}"}
{"level":"error","ts":"2022-03-01T21:37:15.277+0800","caller":"dtmsvr/trans_type_saga.go:136","msg":"exec branch error: http/grpc result should be specified as in:\nhttps://dtm.pub/summary/arch.html#http\nunkown result will be retried: Post \"http://127.0.0.1:8889/goods_inventory?branch_id=02&gid=ghXUgV63AnsBwtxa6LtY5o&op=action&trans_type=saga\": dial tcp 127.0.0.1:8889: connectex: No connection could be made because the target machine actively refused it.","stacktrace":"github.com/dtm-labs/dtm/dtmsvr.(*transSagaProcessor).ProcessOnce.func3.1\n\t/github/workspace/dtmsvr/trans_type_saga.go:136\ngithub.com/dtm-labs/dtm/dtmsvr.(*transSagaProcessor).ProcessOnce.func3\n\t/github/workspace/dtmsvr/trans_type_saga.go:140"}


通过报错和查看源码得知 还有一个RequestTimeout需要配置


解决


RequestTimeout默认时间是3s,我们可以根据需要调大一些,也可以不调整这里 在dtm-server下次重发的时候通过接口幂等控制返回处理完成的结果,完成整个事务的调用

目录
相关文章
|
4月前
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
|
7月前
|
消息中间件 Dubbo 应用服务中间件
分布式事物【Hmily实现TCC分布式事务、Hmily实现TCC事务、最终一致性分布式事务解决方案】(七)-全面详解(学习总结---从入门到深化)
分布式事物【Hmily实现TCC分布式事务、Hmily实现TCC事务、最终一致性分布式事务解决方案】(七)-全面详解(学习总结---从入门到深化)
210 0
|
2月前
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
|
21天前
|
消息中间件 架构师 数据库
本地消息表事务:10Wqps 高并发分布式事务的 终极方案,大厂架构师的 必备方案
45岁资深架构师尼恩分享了一篇关于分布式事务的文章,详细解析了如何在10Wqps高并发场景下实现分布式事务。文章从传统单体架构到微服务架构下分布式事务的需求背景出发,介绍了Seata这一开源分布式事务解决方案及其AT和TCC两种模式。随后,文章深入探讨了经典ebay本地消息表方案,以及如何使用RocketMQ消息队列替代数据库表来提高性能和可靠性。尼恩还分享了如何结合延迟消息进行事务数据的定时对账,确保最终一致性。最后,尼恩强调了高端面试中需要准备“高大上”的答案,并提供了多个技术领域的深度学习资料,帮助读者提升技术水平,顺利通过面试。
本地消息表事务:10Wqps 高并发分布式事务的 终极方案,大厂架构师的 必备方案
|
1月前
|
监控
Saga模式在分布式系统中保证事务的隔离性
Saga模式在分布式系统中保证事务的隔离性
|
3月前
Saga模式在分布式系统中如何保证事务的隔离性
Saga模式在分布式系统中如何保证事务的隔离性
|
5月前
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中与事务隔离级别结合使用
乐观锁在分布式数据库中与事务隔离级别结合使用
|
7月前
|
消息中间件 Java 关系型数据库
Spring事务与分布式事务
这篇文档介绍了事务的概念和数据库事务的ACID特性:原子性、一致性、隔离性和持久性。在并发环境下,事务可能出现更新丢失、脏读和不可重复读等问题,这些问题通过设置事务隔离级别(如读未提交、读已提交、可重复读和序列化)来解决。Spring事务传播行为有七种模式,影响嵌套事务的执行方式。`@Transactional`注解用于管理事务,其属性包括传播行为、隔离级别、超时和只读等。最后提到了分布式事务,分为跨库和跨服务两种情况,跨服务的分布式事务通常通过最终一致性策略,如消息队列实现。
88 0
|
7月前
|
SQL 关系型数据库 MySQL
Flink CDC产品常见问题之读分布式mysql报连接超时如何解决
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。
|
7月前
|
消息中间件 RocketMQ Docker
分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)
分布式事物【RocketMQ事务消息、Docker安装 RocketMQ、实现订单微服务、订单微服务业务层实现】(八)-全面详解(学习总结---从入门到深化)
105 0