如何架構基於 Ruby on Rails 網站的實時消息系統?

一個小型的社交網站,比如像http://zhihu.com那樣的,用ruby on rails和mongodb做主要業務邏輯,有幾個功能不知道是怎麼實現的,希望能給出具體的產品名稱,拿來就能用最好了:

1、推送通知(push notification)到前台網頁上,比如被人關注、話題或者問題更新、添加了回答、投票、修改等等。

2、給其他用戶發消息(message),或者群聊(group chat),記錄能保存到mongodb裡面。

3、首頁動態刷新(timeline feed)

4、支持實時全文搜索(lucene/solr),圖片/視頻後台隊列處理(queue)

5、不僅是html5,還要支持ios、android原生客戶端開發

6、最好是分散式、並發的,利用多核cpu的計算能力,以後網站做大了,直接堆伺服器,架構不用改。


1 實時信息通知可以用輪詢或者 Long HTTP Connection 的方式,具體查google

2 message 和 group 放在mongodb 可以,比如說一個群聊放到一個 mongodb 的 document 裡面,一個message 會話也可以放在一個 document 裡面,但是要設計好你的數據結構,一個document最大4M。 nosql 雖然方便,但是後期sharding 也很費事

3 首頁動態刷新,這個參考1. 從伺服器返回數據後,動態插入就可以

4 實時全文搜索,但假設你用 mongodb,在一定量級上可以直接用mongodb 查詢,另外對於過期數據可以做歸檔。以知乎現在的數據量來說,實時搜索也用不到lucene/solr。後台任務隊列可以用redis。我原來嘗試過用mongodb 來架構一個實時隊列,支撐過一段時間,後來爆掉了。

5 支持html5,移動設備。 這個不關架構的事情,只要判斷瀏覽器請求頭,對不同設備提供不同的 css,或者是渲染不同的頁面。如果要是給客戶端提供API的話,統一用json就行,Rails 支持不同請求類型返回不同數據結構。

6 沒有可以拿來就用的架構,要根據自己的業務結構,從簡單開始,逐步演進。


  1. rails faye , XMPP BOSH,juggernaut 這些你都可以去嘗試,找一個合適你的;

  2. 這個肯定是沒有問題的;

  3. 這個實現很容易;就像@藍文所說的;

  4. 這裡是兩個問題,realtime index,對於社交網站確實很有必要,你可以參考redis-search,我想這個基本上也可以實現你要的效果,如果不夠再補充;

  5. 視頻圖片處理,這個你需要一個Job,如果一定要用Ruby library的話,你可以試試resque,還有其他很多,如果你覺得你一定要上升到分散式,那麼你可以考慮採用tb的那個tbschedule,不過我的建議是圖片交給第三方服務解決,比如又拍雲存儲,比你自己做靠譜多了,視頻編碼解碼和其他非同步任務交給任務系統;

  6. Apps那個與你架構還是有一定的關係,按照你目前的提問,採用RESTful Web API無疑可以滿足你的要求。

  7. 最後一個提問,雖然說沒有一步到位的系統;不過我建議你可以考慮去玩玩AWS。


我覺得你需要的不是一些具體的產品,而是需要一個團隊?? 你說的這些事情都不是一兩個人能搞定的。特別是第 6 點,現在估計只有 Google 能做到。


這事「小型的社交網站」嗎

無論什麼消息,都是,消息產生—— &> 篩選過濾—— &> 存入資料庫或cache—— &> 前台推送

1,2,3,都是一樣的原理,網頁上用AJAX就可以動態刷新了,IOS,ANDROID也是同理,定時取數據就OK了

全文搜索就是資料庫的事情了,最好還是提取關鍵字搜索,像知乎這種這麼多信息,全文搜索可不容易,視頻和圖片多分幾個伺服器就好了,帶寬是王道,這玩意可吃錢了,你看知呼幾乎沒多少圖片

至於分散式架構,那更是因地制宜的事情了,什麼網站怎麼分布完全不一樣,最主要的是,網站做大了,不可能不改變,那是不可能的,除非你出發點就是架構一個龐大的巨無霸


你的這麼多問題,可以轉換成如何用Ruby on Rails實現一個Twitter,Yammer或者新浪微博這樣級別的應用,不如你把問題拆分一下,一個一個的問吧。


推薦閱讀:

用WebSocket做WebApp應用內推送體驗如何?流量消耗是否可接受?
如何使用推送?
知乎的 comet 實現機制是怎樣的?
搜狐快遞 S60 版中有新聞會推送一條簡訊到手機中,然後點擊就開啟客戶端,是怎麼實現的?

TAG:RubyonRails | 推送Push | 實時系統 | comet | 非同步隊列 |