事务积压排查

分布式事务常见的问题是发生事务积压,事务积压的原因通常是参与方问题导致的,可能是由于参与方二阶段执行失败或执行超时,也可能是因为参与方与分布式事务服务端连接异常等问题。本文将基于参与方的常见问题,引导您快速排查并解决事务积压问题。

参与方二阶段执行失败

在参与方的二阶段执行日志 ${user.home}/logs/dtx-drm.log 中,搜索事务 ID ,检查是否是由于参与方二阶段业务本身执行失败,返回 false,再继续分析业务逻辑找到具体的执行失败原因。

执行失败日志示例如下:

2019-06-2517:19:54,061 INFO  dtx-bolt-pool-12- branch commit result:[false], message:[class:[com.alipay.dtx.rpc.message.server.request.BranchCommitRequest]:{"actionContext":{"sys::rollback_method":"rollback","action-start-time":1561453729969,"sys::prepare":"doPrepare","tracerInfo":"tcid=0d0d00061561453729832100274810&spid={spid}&pspid={pspid}&sample=false&dtx_id=3521a9ab55474738a296eda97fe39f6701-0000000000&","appName":"sofa-server","rpcId":"0.3949f9b2","sys::commit_method":"commit","host-name":"10.81.60.101","tracerId":"0d0d00061333333729832100274810","sys::class_name":"com.alipay.dtx.sample.action.facade.FirstAction","actionName":"FirstAction"},"actionId":"94021b09f8314aceb3ffede77b682900","activityContext":{"bizType":"trade","start-time":1561453729846,"tracerInfo":"tcid=0d0d00061561453729832100274810&spid=0&pspid=&sample=false&","appName":"sofa-client","isolationLevel":"READ_UNCOMMITTED","rpcId":"0","host-name":"13.13.X.X","tracerId":"0d0d00061333333729832100274810"},"instanceId":"VOQKxxxXCWID","resourceId":"SOFABOOT_RPC&FirstAction&&","resourceType":2,"txId":"3521a9ab55474738a296eda97fe39f6701-0000000000"}].

参与方二阶段执行超时

检查 ${user.home}/admin/logs/dtxserver/common-error.log 系统错误日志,查看是否是由于参与方二阶段执行超时问题造成的事务积压。

执行超时日志示例如下:

2019-06-2517:08:53.264[message-executor] ERROR DTX-REMOTE -BusinessAction handle exception,txId:3521a9ab55474738a296eda97fe39f6701-0000000000, instanceId:VxxKVVWXCWID com.alipay.remoting.rpc.exception.InvokeTimeoutException:Rpc invocation timeout[responseCommand TIMEOUT]! the address is10.25.172.207:51083
at com.alipay.remoting.rpc.RpcResponseResolver.preProcess(RpcResponseResolver.java:91)
at com.alipay.remoting.rpc.RpcResponseResolver.resolveResponseObject(RpcResponseResolver.java:56)
····

参与方初始化失败

参与者启动时,可能会因为某些原因初始化失败,从而造成了事务积压。因此,您可以根据启动时间,排查 DTX 客户端的初始化日志:${user.home}/admin/logs/dtx/dtx-client.log

参与方与 DTX Server 连接失败

  1. 根据参与方启动时间,查看 DTX Server 的建连日志 ${user.home}/admin/logs/dtx/dtx-rpc.log,检查参与方是否与 DTX Server 建连失败,从而造成了事务积压。

  2. 在参与方的机器上执行以下命令,确认其与 DTX Server 端口的连接情况:

    netstat -anp|grep 14200

    若发现参与方与某台 DTX Server 没有建立连接,当这台 DTX Server 进行提交操作(Commit)时,则会报错:java.lang.RuntimeException: connection is null,targetIp:{xxx},txId:{xxx}。此时,快速的恢复方法是重启参与方的应用,后续再排查连接无法建立的具体原因。

其他原因

除以上常见的参与方问题外,还可能是由于其他原因。您可以通过查看参与方二阶段执行日志 ${user.home}/logs/dtx-drm.log 或者DTX Server 错误日志 ${user.home}/admin/logs/dtxserver/common-error.log 根据具体的错误信息,具体分析原因。