1

嘿,我正在用 Twisted 编写一个应用程序,就目前而言,我有 4 个服务器绑定了两个不同的端口,它们都通过 JSON 与客户端通信。无论如何将这 4 个服务器绑定到同一个端口并且交互保持不变?

例如,假设客户端订阅了两个不同的提要,通过直接套接字传输。

现在我只是喜欢

server1.read_string()
server2.read_string()

它将从相应的提要中读取正确的 JSON 字符串。有没有办法维持这种类型的功能,但在同一个端口上联系我的服务器?

我不想将所有服务器功能都投入到一台大型服务器中,并通过标题前缀对数据进行分区。

我不想做类似的事情

s = server.read_string()
header = s.split(//some delimiter)[0]
if (header == "SERVER1")
{
   // Blahh
}
4

2 回答 2

3

听起来您有许多客户端通过 HTTP 与您的服务器交互。标准解决方案是在客户端和您的服务器之间抛出一个反向代理 - 然后该代理根据 URL 将连接转发到适当的服务器。反向代理可以在您现有的任何服务器或自己的服务器上运行以减轻负载。

如果您的数据是可缓存的,反向代理也可以对您的结果进行缓存。

有许多反向代理可用,您需要根据自己的工作负载类型选择一个。你需要它是高度可配置的吗?数据是公开的还是基于登录的?每个连接持续多长时间/您想要一次保持打开多少个连接?

SquidVarnishHAProxy是很好的反向代理,甚至 Apache 都可以为您做到这一点。

我计划将 HAProxy 用于我的项目 Gridspy,因为我与我的客户有许多持续的连接,并且希望将一个轨道服务器放置在与我的 django 服务器相同的 URL 路径中。有关如何将端口 80 上的多个连接从一台服务器转发到多个服务器的更多信息,请参阅本教程。本教程的重点是 Comet,但您的问题比这更简单。

如果您正在考虑从浏览器到服务器的持续 tcp/ip 连接,请认真考虑Orbited。请参阅本教程关于通过轨道和 morbidQ 的图形。Orbited 还将比大多数自定义解决方案更好地穿透防火墙和代理,因为它看起来像正常的 HTTP 流量。

于 2009-10-18T23:21:10.060 回答
1

为了让同一台机器上运行的多个服务器都绑定到同一个端口,它们需要绑定到不同的 IP 地址。绑定到同一个 IP 上的同一个端口的唯一方法是启用套接字的 SO_REUSESOCKET 选项,但随后多个服务器将能够接收彼此的入站数据,这确实会扰乱您的通信。

否则,最好有一个使用标头来识别特定提要的服务器。你为什么不想那样做?

于 2009-10-08T20:53:17.463 回答