2009-10-08 23 views
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 
} 

回答

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

爲了在同一臺機器都綁定到相同的端口上運行多個服務器,它們需要綁定到不同的IP地址。綁定到同一個IP上同一個端口的唯一方法是啓用套接字的SO_REUSESOCKET選項,但是然後多個服務器將能夠接收對方的入站數據,真的會搞亂你的通信。

否則,使用標頭來標識特定提要的單個服務器是最好的。你爲什麼不想這樣做?

+0

我需要在客戶端的頭,以及是的?有沒有更好的方法來傳輸標題數據,而不是直接在郵件正文中傳輸,就像我上面顯示的那樣? – DevDevDev 2009-10-08 21:04:53

+0

頭部必須位於消息數據本身中。當收到消息的任何一端時,接收者可以識別消息與哪個消息相關。 – 2009-10-08 21:22:11

相關問題