首页 新闻 会员 周边 捐助

类似反向代理的调度层设计

0
悬赏园豆:50 [已解决问题] 解决于 2014-05-05 09:48

现在要设计一个代理服务器,作用是根据应用服务器性能列表来实现负载均衡。最后希望应用服务器不通过代理直接响应给客户端。请问这种方法是否可行?如果可行,相关技术又该是什么呢?谢谢大家

问题补充:

ja旋律的主页 ja旋律 | 初学一级 | 园豆:157
提问于:2014-04-29 07:53
< >
分享
最佳答案
0

倒是有几种可能的方式,

一是基于重定向,

就是客户端访问网站时请求首先送到代理,代理反馈给客户端一个重定向到应用服务器,客户端最后访问应用服务器,只是第一次重定向时稍有性能损失。

二是基于域名解析,假设你的网站是WWW.test.com,你的代理服务器同时负责你网站内部的域名解析,对

客户端访问WWW.test.com网站时,会首先将域名解析请求发送到你的代理服务器,代理服务器再将域名具体解析为你的应用服务器IP,这样客户端就直接访问了你的应用服务器。

收获园豆:30
hailants | 小虾三级 |园豆:750 | 2014-04-29 10:36

感谢回复!我问题的重点在于,通过代理服务器发送到应用服务器的请求,如何直接应答给客户端?

ja旋律 | 园豆:157 (初学一级) | 2014-04-29 10:45

@ja旋律: 如果你是通过代理与客户端连接,那么应用服务器就不可能直接应答给客户端,HTTP通讯流程如下:

1)客户端向服务器请求建立tcp socket链路,服务器通过链路请求,tcp socket通讯建立。

2)客户端向通过已建立的tcp socket向服务器发送HTTP请求,等待服务器应答,应答超时则断开tcp socket

3)服务器响应客户端HTTP请求,将应答通过已建立的tcp socket发送回客户端

4)客户端确认接收,断开tcp socket

 

客户端如果起始链接的是代理服务器,那么一次HTTP通讯就只在这一个SOCKET链路中进行,客户端怎么可能接收你应用服务器的数据呢?

这就是上面1楼说的,客户端必须再象应用服务器发起一次请求才行。

所以,要么一开始就是直接与应用服务器,要么就重新建立链接。

或者,你伪造应用服务器的TCP包,伪造成从代理服务器发出来的,但是这样的话你就必须自己写应用服务器的通讯底层,得不偿失

hailants | 园豆:750 (小虾三级) | 2014-04-30 08:18
其他回答(1)
0

客户端访问服务器时通过你说的这个代理获得服务器地址,也就是1次连接变2次,可以间隔时间获取分配的服务器地址,

这样能实现一个简单的负载均衡,不是纯实时的.

没必要,还是通过代理访问的好

收获园豆:20
吴瑞祥 | 园豆:29449 (高人七级) | 2014-04-29 09:50

感谢回复,我主要是想问,应用服务器如何不通过代理,直接将响应发送给客户端。有什么技术解决这个问题吗?

支持(0) 反对(0) ja旋律 | 园豆:157 (初学一级) | 2014-04-29 09:58

@ja旋律: 倒也不用什么技术,实现起来会比较麻烦,因为应用服务器想直接返回给客户端的话,要建立一个应用服务器到客户端的连接.这个连接可以通过代理调用应用服务器时传过去,然后应用服务器根据参数建立一个到客户端的连接传输数据,但实际上意义不大,因为也要再建立一次连接,

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-04-29 10:00

@吴瑞祥: 请问,应用服务器在响应给客户端的时候,为什么再建立一次连接呢?可以通过什么手段将request中代理请求地址修改成参数携带的真实客户端地址吗?这样是不是就能够实现直接响应了呢

支持(0) 反对(0) ja旋律 | 园豆:157 (初学一级) | 2014-04-29 10:58

@ja旋律: 隔了一个星期了才来回复你,,

通过什么手段都不能将请求地址修改,

TCP建立一个连接时,2端都是确定好的,也就是说你客户端请求代理服务器这时候会建立一个客户端到代理的TCP连接.这时候你想让客户端跟应用服务器连接,就必须再建立一个客户端到应用服务器的连接,连接一旦建立就不能修改两端,

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-05-04 09:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册