【发布时间】:2011-12-06 05:56:31
【问题描述】:
我正在做一个项目
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 服务器,并尝试使用 tcp 端口转发使用http://code.google.com/p/portforward/ 和我通过搜索找到的其他类似内容。问题是这使用了没有请求 uri 的 InetAddress(使用子域从uri)
2.在嵌入式码头中将服务器进程作为 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)(我不确定)。它们与基于应用程序的传入请求相匹配-名称。下面讨论 http://www.quora.com/Scalability/How-does-Heroku-work 但这个问题没有得到解答。
我在这方面被困了很长一段时间。非常感谢您的帮助。
【问题讨论】:
-
Heroku 只允许端口 80 和端口 443 上的入站连接 - 我认为在这种情况下你排除了 Heroku?
-
是否有可能让一台主机连接知道 client_id 到 host_x:port_x 的映射的“连接分配器”?该主机可以简单地告诉请求客户端适当的重定向。还是您的问题是您无法从请求中获取 client_id?如果是这样:这些客户可以在他们的请求中简单地告诉“我是客户###”吗?
-
xmoex@ 服务器上发生的事情应该对客户端隐藏。客户端应该使用他们已知的端点发出请求。
-
@JohnBeynon Herkou 只允许在 80,443 上进行连接,但服务器进程将在不同的端口上运行。我的问题是它们如何根据 url 转发请求。
-
是客户端浏览器吗?或者他们是原始的 tcp 客户端?
标签: java tcp heroku load-balancing portforwarding