2015-08-15 71 views
1

我創造的一個的NodeJS長輪詢的聊天應用程序的HTTP響應不使用Socket.io和使用羣集進行縮放。如何堅持Redis的

我必須找到一種方法來存儲所有長輪詢的HTTP請求和響應對象,以便它可以跨所有節點羣集使用(這樣,當收到長查詢請求的消息時,我可以得到請求,並對其作出反應)

我一直在使用Redis的嘗試,但是,當我字符串化的HTTP請求和響應對象,我得到「無法字符串化的環狀結構」錯誤。

也許我正在以一種錯誤的方式接近它。在那種情況下,我們通常如何在不同的集羣上實施lon-polling?

+0

我很好奇,爲什麼「不使用Socket.io?」 – mscdex

+0

這是公司給我的問題的一部分。我忍不住:) –

回答

0

你在問什麼似乎有點困惑。

在長輪詢的情況下,客戶端發出被路由到特定的HTTP服務器的HTTP請求。如果沒有滿足該請求的數據立即可用,則該請求會在一段延長的時間內保持活動狀態,並且最終會超時並且客戶端將發出另一個長輪詢請求,或者一些數據將變爲可用並且響應將是返回到請求。

因此,你不要試圖集中保存請求和響應的對象使集羣這項工作。這些屬於特定服務器和特定客戶端之間的特定TCP連接。你不能保存它們並在其他地方使用它,也不能幫助任何集羣工作。

我認爲你在這裏遇到的集羣問題是,當某些數據變爲可用於特定客戶端時,你需要知道該客戶端有哪個服務器有一個長時間的輪詢請求,因此您可以指示該特定服務器返回來自該請求的數據。

您這樣做,通常的方法是你有某種形式的用戶ID的表示每個客戶端。當任何客戶端通過長輪詢請求連接時,該連接將集羣分發到您的一臺服務器。該服務器獲取請求,然後寫入中央數據庫(通常是redis),此用戶ID userA現在連接到server12。然後,當某些數據可用於userA時,任何代理都可以在Redis存儲中查找該用戶,並查看該用戶當前是否連接到server12。因此,他們可以指示server12使用userA的當前長輪詢連接將數據發送給userA。

這只是一個處理羣集的策略 - 還有很多其他的如粘性負載平衡,算法分佈,廣播分佈等......您可以看到一個描述some of the various schemes here的答案。

+0

這樣做很有意義。你能指導我如何serverX可以指示serverY發送迴應。我聽說工作人員只能通過主人 –

+0

@SanchitMehta進行交流 - 不同的服務器可以通過多種方式進行交流。如果不需要幾行node.js代碼,您可以讓每個node.js服務器在自定義端口(通常稱爲控制端口)上使用http服務器進行偵聽,然後僅向該服務器發送http請求以告訴它將數據發送給userA。然後您將確保控制端口不對外部開放,以便它只能從防火牆後面的其他服務器使用。 – jfriend00

+0

@ jfriend00-我有4個集羣。我可以讓他們都聽一個端口(比如說8080)。現在,如果clusterA長查詢一個請求,並且clusterB獲得一條新消息,那麼clusterB可以向端口8080上運行的服務器發送一個請求。我的理解是正確的嗎? 現在假設clusterB向端口8080發送一個請求,我們如何確保正確的cluster,即clusterA得到這個請求(4個集羣也在監聽8080)。 –

1

如果你確定你想存儲所有的請求和響應,看看這個問題。 Serializing Cyclic objects

你也可以嘗試cycle.js

不過,我覺得你只感興趣的序列化從請求/響應的幾個要素。一個更簡單(也許更好)的方法是將請求/響應對象中所需的鍵/值對複製到單獨的對象中並存儲它們。