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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介:

最近的一次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

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
1月前
|
数据采集
Haskell爬虫:连接管理与HTTP请求性能
Haskell爬虫:连接管理与HTTP请求性能
|
16天前
|
监控 网络协议 应用服务中间件
【Tomcat源码分析】从零开始理解 HTTP 请求处理 (第一篇)
本文详细解析了Tomcat架构中复杂的`Connector`组件。作为客户端与服务器间沟通的桥梁,`Connector`负责接收请求、封装为`Request`和`Response`对象,并传递给`Container`处理。文章通过四个关键问题逐步剖析了`Connector`的工作原理,并深入探讨了其构造方法、`init()`与`start()`方法。通过分析`ProtocolHandler`、`Endpoint`等核心组件,揭示了`Connector`初始化及启动的全过程。本文适合希望深入了解Tomcat内部机制的读者。欢迎关注并点赞,持续更新中。如有问题,可搜索【码上遇见你】交流。
【Tomcat源码分析】从零开始理解 HTTP 请求处理 (第一篇)
|
5天前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
10 1
|
24天前
|
JSON JavaScript 前端开发
Haskell中的数据交换:通过http-conduit发送JSON请求
Haskell中的数据交换:通过http-conduit发送JSON请求
|
27天前
|
JSON API 开发者
Python网络编程新纪元:urllib与requests库,让你的HTTP请求无所不能
【9月更文挑战第9天】随着互联网的发展,网络编程成为现代软件开发的关键部分。Python凭借简洁、易读及强大的特性,在该领域展现出独特魅力。本文介绍了Python标准库中的`urllib`和第三方库`requests`在处理HTTP请求方面的优势。`urllib`虽API底层但功能全面,适用于深入控制HTTP请求;而`requests`则以简洁的API和人性化设计著称,使HTTP请求变得简单高效。两者互补共存,共同推动Python网络编程进入全新纪元,无论初学者还是资深开发者都能从中受益。
39 7
|
25天前
|
开发者
HTTP状态码是由网页服务器返回的三位数字响应代码,用于表示请求的处理结果和状态
HTTP状态码是由网页服务器返回的三位数字响应代码,用于表示请求的处理结果和状态
24 1
|
2月前
|
缓存 网络协议 安全
揭秘浏览器背后的神秘之旅:一网打尽HTTP请求流程,让你网络冲浪更顺畅!
【8月更文挑战第31天】当在浏览器中输入网址并按下回车键时,一系列复杂的HTTP请求流程随即启动。此流程始于DNS解析,将域名转化为IP地址;接着是与服务器的TCP三次握手建立连接。连接建立后,浏览器发送HTTP请求,其中包含请求方法、资源及版本等信息。服务器接收请求并处理后返回HTTP响应,包括状态码、描述及页面内容。浏览器解析响应,若状态码为200则渲染页面,否则显示错误页。整个流程还包括缓存处理和HTTPS加密等步骤,以提升效率和保障安全。理解该流程有助于更高效地利用网络资源。通过抓包工具如Wireshark,我们能更直观地观察和学习这一过程。
43 4
|
1月前
|
JSON 监控 API
http 请求系列
XMLHttpRequest(XHR)是一种用于在客户端和服务器之间进行异步HTTP请求的API,广泛应用于动态更新网页内容,无需重新加载整个页面。本文提供了多个官方学习资源,包括MDN Web Docs、WhatWG和W3C的规范文档,涵盖属性、方法、事件及示例代码。XHR的主要应用场景包括动态内容更新、异步表单提交、局部数据刷新等,具有广泛的支持和灵活性,但也存在处理异步请求的复杂性等问题。最佳实践包括使用异步请求、处理请求状态变化、设置请求头、处理错误和超时等。这些资源和实践将帮助你更好地理解和使用XHR。
24 1
|
2月前
|
NoSQL 关系型数据库 Serverless
函数计算产品使用问题之通过http调用时,如何定义结构体传参
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
函数计算产品使用问题之通过http调用时,如何定义结构体传参
|
27天前
|
存储 JSON API
Python编程:解析HTTP请求返回的JSON数据
使用Python处理HTTP请求和解析JSON数据既直接又高效。`requests`库的简洁性和强大功能使得发送请求、接收和解析响应变得异常简单。以上步骤和示例提供了一个基础的框架,可以根据你的具体需求进行调整和扩展。通过合适的异常处理,你的代码将更加健壮和可靠,为用户提供更加流畅的体验。
65 0

热门文章

最新文章

下一篇
无影云桌面