如何基於WebSocket和MongoDB技術實現NodeJS的推送伺服器集群?
我要實現的是類似聊天QQ,微信這種應用程序。
我的初步解決方案,使用NodeJS開發一個推送伺服器,它每秒中對MongoDB的推送數據進行輪詢。
NodeJS的Rest服務的伺服器收到用戶A向用戶B發送的消息後,將消息存入MongoDB的推送數據表,並記錄時間存入時的時間。
推送伺服器輪詢MongoDB的推送數據表,取出上一次查詢的時間到本次查詢的時間之間的數據,並刪除上一次查詢時間以前的數據。
反正伺服器也要做輪詢處理客戶端連接的心跳檢測,順便也用來做推送數據檢測。
這種伺服器可以開多個,使用forever進程守護,每個推送伺服器被一定數量的websocket客戶端連接。
這種解決方案有一些問題:
1.輪詢的方式不能立即推送。
2.需要推送伺服器和Rest服務伺服器時間同步,否則會亂存,亂取,亂刪。
請問有沒有更好的解決方案?
協議不多說了,都有標準解決方案了,就說一點細節吧。
「推送伺服器輪詢MongoDB的推送數據表,取出上一次查詢的時間到本次查詢的時間之間的數據,並刪除上一次查詢時間以前的數據。」
「需要推送伺服器和Rest服務伺服器時間同步,否則會亂存,亂取,亂刪。」
你這樣做不能保證一定推送成功,然後還刪了,然後還容易造成時間差而漏過,效果肯定完蛋。
推送當然要用mqtt或者xmpp 呀。
推薦Mosca by mcollina 基於nodejs 的mqtt 伺服器broker。前端用mqtt.js。無縫支持websocket和MongoDB。我擼了一個項目,伺服器核心代碼不過200行。兩個關鍵詞
rethinkdb
horizon仔細想了下,貌似藉助阿里雲的消息服務_海量消息數據傳遞更容易實現一點
沒有消息驅動的思維嗎?輪詢也太蛋疼了啊。消息隊列啊。
用現成的。沒有必要造輪子: 消息隊列_雲消息MNS 最近下調費率了,很方便,成本很低
推薦閱讀:
※怎麼禁止自動填充瀏覽器記住的密碼?
※如何評價node_modules的設計?
※我用js寫了一個冒泡排序法,怎麼用html和css把排序過程展現出來?
※關於具名的IIFE內部對函數自身再賦值問題?
※官網網站用什麼技術棧比較合理?
TAG:JavaScript | MongoDB | Nodejs | 伺服器架構 | 推送服務 |