首页 微服务调用读取超时
文章
取消

微服务调用读取超时

最近在用微服务遇到了问题,产生了bug,记录下来以供提醒。

有两个微服务 A 和 a,两者负责相同业务,但 A 负责运营端的业务,a 负责客户端的业务,两者使用相同的 MySQL 业务表。由于业务需要,A 调用 a 中的接口,发现每次调用都会出现 ReadTimeout 的错误,检查网络环境、修改超时时间配置、服务重启,结果依旧,a 中也无法打印请求参数。通过 skywalking 跟踪,发现 a 中的 sql 更新语句执行时间超时,长达5秒(超时时间设置的也为5秒)。

经过多次检查,结果发现 A 中在使用数据库事务,事务过程中有调用 a 的接口服务,A 中的数据库操作和 a 中的数据库操作都 update 了同一条数据。a 中 update 时由于 A 事务尚未提交数据行被锁,只能等待,一直等到到达超时时间 A 中接口调用报错事务取消为止。

经验是微服务功能划分要深思熟虑,不要有纠缠,不要在事务中跨进程更新同一行数据或同一个表数据。

本文由作者按照 CC BY 4.0 进行授权