[英]How to persist HTTP response in redis
我在不使用Socket.io的情況下在nodeJS上創建了一個長時間輪詢的聊天應用程序,並使用集群對其進行了擴展。
我必須找到一種方法來存儲所有長時間輪詢的HTTP請求和響應對象,以使其在所有節點群集中都可用(這樣,當收到針對長時間輪詢的請求的消息時,我可以獲取該請求並回應它)
我嘗試使用redis,但是,當我對http請求和響應對象進行字符串化時,出現“無法對循環結構進行字符串化”錯誤。
也許我以錯誤的方式來處理它。 在那種情況下,我們通常如何在不同群集之間實施lon-polling?
您的要求似乎有些混亂。
在長時間輪詢的情況下,客戶端發出一個http請求,該請求被路由到特定的HTTP服務器。 如果沒有滿足該請求的數據立即可用,則該請求將保留一段較長的時間,或者最終將超時,然后客戶端將發出另一個長輪詢請求,或者某些數據將變為可用,並且響應將是返回到請求。
因此,不要通過嘗試集中保存請求和響應對象來使此工作在群集中進行。 這些屬於特定服務器和特定客戶端之間的特定TCP連接。 您無法保存它們並在其他地方使用它們,它也不會對群集的任何這項工作有所幫助。
我認為這里存在的群集問題是,當某些數據確實可用於特定客戶端時,您需要知道該客戶端具有當前正在使用的長輪詢請求的服務器,以便您可以指示該特定服務器返回該請求中的數據。
執行此操作的通常方法是擁有某種代表每個客戶端的userID。 當任何客戶端以長輪詢請求連接時,該連接將被群集分發到您的一台服務器。 收到請求的服務器,然后將其用戶ID userA現在連接到server12寫入中央數據庫(通常是redis)。 然后,當某些數據可用於用戶A時,任何代理都可以在Redis存儲中查找該用戶,並查看該用戶當前已連接到server12。 因此,他們可以指示server12使用當前用於userA的長輪詢連接將數據發送到userA。
這只是處理集群的一種策略-還有許多其他策略,例如粘性負載平衡,算法分配,廣播分配等。您可以在此處看到描述各種方案的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.