将单个端口用于多个插槽的标准方法?

时间:2009-10-08 20:48:12

标签: networking sockets network-programming twisted

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

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

现在我只是喜欢

server1.read_string()
server2.read_string()

它将从相应的Feed中读取正确的JSON字符串。无论如何都要维护这种类型的功能,但是在同一个端口上联系我的服务器?

我不想将所有服务器功能放入一个大型服务器,并按标头前缀对数据进行分区。

我不想做像

这样的事情
s = server.read_string()
header = s.split(//some delimiter)[0]
if (header == "SERVER1")
{
   // Blahh
}

2 个答案:

答案 0 :(得分:3)

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

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

有许多可用的反向代理,您可能希望根据您拥有的工作负载选择一个代理。您是否需要高度可配置?数据是公开的还是基于登录?每个连接持续多长时间/您要连接多少个连接?

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

我计划将HAProxy用于Gridspy, my project,因为我与客户有很多持续的连接,并希望将一个轨道服务器放在与我的django服务器相同的URL路径中。有关如何将端口80上的多个连接从一个服务器转发到多个服务器的详细信息,请参阅This tutorial。本教程主要关注Comet,但问题甚至比这更简单。

如果您正在考虑从浏览器连续的tcp / ip连接回到您的服务器,请认真考虑Orbited。有关graphs via orbited and morbidQ的信息,请参阅本教程。 Orbited还将比大多数自定义解决方案更好地穿越防火墙和代理,因为它看起来像普通的HTTP流量。

答案 1 :(得分:1)

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

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