使用子域进行负载均衡/ TCP端口转发

时间:2011-12-06 05:56:32

标签: java tcp heroku load-balancing portforwarding

我正在开展一个项目

1.这需要多个进程监听唯一端口(可能在多个主机上)上的请求

2.每个流程都旨在为独特的客户提供服务

3.客户端应使用client_id.domainname.com作为标识符/端点连接到各自的服务器进程。

例:   请求来

client_id_1.domainname.com:FIXED_PORT should go to host_1:port_1
client_id_2.domainname.com:FIXED_PORT should go to host_2:port_2    
etc..
[Edited for clarification : the port number with which client will access should be fixed.Only the client_id would change with change in client]

4. [编辑(错过了这一点)]。映射需要是动态的/可修改的。例如,如果一个进程死掉,另一个必须被启动,这可能不在同一个端口上

我尝试了以下方法(使用java)

1.实现tcp服务器,并尝试使用http://code.google.com/p/portforward/和我通过搜索找到的其他类似的东西使用tcp portforwarding。问题是这使用InetAddress没有请求uri(使用客户端ID获取来自uri的子域名

2.实现服务器进程作为嵌入式jetty中的Servlet。这仅适用于GET请求。可以使用

将GET请求重定向到特定服务器
httpServletResonse.sendRedirect("http://host_1:port_1")
对于POST,我们有RequestDispatcher,它最终会产生一个GET。似乎HTTP规范不允许使用POST进行重定向。

我还发现这个Calling the doPost in another Webapp with a Req Dispatcher forward建议以编程方式自己发出一个POST请求。(我还没有采用过这种方法)

我希望有一个解决方案。 我可能非常过于简单化,但我认为这与HEROKU的做法类似。他们还有后端进程(dynos)在不同的端口上运行(我不确定这个)。它们与基于应用程序的传入请求匹配 - name。以下讨论 http://www.quora.com/Scalability/How-does-Heroku-work但这个问题没有得到解答。

我已经被困了很长时间了。我真的很感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

这在Heroku堆栈上是不可能的,因为它只支持标准的HTTP和HTTPS端口(80& 443)。当您启动流程时,服务所连接的端口由Heroku基础架构决定(请参阅$PORT and Procfiles)。

尝试做任何不适合这种模式的事情,直到他们支持更多端口才真正起作用。