2013-02-27 91 views
1

我有一個分析引擎,它定期以JSON格式打包一堆統計信息。我想將這些包發送到Rails服務器。一旦包到達,Rails服務器應該檢查它,從中生成一個模型實例(用於歷史目的),然後將內容顯示給用戶。我想到了兩種方法。將數據從分析引擎發送到Rails服務器

1)有一個小應用程序駐留在同一主機Rails服務器在傾聽這些包(使用ZeroMQ)上。收到包後,應用程序將通過CURL調用Rails動作,並將該包作爲參數傳遞。我對這種方法的擔心是,我的Rails服務器檢查只有登錄用戶可以訪問影響模型的操作。通過創建可用於此偵聽應用程序(以及其他實體)的操作,我是否將自己暴露給一個重大的安全缺陷?

2)第二種方法是隻需聽音應用轉儲封裝成一個特殊的數據庫表。 Rails服務器會定期檢查這個表是否有新的包。一旦檢測到一個或多個,它將​​處理它們並將它們從桌面上移除。

這是我第一次做這樣的事情,所以如果你有,你可以分享更好的解決方案技術或經驗,我很想學習。

謝謝。

回答

0

您可以通過限制如果你希望用戶看到更新,允許在routes.rb中

post "/analytics" => "analytics#create", :constraints => {:ip => /127.0.0.1/} 

請求的主機名限制訪問某個呼叫,您可以使用輪詢刷新頁面每分鐘orso。

0

1)是的,你是暴露的重大安全漏洞,除非:

  1. 你zeroMQ的應用提供所需的數據做認證和授權在鐵軌上側
  2. 你的Rails應用程序被配置爲只監聽在127.0.0.1的接口,因此不能從訪問外部
  3. 像本傑明建議,您限制特定路由某些IP

2)本approa ch看起來很像delayed_job所做的。您可能想看看那裏:https://github.com/collectiveidea/delayed_job並使用rake任務來添加新作業。

總之,你的聽力應用程序將調用rake任務接收數據包時,將添加自定義delayed_job的。然後讓delayed_job處理負載。你受益於delayed_job善良(不同隊列,縮放......)。困難的部分是獲得結果。

一個辦法是將相關的每個作業一個唯一的ID,並有delayed_job的任務輸出結果與結果相關的作業ID的數據存儲至極。該數據存儲可以是一個簡單的關係表

+----+--------+ 
| ID | Result | 
+----+--------+ 

或memecache/Redis的/不管實例。您只需輪詢該數據存儲以查找與作業ID關聯的結果。在完成向用戶顯示時刪除所有內容。

3)你爲什麼不直接POST數據到軌服務器?

+0

對於選項3,我打算髮布,但我需要確保該操作僅限於已批准的實體(或者我是否錯過了某些內容?)。我會嘗試本傑明的建議並重新報告。 – 2013-02-27 12:12:38

0

繼本傑明的領導之後,我爲此特定行爲實施了一個過濾器。

def verify_ip 
    @ips = ['127.0.0.1'] 
    if not @ips.include? request.remote_ip 
    redirect_to root_url 
    end 
end 

在本地主機聽音應用程序現在調用的動作,使從分析引擎作爲PARAM接收的JSON包。謝謝。

相關問題