昨天生产系统上报出一个问题:用户做一次扫码交易,出现了两条交易记录。幸好支付渠道对支付码有限制只成功了一笔,没有出现多扣钱的问题。

现在我们要排查一下,为什么做一次操作会出现两条交易记录。

我们的后台服务是部署了双机,通过阿里云的SLB做负载。在部署服务的两台机器上分别查到了两次交易记录的日志。

一台机器 2021-12-14 13:56:30.100 收到请求,中间调用支付渠道服务耗时2秒,最终2021-12-14 13:56:33.023 返回结果。

另一台机器 2021-12-14 13:56:31.275 收到请求,调用支付渠道服务时报错,2021-12-14 13:56:31.908 返回结果。

后台服务分别收到了请求,现在要确认的是:是SLB转发了两次,还是客户端做了两次请求。

联系阿里云的人协助排查SLB的日志。最终在SLB上也找到了两次请求。两次请求的IP还不一样。一个是移动的一个是电信的。因为商户仅有一台智能POS机,不可能是同时用两台做扫码支付。

猜测是android或java的重发机制。在网络上确实查到有人遇到过类似的问题:Android或者Java发送Http自动重发请求的解决方案

    由于设置了链接与获取数据的超时时间,客户端在发送数据之后,检测到可能并没有发送成功到后端,这个时候http底层会自动重发请求(注意是Http底层,所以应用端不会知道发送了多次请求)。如果应用端自动重发了多次请求,后端也回复了多次请求,但是前段仅仅会只回复1次请求。所以为了解决这个问题,只要在DefaultHttpClient设置如下代码即可解决:

    defaultHttpClient.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(0,false));

于是,我们可以给出一个解释: 用户做扫码操作时,网络出现问题,智能POS从WiFi连接自动切换到了移动连接,此时客户端做了一次请求重发。

因为智能POS是android系统,我们部署在智能POS上的支付app是使用okhttp发起后端请求的,需要修改okhttp相关的代码来规避这个问题.

当然,网上也能找到遇到类似问题的人:实现OkHttp自定义重试次数 我们不需要自定义重试次数,我们要禁止重试。所以只需要在构建okhttpClient的时候加一句

    retryOnConnectionFailure(false)

至此,问题定位修改完成,待系统升级后继续观察。

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
原文: https://wangxuan.me/tech/2021/12/15/android-http-request-resend-bug-fix.html

android端http请求重发问题定位过程的更多相关文章

  1. 【Android端 APP GPU过度绘制】GPU过度绘制及优化

    一.Android端的卡顿 Android端APP在具体使用的过程中容易出现卡顿的情况,比如查看页面时出现一顿一顿的感受,切换tab之后响应很慢,或者具体滑动操作的时候也很慢. 二.卡顿的原因 卡顿的 ...

  2. Java服务器对外提供接口以及Android端向服务器请求数据

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5056780.html 讲解下java服务器是如何对移动终端提供接口的,以什么数据格式提供出去,移动端又是怎么 ...

  3. Android端百度地图API使用详解

    百度地图API简介 百度地图移动版API(Android)是一套基于Android设备的应用程序接口,通过该接口,可以轻松的访问百度服务和数据,构建功能丰富.交互性强的地图应用程序. 百度地图移动版A ...

  4. 【转载】Android端百度地图API使用详解

    转载地址:http://www.cnblogs.com/rocomp/p/4994110.html 百度地图API简介 百度地图移动版API(Android)是一套基于Android设备的应用程序接口 ...

  5. Android ListView分页载入(服务端+android端)Demo

    Android ListView分页载入功能 在实际开发中经经常使用到,是每一个开发人员必须掌握的内容,本Demo给出了服务端+Android端的两者的代码,并成功通过了測试. 服务端使用MyEcli ...

  6. Vue项目用于Ios和Android端开发

    起因 前公司商城App项目使用的是H5开发,有微信公众号.Ios和Android三个版本,H5版本是自己写的一套框架,已经用了有些年头了,承载不下不断涌现出的新需求.而Ios和Android端通过we ...

  7. Macaca初体验-Android端(Python)

    前言: Macaca 是一套面向用户端软件的测试解决方案,提供了自动化驱动,周边工具,集成方案.由阿里巴巴公司开源:http://macacajs.github.io/macaca/ 特点: 同时支持 ...

  8. 用.Net打造一个移动客户端(Android/IOS)的服务端框架NHM(四)——Android端Http访问类(转)

    本章目的 在上一章中,我们利用Hibernate Tools完成了Android Model层的建立,依赖Hibernate Tools的强大功能,自动生成了Model层.在本章,我们将继续我们的项目 ...

  9. ProtocolBuffer在Android端的解析

    开题篇 近期公司在使用Protocol Buffer替代原先的json作为移动端的数据交互格式.虽然服务端和CTO把这项新技术吹的天花乱坠,说什么体积小,不易被破解乱七八糟的.可是作为Android端 ...

  10. 如何做好 Android 端音视频测试?

    在用户眼中,优秀的音视频产品应该具有清晰.低延时.流畅.秒开.抗丢包.高音效等特征.为了满足用户以上要求,网易云信的工程师通过自建源站,在SDK端为了适应网络优化进行QoS优化,对视频编码器进行优化, ...

随机推荐

  1. 重新整理.net core 计1400篇[八] (.net core 中的依赖注入的深入理解)

    生命周期策略 在实例Transient 和 Scoped 中,所以实现Idisposable 接口的服务实例会被当前IServiceProvider 对象保存起来,当IService 对象的Dispo ...

  2. 《领域驱动设计》:从领域视角深入仓储(Repository)的设计和实现

    简介: <领域驱动设计>中的Repository(下面将用仓储表示)层实际上是极具有挑战性的,对于它的理解,也十分重要.本文讲大部分内容都在众多前辈理论基础上,从一个崭新的领域视觉开始探索 ...

  3. 浅谈 Node.js 热更新

    简介: 记得在 15 16 年那会 Node.js 刚起步的时候,我在去前东家的入职面试也被问到了要如何实现 Node.js 服务的热更新. 记得在 15 16 年那会 Node.js 刚起步的时候, ...

  4. Spring Cloud Bus 消息总线介绍

    简介: 本文配套可交互教程已登录阿里云知行动手实验室,PC 端登录 start.aliyun.com 在浏览器中立即体验. 作者 | 洛夜来源 | 阿里巴巴云原生公众号 本文配套可交互教程已登录阿里云 ...

  5. CNCF TOC 委员张磊:不断演进的云原生给我们带来了什么?

    简介: 任何一种云原生技术,它不再是某种能力的弥补,而是更多地将云的能力以某种方式更简单.更高效地透出给我的应用去使用.无论是容器.K8s 还是 Service Mesh,他们都是在不同的环节帮助应用 ...

  6. 阿里云RDS深度定制-XA Crash Safe

    ​简介: 近几年,随着分布式数据库系统的兴起,特别是基于MySQL分布式数据库系统,会用到XA来保证全局事务的一致性.众所周知,MySQL对XA事务的支持是比较弱的,存在很多问题.为了满足分布式数据库 ...

  7. 顺丰科技 Hudi on Flink 实时数仓实践

    ​简介: 介绍了顺丰科技数仓的架构,趟过的一些问题.使用 Hudi 来优化整个 job 状态的实践细节,以及未来的一些规划. 本文作者为刘杰,介绍了顺丰科技数仓的架构,趟过的一些问题.使用 Hudi ...

  8. 快速入门一篇搞定RocketMq-实现微服务实战落地

    1.RocketMq介绍 RocketMQ起源于阿里巴巴,最初是为了解决邮件系统的高可靠性和高性能而设计的.在2016年开源分布式消息中间件,并逐渐成为Apache顶级项目.现在是Apache的一个顶 ...

  9. 教你用Perl实现Smgp协议

    本文分享自华为云社区<华为云短信服务教你用Perl实现Smgp协议>,作者:张俭. 引言&协议概述 中国电信短消息网关协议(SMGP)是中国网通为实现短信业务而制定的一种通信协议, ...

  10. 面对Centos7系统的openssl版本升级

    CentOS7的版本系统,默认的OpenSSL的版本为OpenSSL 1.0.2k-fips 26 Jan 2017.但是openssl需要的版本需要较高的版本.通过下载最新的openssl版本.对o ...