我認爲這裏的主要問題是,您需要另一個消息傳遞解決方案(類似IPC的,而不是IM),而不是試圖彎曲Resque,它只是一個隊列。一些選項是amqp gem(AMQP協議)或zmq gem(ZeroMQ協議),但您也可以通過Ruby標準庫Socket類(good examples)使用普通的舊套接字套接字。他們都有不同的優點和缺點,所以它可能取決於你。
然後,交互可能看起來像這樣的事情:
- 博特開始。
- Bot開始偵聽IPC消息。
- Bot收到發件人的查詢(通過XMPP)。
- Bot通過Resque排隊工作。
- Job通過HTTP調用Rails應用程序。
- Rails應用程序完成其工作。
- 某人或某事可以解決任何查詢,並通過Rails應用程序輸入結果。
- Rails應用程序使用一些IPC方法將結果發送到機器人。
- Bot將結果發送給原始發件人(通過XMPP)。
像往常一樣可能會有一些變化。例如,我認爲你根本不需要Resque。殭屍程序可以簡單地將請求傳遞給Rails應用程序,但它取決於負載,您想要實現的響應時間,您當前的架構等。也許Resque作業可以等待Rails應用程序返回結果,然後返回作業(不是Rails應用程序)會使用IPC。還有其他一些變化......
我是否需要寫一個rake任務啓動/停止/重載機器人
不,你不知道。這取決於你如何以及何時運行它。畢竟,Rake可以被視爲將多個Ruby腳本放在一起並在它們之間創建依賴關係的一種便捷方式。如果您認爲機器人周圍會有一些其他任務,而不僅僅是運行它(一些清理,部署等),爲了方便起見,使用Rake會很好。如果還沒有,則重構bot的邏輯,並使用Rake任務對其進行初始化。但是,如果你離開它並且按原樣運行你的腳本(使用monit,你的自定義init.d腳本,ad-hoc等等),它可能會很好。
如果我沒有使用rake運行它(據推測是Monit監測的獨立進程),那麼如何與Resque進行交互或訪問我的rails模型?
耙子對此沒有影響。從操作系統的角度來看,如果您通過Rake運行Resque並通過Rake運行您的機器人或作爲獨立腳本運行,則無關緊要,它們將是不同的進程。另外請記住,Resque需要Redis在某處運行。
我知道這可能是很瑣碎的問題
無可言。我認爲需要一段時間才能解決像這樣微不足道的問題。
起始/機器人的止擋是一個單獨的問題。 Monit是一個選擇,就像工頭(https://github.com/ddollar/foreman)一樣。對我來說真正的問題是,你是否需要bot與你的ruby應用異步或同步工作。如果你可以脫離同步界面,你的機器人只需要對Rails應用程序進行HTTP調用,而且生活很簡單。 :) –