2014-03-03 41 views
19

我已經在Ruby On Rails中使用了Faye,對我來說它的成本幾乎爲0,因爲我在連接到我的Rails應用的另一臺服務器上運行Faye。混淆選擇Faye或Rails 4 Actioncontroller :: Live

但是我遇到了一些問題,例如在Rails服務器上查詢時間過長,一段時間後Faye連接失敗並引發異常。

現在我正在研究Actioncontroller :: Live,大多數實現都在使用Redis,這對我的啓動來說有點貴,但是我意識到我無法使用Redis的訂閱/發佈樣式ActionController的::現場。

我的問題:我應該移動到Actioncontroller :: Live還是堅持Faye?雖然這些是我想要完成的事情:評論後

  1. 更新/飼料
  2. 通知系統的基礎上的pub/sub,類似於王菲。
  3. 異常處理
  4. 伸縮性>更多的用戶更多的連接

我知道,王菲用貝葉VS的ActionController ::現場使用SSE/HTTP。 我應該考慮任何與Socket.IO相關的東西嗎? SockJS?

我已經通過了一些關於這裏這個話題的問題的念想: Replace Faye with rails 4 server side events? Faye VS rails 4 streaming? 但我需要更多的信息:

回答

33

這裏是爲什麼我會跟王菲堅持一些筆記,這可能會爲你帶來更接近對這個問題的答案:

瀏覽器兼容性

當您在相關計算器問題閱讀,王菲有更好的瀏覽器兼容性。

穩定性

的Rails ::直播功能似乎不是很穩定呢。 Rails SSE目前正在積極開發。舉個例子,你不會受到this issue的影響。

線程阻塞& VS異步非阻塞

你使用多線程的應用程序?如果你不這樣做,我絕對不會只爲Rails :: Live介紹它,因爲它打開了非線程安全的寶石問題的可能性&服務器選擇的侷限性。

如果你確實有多線程,每個客戶端將保持一個線程開放給你的應用程序。如果您的線程用完,您的應用程序將無響應/死機。考慮有多少線程可以滿足用戶打開多個瀏覽器標籤時的高峯時間,甚至是DOS攻擊,其中有人會打開大量空閒的SSE/websocket連接來達到最大值,並讓您的應用程序停機。如果你設置了大量的最大線程來支持許多空閒的連接,你可能會有很多非空閒的線程可能會產生它自己的問題。沒有SSE/websockets,沒有彗星/長輪詢對阻止應用程序更安全。據我所知,你的設置單獨運行Faye。 Faye服務器運行Ruby EventMachine或Node.js,它們都是異步非阻塞的,並且不會爲每個打開的連接使用線程。它可以處理大量的併發連接而沒有問題。

我的意見是,一個正常的阻塞Rails Web應用程序與一個單獨的異步非阻塞服務器的連接保持打開(通過消息&使應用程序生活)是最好的兩個設置。這就是你用Rails + Faye所擁有的。

更新Actioncable在Railsconf 2015上發佈。它如上所述運行非阻塞,但它是一個集成的官方Rails解決方案。擁有一個擁有龐大社區的單一框架,一個用於websockets的集成非阻塞連接處理程序,您可以單獨運行和配置,而所有工作都是「開箱即用」的,這是Rails的一大優勢。

從行動電纜自述動作電纜由EventMachine的和線程的組合供電。連接處理所需的框架管理在EventMachine循環中處理,但實際的通道,用戶指定的工作是在普通的Ruby線程中處理的。這意味着只要您沒有犯過任何線程安全錯誤,就可以毫無問題地使用所有常規的Rails模型。

要了解更多,請閱讀ActionCable & Underlying architecture

+1

非常感謝您對回答的信心。我決定也這樣。如果我通過選擇Faye + Rails之外的其他方式,我意識到了風險和停機問題。再次感謝:),不久之後,我打算推出一個關於此的博客,並且很好地使用您的答案作爲證明以及:)! – 0bserver07

+2

你寫過那個博客嗎? 任何鏈接的機會? – Hovo

+1

我同意最後一段。儘管所有的Node.js炒作,Rails仍然是最好的選擇。 – Donato