1 回答

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個贊
即使你能做到這一點(diǎn),這也是糟糕的設(shè)計(jì)。
如果用戶沒有看到消息會發(fā)生什么?您的網(wǎng)絡(luò)服務(wù)器是否無限地掛在它上面?它是否將消息“nack”回隊(duì)列?
這兩種選擇都不好。
堅(jiān)持每條消息,RabbitMQ 將開始遇到來自大量用戶的數(shù)千條未確認(rèn)消息的問題。將消息返回到隊(duì)列中,您將循環(huán)處理消息,增加 Web 服務(wù)器和 RMQ 服務(wù)器上的 CPU 資源,以及兩者之間的網(wǎng)絡(luò)流量。
這個問題更好的解決方案是將消息從RabbitMQ中拉出后存儲在數(shù)據(jù)庫中。當(dāng)它被發(fā)送到瀏覽器/被瀏覽器查看時,更新數(shù)據(jù)庫以反映這一點(diǎn)。
從我寫的尚未發(fā)表的文章中:
將消息存儲在數(shù)據(jù)庫中。
向數(shù)據(jù)庫記錄添加一個字段,說明此消息屬于誰。當(dāng)用戶稍后重新連接時,查詢數(shù)據(jù)庫以獲取該用戶當(dāng)時需要查看和發(fā)送的任何消息。
上面開始的完整過程,然后變成了這樣:
用戶的瀏覽器連接到 Web 服務(wù)器上的 SignalR/Socket.io/Pusher/websockets
Web 服務(wù)器檢查隊(duì)列中是否有在長時間運(yùn)行的過程中發(fā)生的更新
當(dāng)?shù)卿浻脩舻南⑦M(jìn)來時
如果用戶已登錄,則通過websocket向用戶廣播消息
如果用戶未登錄,則將消息存儲在數(shù)據(jù)庫中
當(dāng)用戶再次登錄時,查詢數(shù)據(jù)庫并發(fā)送所有等待消息
這是在消息隊(duì)列的想法出現(xiàn)之前你會做的事情,對吧?現(xiàn)在您也有一個消息隊(duì)列,這應(yīng)該是您要做的。
- 1 回答
- 0 關(guān)注
- 293 瀏覽
添加回答
舉報(bào)