如何架構基於 Ruby on Rails 網站的實時消息系統?
02-08
一個小型的社交網站,比如像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 的方式,具體查google2 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 沒有可以拿來就用的架構,要根據自己的業務結構,從簡單開始,逐步演進。
- rails faye , XMPP BOSH,juggernaut 這些你都可以去嘗試,找一個合適你的;
- 這個肯定是沒有問題的;
- 這個實現很容易;就像@藍文所說的;
- 這裡是兩個問題,realtime index,對於社交網站確實很有必要,你可以參考redis-search,我想這個基本上也可以實現你要的效果,如果不夠再補充;
- 視頻圖片處理,這個你需要一個Job,如果一定要用Ruby library的話,你可以試試resque,還有其他很多,如果你覺得你一定要上升到分散式,那麼你可以考慮採用tb的那個tbschedule,不過我的建議是圖片交給第三方服務解決,比如又拍雲存儲,比你自己做靠譜多了,視頻編碼解碼和其他非同步任務交給任務系統;
- Apps那個與你架構還是有一定的關係,按照你目前的提問,採用RESTful Web API無疑可以滿足你的要求。
- 最後一個提問,雖然說沒有一步到位的系統;不過我建議你可以考慮去玩玩AWS。
我覺得你需要的不是一些具體的產品,而是需要一個團隊?? 你說的這些事情都不是一兩個人能搞定的。特別是第 6 點,現在估計只有 Google 能做到。
這事「小型的社交網站」嗎無論什麼消息,都是,消息產生—— &> 篩選過濾—— &> 存入資料庫或cache—— &> 前台推送1,2,3,都是一樣的原理,網頁上用AJAX就可以動態刷新了,IOS,ANDROID也是同理,定時取數據就OK了全文搜索就是資料庫的事情了,最好還是提取關鍵字搜索,像知乎這種這麼多信息,全文搜索可不容易,視頻和圖片多分幾個伺服器就好了,帶寬是王道,這玩意可吃錢了,你看知呼幾乎沒多少圖片至於分散式架構,那更是因地制宜的事情了,什麼網站怎麼分布完全不一樣,最主要的是,網站做大了,不可能不改變,那是不可能的,除非你出發點就是架構一個龐大的巨無霸
你的這麼多問題,可以轉換成如何用Ruby on Rails實現一個Twitter,Yammer或者新浪微博這樣級別的應用,不如你把問題拆分一下,一個一個的問吧。
推薦閱讀:
※用WebSocket做WebApp應用內推送體驗如何?流量消耗是否可接受?
※如何使用推送?
※知乎的 comet 實現機制是怎樣的?
※搜狐快遞 S60 版中有新聞會推送一條簡訊到手機中,然後點擊就開啟客戶端,是怎麼實現的?
TAG:RubyonRails | 推送Push | 實時系統 | comet | 非同步隊列 |