Ruby on Rails + AJAX + Mongrel + JMS/MQ/MOM = 即時通訊

阅读更多

前文研究過利用 Flash XMLSocket 作即時通訊的 Juggernaut,雖然它可以簡易的做到即時通訊,但使用非 HTTP 通訊和非開放標準這兩點很讓人在意,有滿有其他的解決方案?

ActiveMQ 的 AJAX Client

在思考的過程中,發覺我想做的不正是使用消息通訊的軟件嗎?這類軟件己經有一個很好的 Model:Messaging Oriented Middleware(MOM)。接著我跑到 Apache ActiveMQ 的網站研究有沒有可用的方案。果然,在 AMQ 的源碼中就有一個 AJAX 的 messaging client。

ActiveMQ 是開源的 JMS 專案,技術成熟而且被很多其他產品應用。它的 AJAX Client 利用連接 Server 上的 Messaging Servlet ,由Servlet 再向 AMQ 發送訊息。等等,AJAX 的 A 不就是非同步的意思嗎?怎樣用 AJAX 做到即時通訊?答案是結合 Poll 和 AJAX。Browser 首先用 AJAX 連接到 Servlet (Poll) ,如果有訊息就會即時把訊息返回,如果沒有訊息就會讓 client 等待,直到指定的時限(約30秒、比一般 browser 和 socket 的 timeout 短 )。每個 AJAX request 完結後 client 會立即重試,這樣 client 便可以得到有如 push 的效果了。比起一般 Server Push 的 Comet ,這種做法更符合一般 HTTP 的 Request - Response 模式,由於與普通 HTTP 無異,一般的 Firewall 和 Browser 也支援。

在 Rails 中的 AJAX Poll

ActiveMQ 的方法雖好,但它是一個 Servlet ,我們難道要另架一台 Java Application Server?就算不介意架這台 Server ,還要用 proxy 之類的方法解決 AJAX 不能 Cross-Domain 的問題。有沒有方法只用 Rails 就做到這種 AJAX Poll 的效果?

答案是 No and Yes。用普通的方法 Rails 不能做到以上效果。Rails 是一個單線程的環境 ,也就是說全部 Request 也由同一支 Thread 控制。在以上情境中「叫 Client 在 Request 中等待直至有信息」等於叫整個 server 停下來。幸好,Rails 單線程不等於 Server 也必須單線程。Adam的 Comet with Rails + Mongrel 中示範了怎樣用自訂 HttpHandler 讓 Rails 可以持續地跟 Client 連接。我們可以在 Client Side 呼叫 AJAX,在 Mongrel 的 HttpHandler 中把這些 Request 轉成向 MOM 的呼叫,如下圖。

理論差不多了,看看怎樣實作吧!

在 Rails 和 Mongrel 作即時股票報價軟件

ActiveMQ 的 Web Demo 包括一個股票報價軟件。它分成 Consumer 和 Producer 兩部份,Consumer 是收取服價資料的 Client ,Producer 則是發報股價的 Server。我們的目標就是要在 Rails 實作這個軟件。

(more…)

你可能感兴趣的:(Rails,Ajax,JMS,Ruby,ActiveMQ)