我正在構建一個應用程序,該應用程序通過必須共享回可能連接到其他前端服務器的其他客戶端的websocket接受輸入。水平縮放服務器之間共享輸入的應用程序
爲了簡單起見,想象一下多用戶多房間聊天應用程序。將輸入路由到正確的連接並不是一個問題,它是服務器之間的消息傳遞,並能夠擴展並保持消息的延遲。
現在我有一個每個前端連接到的代理程序,然後他們訂閱一個隊列來查看它的連接可能需要知道的任何事情。這樣做是爲了切斷接收來自前端永遠不會使用的代理的消息。但是,我仍然可以獲得大約75%到85%的消息從經紀商發回到每個前端。
在旅行中我正在做消息驗證,解析和任何其他業務邏輯工作。在旅途中,我正在遍歷本地數組以獲得訂閱,並將消息發送到每個訂閱的連接。
舉例:如果我在11個前端服務器上收到10條消息(總計110條消息 - 10條消息在本地處理並且不由代理髮回)* 0.75樂觀預訂級別= 75條消息被髮回到每個服務器來處理。所以我們有10個本地+75個broker = 85個消息被每個服務器處理一段時間。
現在,我不會有100個每秒鐘100個前端服務器,也許是兩個,但是由代理進程發送回每個前端服務器的消息似乎會爆炸我通過其他前端服務器收到的更多消息。
代理進程是一個與RabbitMQ和PostgreSQL進行對話的小型node.js應用程序。前端服務器也是node.js應用程序。
我可以做什麼或者我應該採取不同的措施來保持大批量生產期間的低延遲?
更新回覆用戶評論:雖然我期望隊列之間有很多重疊,連接將導致其前端服務器訂閱,但我不認爲它對於每個服務器都是100%。最糟糕的情況是,每個前端服務器都必須訂閱代理上的每個隊列,從而從代理獲得100%的消息。樂觀地說,只有大約75%的消息確實需要被髮送回任何特定的前端服務器。
itaifrenkel的第二次更新:兩個用戶發送的消息可能以不同的順序返回。只有在延遲非常低時纔可以接受,並且只有在發送的消息非常接近時纔會發生。如果它發生在相隔幾秒的消息中,那麼我會說我們有一個延遲和規模問題。
有一種情況我們需要顯示一個歷史記錄,但是由於我覺得它超出了問題的範圍,所以我沒有這樣做。
無論消息是否被使用,您都會說開銷爲75%。那麼你爲什麼使用這種樂觀的訂閱。不應該嚴格按照使用的原則。你如何決定訂閱或不訂閱。 – user568109
如果聊天室擁擠,在同一個聊天室中的兩個用戶看到兩個消息的順序是否有效? – itaifrenkel
當用戶登錄到聊天室時,在用戶登錄之前提供歷史消息會有什麼好處。 – itaifrenkel