我有一组SOCKS代理,它们位于负载平衡器(具体来说是AWS网络负载平衡器)后面。当负载均衡器在SOCKS端口上接收到请求时,它将请求转发给Docker容器(代理)使用最少的活动连接。
我有一个使用标准HTTP包的Go应用程序。我想使用这个包对SOCKS代理的内置支持,并将其指向我的负载平衡器的地址。
我的问题是,Go HTTP客户端:
- 开放和维护一个TCP连接到袜子代理我点(一个TCP连接所有的HTTP连接,它使开放),
- 为每个HTTP连接打开并维护到SOCKS代理的TCP连接(即SOCKS代理连接与打开/空闲HTTP连接的一对一关系),
- 为每个HTTP/S请求打开并随后关闭到SOCKS代理的TCP连接,无论HTTP客户端上的并发/空闲连接设置如何,或
- 做一些完全不同的事情?
如果答案是(1)或(2),是否有一种方法来防止这种行为,并确保它总是为每个HTTP/S请求重新连接到SOCKS代理?
我想这样做的原因是为了确保请求在多个代理之间进行平衡,而不是在客户端(每个代理可能有许多并发请求)在代理之间进行平衡。具体来说,假设我在负载均衡器后面有3个代理,标记为A, B和c。假设我有两个应用程序,1和2。应用程序1每秒发出5个HTTP请求,应用程序2每秒发出500个HTTP请求。
我想避免的是让应用程序1与负载平衡器建立SOCKS连接,并将其转发给代理a,并将该连接转发给正在维护的代理,而应用程序2与负载平衡器建立SOCKS连接并将其转发给代理B,这也是维护的。如果发生这种情况,代理A将处理5个请求/秒,而代理B将处理500个请求/秒,这显然是严重不平衡的。我希望这三个代理都能得到每秒168个请求。
SOCKS与协议无关。它不知道什么是HTTP请求,只知道什么是TCP连接,这是由代理隧道。因此,每个由HTTP栈引起的TCP连接都意味着通过代理建立一个新的连接——没有重用。如果您想确保每个HTTP/S请求都通过代理获得自己的连接,则必须禁用HTTP keep-alive。关于如何做到这一点,请参阅这个问题。