记一次问题处理对http请求超时时间的运用

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

时间回到某年某月某日微信某项目对接群里突然炸锅了。刚上线第三天的项目系统突然响应超级慢用户投诉不断。还没等读完所有的消息现场运维经理也给我打来电话万分火急需要开发人员介入排查问题。我赶紧要来远程连上了现场环境。

首先通过监控模块查看所有对外提供接口的响应速度看看是哪个接口响应慢。结果发现所有接口响应时间全部都很长感觉系统整个处于一个半瘫痪状态。难道是业务量激增导致系统触及性能瓶颈带着这个问题我分析了上午系统正常时的数据库订单数量并和前两天数据做比对发现订单并没有太显著的增多如此排除了业务量激增导致系统不堪重负的可能。

接下来我开始仔细分析系统日志发现有一个调用另外一个系统查询社保卡余额的接口有时会超时。问题突然明朗了一些这个接口超时时间设置的比较长如果超时的次数比较多叠加的请求多了会逐渐耗尽系统资源导致本系统所有提供的对外接口响应都非常慢。那么接下来需要排查这个查询接口为啥有时超时有时很正常。由于这个系统也是本公司的系统我很快找到了对应的日志表筛查响应时间长的请求。观察发现这些响应时间长的请求都与记录同一个错误这个错误指向了某银行的系统。我接着联系现场运维经理询问线下的一些其他业务是否也有一些参保人无法使用对方说线下也收到了类似的问题反馈。这下基本“破案”了某地社保卡的发卡行往往有多家银行这个查询社保卡余额的接口就是根据不同的发卡行去调用具体银行的系统查询而此时是某个发卡行的系统出问题了。我让现场运维经理联系银行问啥时候能恢复银行回复正在排查尽快恢复。此处我就不再吐槽了。

原因已经找到现在摆在我面前的问题是甲方的业务系统仍然要调用我的系统来实现社保卡消费而有一部分参保人的发卡行系统又不能用。情况紧急实现方案只有一个那就是如何确保其他发卡行的参保人能正常使用我的系统将投诉量降到最低。整个链路调用的系统较多而且目前只能先修改本系统思来想去可以从http请求的超时时间上下手。

这里先简单介绍下HTTP请求时connectionRequestTimeout 、connectionTimeout、socketTimeout三个超时时间的含义。

connectionRequestTimout指从连接池获取连接的timeout。

connetionTimeout指客户端和服务器建立连接的timeout。就是http请求的三个阶段一建立连接二数据传送三断开连接。建立连接超时后会ConnectionTimeOutException

socketTimeout指客户端和服务器建立连接后客户端从服务器读取数据的timeout超出后会抛出SocketTimeOutException。

本系统间接调用银行的接口主要有两类一个是查询类一个是交易类这类接口都是用的同一个http请求公共方法这个方法的超时时间写死了120S。因为某些原因这些接口有时确实很慢尤其是交易类接口所以为了避免单边账超时时间设置的很长。原先的公共方法开头代码如下

public static JSONObject invokeService(String url, String serviceName, String operationName, String xmlPara ) throws AppException {
        CloseableHttpClient httpclient = null;
        HttpPost httppost = new HttpPost(url);
        CloseableHttpResponse response = null;
        HttpEntity entity = null;
        // 超时时间这里是写死的
        int waitTime = 120000;

最后果断决定新写一个http请求公共方法可以传入超时时间上述查询社保卡余额的接口调用新的方法并传入较短的超时时间比如10S让有问题的发卡行及时抛出超时错误。新方法开头如下

public static JSONObject invokeServiceWithWaitTime(String url, String serviceName, String operationName, String xmlPara, Integer waitTimePara) throws AppException {
        CloseableHttpClient httpclient = null;
        HttpPost httppost = new HttpPost(url);
        CloseableHttpResponse response = null;
        HttpEntity entity = null;
        
        int waitTime = 120000;   //默认超时时间
        if (waitTimePara != null) {
            waitTime = waitTimePara;   //使用传入的超时时间
        }

这样既能减小系统压力也能保证其他发卡行的参保人正常使用系统。情况紧急用户投诉仍然不断甲方客服电话都被打爆了必须马上升级。我在最短的时间完成了升级紧接着看监控模块系统接口响应都恢复了正常。微信群里也传来了好消息紧张的氛围也降缓和下来了。但作为一个经验丰富的程序员工作还没有完我需要排查日志检查有没有在系统切换的间隙存在实际发生却没有入库的交易数据。所幸经过仔细排查没有漏掉的交易数据。经过此事对http请求的超时时间的使用又有了新的认识。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6