2011-11-22 64 views
5

我正在寫Rails 3.1中的一個簡單的聊天室應用程序 - 用於學習目的。 對於初學者來說,我擁有所有需要的模型(消息,用戶,房間等)和事物。 客戶端每分鐘輪詢一次服務器(例如),如果有任何消息,則會獲得新消息。使用EventMachine的Rails應用程序是否可以進行長時間輪詢?

我想簡單的輪詢更改爲長輪詢和無法弄清楚這是否可以在同一應用程序做或做我必須創造一個長輪詢其他一些Push服務器。

我讀了很多關於EventMachine的和改變了我的Rails應用程序用戶的它,因爲我想用EventMachine的爲事件驅動機制。我認爲EventMachine頻道會派上用場。 客戶端會連接並等待聊天室中的消息,並且只有在發送到房間時纔會收到消息。

我無法弄清楚什麼是我可以分享我的所有客戶端連接之間的EventMachine的:: Channel實例。 這種方法甚至有可能,或者我以錯誤的方式去做?

如果可能的話,我想可以作爲託管在Heroku上一個Rails應用程序運行的解決方案。

+0

我不是活動機器的專家,但我認爲這是可能的。而且你不分享你的客戶之間的渠道,但你有一個客戶端,你需要在EM之上建立一些東西,以便在不同的用戶之間發送消息。 – Augusto

+0

是的,說我有一個渠道爲每個客戶。 我可以在哪裏存儲所有這些通道實例,以便可以從其他人發送消息時調用的控制器訪問? – Oded

回答

0

擴展我在評論中提到的內容,檢查此blog文章,該文章解釋瞭如何使用EM創建基於文本的聊天應用程序,並使用AMQP將消息廣播給其他用戶。

我認爲你可以做同樣的事情,或者在內存隊列中使用一些共享消息,這絕對應該在heroku上工作,因爲你沒有對RabbitMQ等外部服務的依賴。 下面是關於不同的隊列框架商量好了:ActiveMQ or RabbitMQ or ZeroMQ or

0

Rails會已經在版本4 流式加現在,你可以在流(長輪詢)像this例如與西納特拉和Redis的的發佈/訂閱功能,作爲後端。您將不得不添加另一個操作來處​​理用戶發送的消息,並使用PUBLISH命令將其添加到Redis。您應該使用Thin或Puma等偶數服務器。

1

是的。我只是使用事件機寫了一個演示。我的情況是玩家在地圖上行走,其他玩家應該能夠看到它。 演示看起來像這樣:

  1. 客戶端建立連接,報告其自己的座標(隨機生成的)

  2. 有一個陣列保留所有的座標爲每個客戶端

  3. 當客戶端移動,它將其新座標發送到服務器。然後服務器發現他附近的人(來自陣列),並將新座標推送給這些客戶端。

我測試了近5000個客戶端,每秒20-30名玩家移動其位置。而且服務器進程僅佔用100M內存的CPU(50%-60%)(在單個內核上)的CPU使用率不到100M。

就你而言,我認爲你應該嘗試一下faye。它基於事件機器,並且適用於像聊天室這樣的解決方案。

相關問題