解决方案:如何让ADC产品将HTTP请求负载的更加均衡

简介:

最近的一次POC测试,获得了一些有意思的经验,分享给大家。客户目前的需求和问题大致是这样的:

1、首先,应用服务器端需要保持TCP长连接,客户端关闭TCP连接后,服务器端连接不能关闭;

2、其次,登陆应用系统需要做源IP地址鉴权,就是要除了验证登陆用户名和密码以外,还需要验证登陆请求来源的IP地址;

3、目前的问题是客户端向系统发送请求的差异很大!客户端与服务器建立TCP长连接后,有一部分客户端会在一个TCP连接里发送大量的HTTP请求,这些是合法的正常请求,因此,会造成与部分应用服务器访问压力比较大,甚至会造成服务器Web进程瘫痪的现象;

了解了客户的需求和问题以后,按照以往的经验和做法,看到服务器端需要保持TCP长连接,首先想到的就是利用TCP连接复用,刚好可以满足客户的第一个需求,ADC(应用交付控制器)和服务器保持TCP长连接,当客户端完成请求并获得应答后,ADC正常关闭客户端的TCP连接,OK第一个需求可以满足。

让我们再看看第二个需求,按照这个需求,应用系统需要获得客户端的源IP地址。很不幸,按照TCP连接复用的工作机制,ADC设备需要改变客户端的源IP地址,或者复用部分客户的源地址(类似F5的One-Connect做法)。这样的话,应用系统就无法完成源IP地址的鉴权。分析到这里,矛盾出来了,客户第一个和第二个需求似乎是相互排斥的!怎么办呢?一个折中的办法,由于应用系统是基于HTTP协议做的,是不是可以在ADC设备上启用客户端IP地址的插入功能,将客户端地址插入到HTTP Header中,发送到应用服务器。很不幸,由于对应用系统改动比较大,所以客户不能接受这个折中的解决办法,那怎么办?让我们暂时搁置这个问题,再看看目前客户的第三个问题。

按照第三个问题的描述,可以看到基于连接的负载分担算法是无法真正解决目前的问题,如果能够按照请求进行负载分担可能会解决这个问题。ADC在七层工作模式下,如果能把来自同一个客户端TCP连接的不同HTTP请求,按照预定的负载分担算法分配到不同的应用服务器上就可以解决请求分发的问题。让我们再进一步预想一下,如果ADC产品为每个客户端请求,与应用服务器都建立一个TCP短连接,是不是会造成服务器频繁的开启/关闭连接,无形中反而增加了服务器的压力?那么如果ADC产品能够与服务器端保持TCP长连接,只要客户端有请求过来,就利用原有的服务器长连接去转发客户端请求,那不是刚好也可以解决第一个和第二个需求!如果是这样的工作机制,那么就太理想了!一举三得的事情!

那么应该启用什么功能可以实现呢?让我们在HTTP应用相关的功能模板里寻找一下,不难发现有一个小的feature从字面理解看,也许就是我们要找的解决问题的Key,是什么呢?Strict Transaction Switching:严格事务交换,那何为Transaction呢?不就是一个request请求嘛,在手册中这个功能的描述是这样的,缺省情况下,AX设备会为客户端会话的第一个request选择一个服务器,来建立服务器端的连接,之后在这个会话里所有的客户端requests,AX都会自动的把这些reuqests发送到同一台服务器上。当开启了STS(Strict Transaction Switching)功能,AX设备就会改变缺省的机制,对每个会话中的所有requests都会按照负载算法选择一个最佳的服务器。到这里我们已经可以基本确认STS就是我们要的解决办法。那会不会出现AX设备为每个request去和服务器建立一个短连接呢?这个手册中没有提及,OK让我们搭建一个环境试一试,或者直接在客户测试环境中尝试一下,并在AX设备上开启debug,验证一下从客户端~AX~服务器端完整的TCP连接建立过程,以及连接关闭过程,就可以确认我们的解决办法是可行的!

经过验证,没有问题!客户端同一个会话中不同的requests会负载到不同的服务器上,服务器应答后,AX也不会关闭与服务器的连接。即使客户端关闭了连接,用新的TCP连接发送后续的requests,AX设备依然可以利用原有的服务器连接传递这些requests。至此,客户那边的需求和问题都可以解决了!另外,在测试过程中,负载均衡算法,经过不同算法的验证,在AX上采用“严格轮询”算法,服务器负载非常均衡,相对比较不推荐使用“最少连接”或者“最少请求”的算法,这些算法会造成处理请求快的服务器负载稍高些。

同样的如果我们遇到了个别类似CC攻击情况,一个会话中发送大量HTTP请求,除了制定一些速率限制和安全限制策略(PBSLB)外,也可以尝试开启STS功能,将这些请求分散到不同的服务器上去。


本文转自 virtualadc 51CTO博客,原文链接:http://blog.51cto.com/virtualadc/780765

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
17天前
|
Java
java原生发送http请求
java原生发送http请求
|
24天前
|
网络协议 Linux iOS开发
推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求
推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求
55 1
|
1月前
|
编解码 测试技术 索引
性能工具之 Jmeter 使用 HTTP 请求编写 HLS 脚本
在我们简要介绍了 HLS 协议的基础知识,接下来我们详细介绍一种使用 Jmeter 编写压测 HLS 协议脚本的方法。
73 1
性能工具之 Jmeter 使用 HTTP 请求编写 HLS 脚本
|
1月前
|
JSON 数据格式
第三方系统或者工具通过 HTTP 请求发送给 ABAP 系统的数据,应该如何解析试读版
第三方系统或者工具通过 HTTP 请求发送给 ABAP 系统的数据,应该如何解析试读版
27 0
|
1月前
|
Java Spring
用spring发送http请求
用spring发送http请求
|
6天前
|
安全 Java 网络安全
Servlet 教程 之 Servlet 客户端 HTTP 请求 2
Servlet教程介绍了如何在Servlet中处理HTTP请求,包括获取Cookie、头信息、参数、Session等。方法如:`getCookies()`、`getAttributeNames()`、`getHeaderNames()`、`getParameterNames()`等。还能获取身份验证类型、字符编码、MIME类型、请求方法、远程用户信息、URL路径、安全通道状态以及请求内容长度等。此外,可通过`getSession()`创建或获取Session,并以`Map`形式获取参数。
20 8
|
1天前
|
JSON 数据格式 索引
ES 查看索引的属性的http请求
在 Elasticsearch 中,要查看索引的属性,可以通过发送 HTTP 请求来执行以下操作: 1. **获取索引的映射(Mapping)**: 可以使用 `GET` 请求访问 Elasticsearch 的 `_mapping` 端点来获取特定索引的映射信息。 示例请求: ```http GET http://<elasticsearch_host>:<port>/<index_name>/_mapping ``` 2. **获取索引的设置(Settings)**: 可以使用 `GET` 请求访问 Elasticsearch 的 `_setting
|
2天前
|
JSON 测试技术 API
Python的Api自动化测试使用HTTP客户端库发送请求
【4月更文挑战第18天】在Python中进行HTTP请求和API自动化测试有多个库可选:1) `requests`是最流行的选择,支持多种请求方法和内置JSON解析;2) `http.client`是标准库的一部分,适合需要低级别控制的用户;3) `urllib`提供URL操作,适用于复杂请求;4) `httpx`拥有类似`requests`的API,提供现代特性和异步支持。根据具体需求选择,如多数情况`requests`已足够。
9 3
|
10天前
|
安全 网络安全 开发工具
对象存储oss使用问题之flutter使用http库进行post请求文件上传返回400如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
33 1
|
1月前
|
JSON 前端开发 数据格式
糊涂工具类真是场景下请求http接口的案例
糊涂工具类真是场景下请求http接口的案例
21 0