记一次伪并发引起的bug

一次较典型的问题排查过程, 分享一下, 欢迎指正和交流.

相关背景

内网有两个应用A和B, 其中B提供两个服务化接口B1和B2, 外网有一个应用W提供两个HTTP接口W1和W2. 内网的A通过RPC与B通信、B通过HTTP与W通信. 画了个简图如下

应用A:A首先调用B1(设置了一定的超时时间), 若超时则调用B2. 应用B:B1调用W1(设置了一定的超时时间), 调用W1成功后写入记录供B2调用W2时需要.

问题表象

观察应用B的日志发现, 有少量的B2被调用的 “记录不存在的” 业务异常日志. 根据这些异常日志分析出可能的一种情况: B1与B2 “同时” 由A发起调用, B2先行到达被处理, 引起这个异常. 从日志中也确实发现了 “记录不存在的” 的异常日志与B1的被调用日志在同一秒钟被记录到. 真的是并发引起的么?

问题追踪

理论上来说, A发起调用B1与B2, 即使是同一秒钟, 也不大可能是同一时刻. 这是因为A的逻辑决定的, 在调用B1超时后才会调用B2, 至少也是相隔了个超时时间段. 而后与A的负责人沟通得知, 调用B1的超时时间是300ms, 且找了几条异常日志对应的B1调用记录发现, 都存在同一个共同点: 耗时较长超过了300ms. 从这里可以分析出来, B2的调用至少隔了300ms才会被调用. 再次观察对应的B1调用链发现: 耗在调用W1的时间基本都在300ms以上. 这样疑问就很清晰了: A发起调用B1(超时500ms), B1发起调用W1(超时300ms). W1响应时间超过约300ms后A认定超时继而发起调用B2, 而此时B还在等待W1的响应因而没有写入记录导致A调用B2引发 “记录不存在的” 业务异常日志.

解决方案

为避免外网系统对接的超时问题, 其实内部已经有了一套较为完善的隔离方案, 这个隔离方案简单来说就是在白名单内的走单独一套超时限制较宽松的系统. 因为上面说的案例比这个隔离方案出来的时间早且比较仓促, 没有设计隔离方案且一直没有进行接入. B2接口的实时性要求不高, 可以异步处理, 暂时把B2的逻辑处理延迟1s后处理.

欢迎留言交流~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小白安全

绕过Edge、Chrome和Safari的内容安全策略

概述 ---- Web应用中有许多基本的安全机制,其中一个是同源(same-origin)策略机制,该机制规定了应用程序代码可以访问的资源范围。同源策略的...

4167
来自专栏决胜机器学习

高性能网站架构方案(二)——优化网站响应时间

高性能网站架构方案(二)——优化网站响应时间 (原创内容,转载请注明来源,谢谢) 一、概述 优化网站响应时间是保证网站受用户关注的要点,主要方案有: 1、减...

3006
来自专栏梦魇小栈

Ubuntu 使用 Cron 实现计划任务

Windows 自带定时执行任务的工具叫做“计划任务”,Linux 下我们使用 Cron 实现这一功能。

1482
来自专栏JAVA同学会

单点登录(SSO)看这一篇就够了

在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,运营人员每天用自己的账号登录,很方便。但随着企业的发展,用到的系统随之增多,运...

5746
来自专栏乐沙弥的世界

Vmware 下共享文件夹(Windows到Linux)

      共享Windows下的文件夹给Vmware下的虚拟机变得越来越简单,且易于实现。安装好虚拟机后,首先安装Vmware-tools工具包,然后再来配置...

4074
来自专栏重庆的技术分享区

域名解析后主机记录和记录值怎么填写?都是什么意思?

10.1K5
来自专栏程序人生 阅读快乐

Node即学即用(图灵程序设计丛书)

《Node即学即用》讲解如何用Node构建可扩展因特网应用,是全面的实用指南,除了详细介绍Node提供的API外,还用大量篇幅介绍了服务器事件驱动开发的重要概念...

701
来自专栏smy

webpack的css压缩不兼容IOS8问题探索

2854
来自专栏个人分享

RPC远程过程调用协议

  最近学习Hadoop、Hbase、Spark及Storm原理,经常会出现RPC这样的传输术语,为了更好地理解,将知识点详细的整理下吧~

3904
来自专栏用户画像

TCP协议

TCP是在不可靠的IP层之上实现的可靠的数据传输协议,它主要解决传输的可靠、有序、无丢失和不重复的问题。TCP是TCP/IP体系中非常复杂的一个协议,主要特点有...

561

扫码关注云+社区