研发中心/王鹏 2019年7月

关键词:OKHTTP,安卓,连接复用,开源软件BUG

一.背景知识:

OKHTTP已是安卓项目中被广泛使用的网络请求开源库,它有如下特性:

1.支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接;

2.连接池减少请求延时;

3.缓存响应内容,避免一些完全重复的请求;

4.透明的GZIP压缩减少响应数据的大小;

其中前三点特性可理解为就是连接复用,但后来发现这里有坑~

二.问题现象:

据现场端反馈,即使在网络正常的情况下,也会有个别设备会在某个时段内出现支付缓慢,多笔交易连续失败的情况。

通过业务保障平台发现订单查询接口一直出现SocketTimeOutException。

三.问题原因:

如果OKHTTP第一次出现SocketTimeoutException,后续即使网络已经恢复正常,请求也始终返回SocketTimeoutException,必须等到双活域名切换或者重新连接WiFi,或重新启动应用程序才能恢复正常。

四.排查过程:

根据以上日志分析,可发现一个规律:切换(双活机房)基础域名时,请求便恢复正常,基本符合OKHTTP源码中不复用之前连接的条件:

所以我初步怀疑这是连接复用的特性导致的:

即问题出现之后,一直在复用错误的连接,而域名切换之后,不再复用之前的错误连接,于是请求恢复正常。

但项目中的连接池复用一直采用的是OKHTTP默认设置的配置,未做其他改动,所以怀疑OKHTTP有BUG。

查看OkHttp GitHub的issues,发现2019年4月26号新增了一条Issues,与我们的问题类似。问题如下:

内容大致意思为:部分设备出现了SocketTimeOut后,后续请求一直返回SocketTimeOut,尤其是在4G网络下比较常见!目前该问题仍未解决,处于开放状态,BUG依旧存在。

五.解决方法:

在全局 ResponseError 监听器里,如果发现出现 SocketTimeOut 就清空连接池:

目前此方案的缺点是应用程序出现SocketTimeOut一次,下一次访问才能成功,当前请求无法修正。

后续会持续关注此issues修复状态,及时更新。

七.经验教训:

1.使用第三方开源库,一定要熟悉其原理,在使用前一定要通篇了解其issues中反馈的各种问题,评估其影响,平常定期不定期关注其Issues更新。p.s.:郑总的《那些年我们一起犯过的错》,已给我们打过预防针了。

2.做好边界测试和压力测试。

3.一定要重视线上问题,明确根本原因并评估其影响。之前惯性地认为SocketTimeOut就是网络状况不好导致的,未引起足够重视。

八.RCA类型:

开源软件的BUG

-EOF-

欢迎关注公众号:老兵笔记,讲述那些年我们一起犯过的错

RCA:收单设备调用云端接口频繁超时排查总结的更多相关文章

  1. Kafka 异步消息也会阻塞?记一次 Dubbo 频繁超时排查过程

    线上某服务 A 调用服务 B 接口完成一次交易,一次晚上的生产变更之后,系统监控发现服务 B 接口频繁超时,后续甚至返回线程池耗尽错误 Thread pool is EXHAUSTED.因为服务 B ...

  2. singleCall单来源调用解析及实现

    定义: 单来源调用指一个类的生成工作只能由特定类来执行. eg李宁牌鞋子只能由李宁专卖店生产 这个问题归结起来,也就是说在工厂模式中,指定的产品类只能通过具体的特定工厂类来生成,而不能自己new出来或 ...

  3. android应用程序如何调用支付宝接口

    最近在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口,因为用的人比较多. 在网上搜索了以下,有很多这方面的教程,但大部分教程过于陈旧,而且描述的过于简单.而且支付宝提供的接口一直在 ...

  4. android应用程序如何调用支付宝接口(转)

    最近在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口,因为用的人比较多. 在网上搜索了以下,有很多这方面的教程,但大部分教程过于陈旧,而且描述的过于简单.而且支付宝提供的接口一直在 ...

  5. thinkjs学习-this.assign传递数据和ajax调用后台接口

    在页面加载时,就需要显示在页面上的数据,可以在后台使用this.assign赋值,在前台通过ejs等模板获取:用户点击按钮,或者触发某些事件和后台进行交互时,就需要用到ajax调用后台接口.本文通过一 ...

  6. Java调用第三方接口工具类(json、form)

    1.JSON值访问 /** * 调用对方接口方法 * @param path 对方或第三方提供的路径 * @param data 向对方或第三方发送的数据,大多数情况下给对方发送JSON数据让对方解析 ...

  7. Java调用第三方接口示范

    在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口. 使用流程[1]准备工作:在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的res ...

  8. Vue调用百度接口做百度搜索

    这两天由于学习需要,需要用vue来调用api接口,但是以前没怎么接触过用vue来调用接口,不会没关系,发挥我们强大的学习能力,都不是事,学习了半天基本也就可以初级上手了,写篇随笔记录下来,方便以后回顾 ...

  9. AllJoyn+Android开发案例-android跨设备调用方法

    AllJoyn+Android开发案例-android跨设备调用方法 项目须要涉及AllJoyn开源物联网框架.前面主要了解了一些AllJoyn主要的概念.像总线,总线附件,总线对象,总线接口这种概念 ...

随机推荐

  1. Reproduction CVE_2019_0708

    Xx_introduction Please protection,respect,love,"China's Internet Security Act"! For learni ...

  2. dataguard ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

    错误的意思是listener 不知道连接解析器中的请求服务,这里要说静态监听和动态监听了动态注册是在instance启动的时候PMON进程根据init.ora中的instance_name,servi ...

  3. ANSIBLE安装和常用模块模块使用详细教程

    目录 ANSIBLE安装和各种模块应用功能 安装配置ANSIBLE ANSIBLE使用 ansible-galaxy工具 ansible-pull工具 ansible-playbook ansible ...

  4. 在IIS中部署.net core应用

    在IIS中部署 .NET Core应用 对于熟悉IIS的程序员来说,将 .NET Core Web应用部署在IIS中,无疑是方便统一管理的事情.网上给出很多如何在IIS中部署 .NET Core 应用 ...

  5. C语言函数调用过程,汇编角度查看

    C语言函数调用过程,汇编角度查看 把函数的参数按照调用约定压栈或者存储到寄存器中 调用要使用的函数,先把调用者的地址入栈,方便回来 跳转到函数 把函数使用到的一些寄存器压栈,避免修改寄存器的值 执行函 ...

  6. 使用redisson时关于订阅数的问题

    在使用redisson消息订阅时,我针对门店商品库存减扣进行订阅的操作(在这里一个商品一个监听队列),当正式投入生产时,发现一直再报Subscribe timeout: (" + timeo ...

  7. vc6.0 绿色版 下载地址

    最新版的vs2019已经完全不支持生成运行在xp下的应用程序 每次在xp下测试,都需要配置好vc6.0,但乱七八糟的太多了,给出地址,绿色版可用 http://www.downcc.com/soft/ ...

  8. 对python函数后面有多个括号的理解?

    一般而言,函数后面只有一个括号.如果看见括号后还有一个括号,说明第一个函数返回了一个函数,如果后面还有括号,说明前面那个也返回了一个函数.以此类推. 比如fun()() def fun(): prin ...

  9. [转]BEC Vantage

    https://www.examenglish.com/BEC/BEC_Vantage.html https://www.cambridgeenglish.org/exams-and-tests/bu ...

  10. 数据库迁移导致Unknown character set: 'GBK' 应用异常

    https://blog.csdn.net/u013415591/article/details/82692242https://blog.csdn.net/gx_1_11_real/article/ ...