我有一個Rails項目和兩個ruby mini-daemons在後臺運行。他們之間溝通的最佳方式是什麼?ruby進程間通信
像下面通信應該是可能的: 導軌 - >過程1 - >過程2 - >的Rails
有些請求將是同步,異步其他。
隊列(類似於AMQ或基於自定義Redis的)或RPC HTTP調用?
我有一個Rails項目和兩個ruby mini-daemons在後臺運行。他們之間溝通的最佳方式是什麼?ruby進程間通信
像下面通信應該是可能的: 導軌 - >過程1 - >過程2 - >的Rails
有些請求將是同步,異步其他。
隊列(類似於AMQ或基於自定義Redis的)或RPC HTTP調用?
我通過RabbitMq +兔子寶石實現了一個系統。
更新:
閱讀http://blog.brightbox.co.uk/posts/queues-and-callbacks後,我決定嘗試RabbitMQ的。有兩個寶石amqp(異步,基於eventmachine)或兔子(同步)。 amqp很棒,但是如果你使用Rails與乘客,它可以做一些奇怪的事情。
系統是這樣工作的,守護進程在隊列上監聽消息:
# The incoming data should be a JSON encoded hash that looks like:
# { "method" => method_to_call, "opts" => [ Array of opts for method ],
# "output" => "a queue where to send the result (optional)" }
# If output is specified it will publish the JSON encoded response there.
def listen_on(queue_name, class)
BUNNY.start
bunny = BUNNY.queue(queue_name)
bunny.subscribe do |msg|
msg = JSON.parse(msg[:payload])
result = class.new.send(msg["method"], *msg["opts"])
if msg["output"]
BUNNY.queue(msg["output"]).publish(result.to_json)
end
end
因此,一旦接收到消息它調用從一個類的方法。需要注意的一點是,在守護進程中使用Rails和amqp是最理想的選擇。但我喜歡使用一個寶石pe服務。
也檢查DRb。
@MB爲了他人的利益,你能分享一下你的解決方案的更多細節嗎? – Sampson 2011-06-04 15:27:24
如果你想在rails上使用amqp,你應該檢查[thin](http://code.macournoyer.com/thin/)。它是基於事件機器的,因此您可以放入您的amqp代碼,因爲您已經在EM循環中。 – Femaref 2012-06-08 20:58:28