簡體   English   中英

如何在Redis中保持HTTP響應

[英]How to persist HTTP response in redis

我在不使用Socket.io的情況下在nodeJS上創建了一個長時間輪詢的聊天應用程序,並使用集群對其進行了擴展。

我必須找到一種方法來存儲所有長時間輪詢的HTTP請求和響應對象,以使其在所有節點群集中都可用(這樣,當收到針對長時間輪詢的請求的消息時,我可以獲取該請求並回應它)

我嘗試使用redis,但是,當我對http請求和響應對象進行字符串化時,出現“無法對循環結構進行字符串化”錯誤。

也許我以錯誤的方式來處理它。 在那種情況下,我們通常如何在不同群集之間實施lon-polling?

如果確定要存儲所有請求和響應,請查看此問題。 序列化循環對象

您也可以嘗試cycle.js

但是,我認為您只會對序列化請求/響應中的幾個元素感興趣。 一種更簡單(可能也更好)的方法是將所需的鍵/值對從請求/響應對象復制到單獨的對象中並存儲它們。

您的要求似乎有些混亂。

在長時間輪詢的情況下,客戶端發出一個http請求,該請求被路由到特定的HTTP服務器。 如果沒有滿足該請求的數據立即可用,則該請求將保留一段較長的時間,或者最終將超時,然后客戶端將發出另一個長輪詢請求,或者某些數據將變為可用,並且響應將是返回到請求。

因此,不要通過嘗試集中保存請求和響應對象來使此工作在群集中進行。 這些屬於特定服務器和特定客戶端之間的特定TCP連接。 您無法保存它們並在其他地方使用它們,它也不會對群集的任何這項工作有所幫助。

我認為這里存在的群集問題是,當某些數據確實可用於特定客戶端時,您需要知道該客戶端具有當前正在使用的長輪詢請求的服務器,以便您可以指示該特定服務器返回該請求中的數據。

執行此操作的通常方法是擁有某種代表每個客戶端的userID。 當任何客戶端以長輪詢請求連接時,該連接將被群集分發到您的一台服務器。 收到請求的服務器,然后將其用戶ID userA現在連接到server12寫入中央數據庫(通常是redis)。 然后,當某些數據可用於用戶A時,任何代理都可以在Redis存儲中查找該用戶,並查看該用戶當前已連接到server12。 因此,他們可以指示server12使用當前用於userA的長輪詢連接將數據發送到userA。

這只是處理集群的一種策略-還有許多其他策略,例如粘性負載平衡,算法分配,廣播分配等。您可以在此處看到描述各種方案的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM