2011-11-27 25 views
0

我正在創建一個rails應用程序,我想知道是否可以在控制器層中設置異步/回調體系結構。我正在嘗試執行以下操作:在rails控制器中使用回調進行並行異步處理

當對/ my_app/foo發出HTTP請求時,我想異步地將兩個作業 - 一個天真的排名作業和一個複雜的排名作業,均列爲1000個帖子 - 以幾個工人機器。我想在控制器中爲每個作業設置一個回調方法,當各個作業完成時調用它。如果複雜的作業在X毫秒內沒有返回,我想返回來自天真作業的輸出。否則,我想返回複雜作業的輸出。

請務必注意,我希望這些作業能夠並行執行。在Rails中實現這樣一個系統的最佳方式是什麼?如果有幫助,我使用Apache Phusion Passenger作爲我的Rails服務器。

謝謝。

回答

0

可以在Rails中異步發出多個HTTP請求。但是,使Rails事件驅動是不可能的。

在可以發送多個HTTP請求與庫,如Typhoeus異步。但是,如果您的超時時間太長,您可能會遇到併發問題。

否則,您可以嘗試一些事件驅動的Web框架,如CrampGoliath。它們都基於EventMachine,因此您可以嘗試em-http-request

2

聽起來像你應該使用後臺作業。在這種情況下,當請求進入時,您可以啓動/排隊兩個作業,這些作業將由工作人員拾取和處理,該工作人員獨立於您的Rails應用程序工作。
以下幾個環節可能會有所幫助:

https://www.ruby-toolbox.com/categories/Background_Jobs
http://railscasts.com/episodes/171-delayed-job
http://railscasts.com/episodes/243-beanstalkd-and-stalker
http://railscasts.com/episodes/271-resque
http://rubyrogues.com/queues-and-background-processing/

0

嘗試使用RabbitMQ的,你可以張貼在隊列中的消息,並期望在答覆響應隊列。隊列消費者甚至可以在Scala中實現以保持牢固性。 amqp寶石就足夠了我所說的。如果可能的話,使用amqp綁定的Rails控制器會更好(我正在探索具有使用amqp綁定而不是http的端點的選項)。這將解決不足的問題