IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 负载均衡超时重发HTTP请求 -> 正文阅读

[系统运维]负载均衡超时重发HTTP请求

一个线上紧急问题,同事排查的,尘埃落定后听他讲述,有意思做了些测试和记录

背景描述:新上线一个比较复杂的批量功能,一次请求后台方法跑个2,3个小时不成问题,方法代码大致模式就是查询出表A中还没有处理的数据,循环数据集,对每行数据一番操作后保存到表B中,并标记表A本条数据已处理,事务每行一提交。

问题现象:表B中数据重复,有不重复的,有重复一次的,有重复两次及以上的

排查前猜想这数据样子肯定是重复请求,代码操作的时候没锁表A,一次请求执行了一半,又来了个请求,第二个请求查询当前还没处理的数据,这部分数据就会重复两次,再第三个第四个请求来,导致重复两次以上。代码确实有问题,没锁表,但是想肯定是用户开了多个功能做重复了啊,赖到用户身上先~

但是用户表情严肃:没人动,自始至终我只点了一下

同事也懵圈,woc点了一下也会重复,http重发?我本地debug 一停就是一上午也没见重发请求啊,自己在生产环境试了一下,还真重复,过一段时间就会收到一个重复的http请求,因为是集群环境,所以怀疑是负载问题,带着发现找硬件F5,捣鼓好久发现F5超时参数配置的时长和重复请求间隔吻合,调长超时时间,问题解决。

F5我是没研究,也没接触过,我用nginx还原一下情况

Nginx重发请求测试

两台电脑,两个tomcat在一台,一个nginx在另一台

项目代码

RestController? Get请求,睡眠30秒模拟业务耗时

两个tomcat上都部署的是这个程序,访问路径??/demo/testGet

Nginx配置

上边测试代码设置的超时为30s,nginx配置的超时就该比30s小,保证nginx超时重试时,代码还卡着

  • keepalive_timeout ?65;? ? ? ? ? ? 与客户端keepalive的超时时间
  • proxy_read_timeout 20;? ? ? ? ? 与被代理的服务器 读超时时间,20s没有收到服务器发来的响应数据,nginx就断开
  • proxy_send_timeout 20;? ? ? ? ? 与被代理的服务器 写超时时间,20s没有发给服务器数据,nginx断开
  • proxy_next_upstream error timeout;? ? nginx失败重发机制的核心参数, 在error或者超时情况下,将请求传递给下一个服务器,可以自定义,例如可以设置服务器返回某个状态码的情况下传递

测试GET

在nginx那台电脑上用浏览器发起请求http://localhost:9258/demo/testGet

确实发现请求在两台tomcat上都来了一次,间隔20s

?通过wireshark抓包也发现,两次HTTP,第一次请求和8080端口三次握手,过了20s,nginx发起FIN关闭socket,并与另一tomcat也就是8010端口三次握手建立连接并发起新的HTTP请求

?测试POST

同样准备了一个Post方法,还是nginx那台电脑postman走一下http://localhost:9258/demo/testPost

?不一样了,post只发了一次

?度了度之后,知道nginx默认只会对幂等的http方法进行重发,幂等的例如(GET/DELETE/PUT),而POST是非幂等的,所以默认不会重发

如果业务需要重试post,需要对nginx的proxy_next_upstream参数追加non_idempotent,如下

proxy_next_upstream error timeout non_idempotent;

?修改参数,nginx -s reload,再次发起post请求,可以看到与Get流程相同,新的http连接到8010端口

控制台都有输出

?

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 09:45:32  更:2021-08-28 09:46:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 11:29:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码