如何基於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 | 伺服器架構 | 推送服務 |