研发中心/王鹏 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. WPF布局容器

    1.StackPanel:堆栈面板,通过Orientation属性设置子元素的布局排列方向为“Vertical”(垂直)和“Horizontal”(水平),不写其默认值为“Vertical”,当设置为 ...

  2. react-native run-ios “Could not find iPhone X simulator”

    问题 这个问题发生在旧的RN版本(0.57,0.58(<0.58.4),-)和Xcode 10.3中,其中可用模拟器的名称得到了一些调整 在文件node_modules/@react nativ ...

  3. 林克的小本本之——HCL网络知识随笔

    单臂路由 单臂路由是一种通过在路由器的一个接口上配置逻辑接口,来实现不同Vlan之间互通的方法. 实例: #配置SW1的VLAN [SW1]vlan 2 #配置端口vlan略 [SW1]int g1/ ...

  4. Linux下利用coredump技术追查进程崩溃原因

    原文链接:https://blog.csdn.net/u014585564/article/details/68063269 最近项目中出现了一个问题,服务器端程序会突然崩溃退出,我们采取了cored ...

  5. UE4入门学习笔记开篇

    做了3年的Unity, 现在开始转入到做UE4,一来就进入一个超大项目组中学习,度过了最初2个月的生涩和紧张后,现在准备开始慢慢总结,慢慢学习,逐步深入理解和研究UE. 做了3年的游戏开发后,个人感悟 ...

  6. 0基础-scp命令一学就会

    scp -P 22 -r  /home/server Android@192.168.1.110:/opt    将本地/home/server的文件夹上传到远端服务器192.168.1.110的目录 ...

  7. YII2中andWhere多个or查询

    使用多个or的复杂查询: AND ((`name`='张三') OR (`name`='李四') OR (`name`='王五')) // AND ((`name`='张三') OR (`name`= ...

  8. 针对上一篇prim最后的完善结果

    edge* Graph::prim(int cur) { if (cur >= this->vertexNum) { return NULL; } int *weight = new in ...

  9. Vue之循环遍历Json数据,填充Table表格

    简单记一次Vue循环遍历Json数据,然后填充到Table表格中,展示到前端的代码: async getData(id) { const res = await this.$store.api.new ...

  10. IP地址的格式和分类

    IP地址 IP地址时IP协议提供的一种地址格式,它为互联网上的网络设备分配一个用来通信的逻辑地址,目前分为IP v4和IP v6两种,v4的意思是version4,v6是同样的意思. IP v4 IP ...