RCA:收单设备调用云端接口频繁超时排查总结
研发中心/王鹏 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:收单设备调用云端接口频繁超时排查总结的更多相关文章
- Kafka 异步消息也会阻塞?记一次 Dubbo 频繁超时排查过程
线上某服务 A 调用服务 B 接口完成一次交易,一次晚上的生产变更之后,系统监控发现服务 B 接口频繁超时,后续甚至返回线程池耗尽错误 Thread pool is EXHAUSTED.因为服务 B ...
- singleCall单来源调用解析及实现
定义: 单来源调用指一个类的生成工作只能由特定类来执行. eg李宁牌鞋子只能由李宁专卖店生产 这个问题归结起来,也就是说在工厂模式中,指定的产品类只能通过具体的特定工厂类来生成,而不能自己new出来或 ...
- android应用程序如何调用支付宝接口
最近在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口,因为用的人比较多. 在网上搜索了以下,有很多这方面的教程,但大部分教程过于陈旧,而且描述的过于简单.而且支付宝提供的接口一直在 ...
- android应用程序如何调用支付宝接口(转)
最近在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口,因为用的人比较多. 在网上搜索了以下,有很多这方面的教程,但大部分教程过于陈旧,而且描述的过于简单.而且支付宝提供的接口一直在 ...
- thinkjs学习-this.assign传递数据和ajax调用后台接口
在页面加载时,就需要显示在页面上的数据,可以在后台使用this.assign赋值,在前台通过ejs等模板获取:用户点击按钮,或者触发某些事件和后台进行交互时,就需要用到ajax调用后台接口.本文通过一 ...
- Java调用第三方接口工具类(json、form)
1.JSON值访问 /** * 调用对方接口方法 * @param path 对方或第三方提供的路径 * @param data 向对方或第三方发送的数据,大多数情况下给对方发送JSON数据让对方解析 ...
- Java调用第三方接口示范
在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口. 使用流程[1]准备工作:在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的res ...
- Vue调用百度接口做百度搜索
这两天由于学习需要,需要用vue来调用api接口,但是以前没怎么接触过用vue来调用接口,不会没关系,发挥我们强大的学习能力,都不是事,学习了半天基本也就可以初级上手了,写篇随笔记录下来,方便以后回顾 ...
- AllJoyn+Android开发案例-android跨设备调用方法
AllJoyn+Android开发案例-android跨设备调用方法 项目须要涉及AllJoyn开源物联网框架.前面主要了解了一些AllJoyn主要的概念.像总线,总线附件,总线对象,总线接口这种概念 ...
随机推荐
- WPF布局容器
1.StackPanel:堆栈面板,通过Orientation属性设置子元素的布局排列方向为“Vertical”(垂直)和“Horizontal”(水平),不写其默认值为“Vertical”,当设置为 ...
- 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 ...
- 林克的小本本之——HCL网络知识随笔
单臂路由 单臂路由是一种通过在路由器的一个接口上配置逻辑接口,来实现不同Vlan之间互通的方法. 实例: #配置SW1的VLAN [SW1]vlan 2 #配置端口vlan略 [SW1]int g1/ ...
- Linux下利用coredump技术追查进程崩溃原因
原文链接:https://blog.csdn.net/u014585564/article/details/68063269 最近项目中出现了一个问题,服务器端程序会突然崩溃退出,我们采取了cored ...
- UE4入门学习笔记开篇
做了3年的Unity, 现在开始转入到做UE4,一来就进入一个超大项目组中学习,度过了最初2个月的生涩和紧张后,现在准备开始慢慢总结,慢慢学习,逐步深入理解和研究UE. 做了3年的游戏开发后,个人感悟 ...
- 0基础-scp命令一学就会
scp -P 22 -r /home/server Android@192.168.1.110:/opt 将本地/home/server的文件夹上传到远端服务器192.168.1.110的目录 ...
- YII2中andWhere多个or查询
使用多个or的复杂查询: AND ((`name`='张三') OR (`name`='李四') OR (`name`='王五')) // AND ((`name`='张三') OR (`name`= ...
- 针对上一篇prim最后的完善结果
edge* Graph::prim(int cur) { if (cur >= this->vertexNum) { return NULL; } int *weight = new in ...
- Vue之循环遍历Json数据,填充Table表格
简单记一次Vue循环遍历Json数据,然后填充到Table表格中,展示到前端的代码: async getData(id) { const res = await this.$store.api.new ...
- IP地址的格式和分类
IP地址 IP地址时IP协议提供的一种地址格式,它为互联网上的网络设备分配一个用来通信的逻辑地址,目前分为IP v4和IP v6两种,v4的意思是version4,v6是同样的意思. IP v4 IP ...