2013-07-06 64 views
0

我正在編寫一個簡單的Ruby on Rails應用程序,它對ROR知之甚少。該應用程序將定期查詢Twitter和Instagram,爲特定用戶提取Feed並將其存儲在某個位置,然後可以在特定用戶的推文或照片的請求到達時快速訪問。Rake任務訪問Web應用程序的全局變量

我正在考慮編寫一個rake任務,這個任務將會定期獲取tweets和instagram照片。

如果webapp使用全局變量來獲取feed,那麼rake任務可以訪問這個全局變量並更新它嗎?

還是必須使用數據庫如此耙和Web應用程序可以更新/訪問相同的數據?

回答

2

耙子任務通常運行在它自己的進程中,所以它不能與你的主應用程序共享狀態。然而,你可以做的是在你的應用程序中創建一個類來獲取提要並將其與時間戳一起存儲。每當該時間戳到期時,它將創建一個新的請求。但是,雖然易於實現,但是這會導致請求在緩存過期後到達請求時減慢一點,因爲應用程序需要從Twitter和Instagram獲取數據作爲請求的一部分。

+0

您認爲如何編寫一個控制器,其唯一目的是獲取推文和照片並使用新數據更新全局變量。然後有一個cron作業定期調用curl來觸發控制器? – septerr

+0

另外,如果我執行控制器+ cron,是否會使web應用程序繁忙併導致定期請求到達隊列? Rails服務器是否運行多個線程來處理請求或單個線程?對不起,有很多問題。 – septerr

+0

完全取決於部署配置。由於cronjob與rails服務器進程在同一臺計算機上運行,​​因此可能會耗盡資源,從而可能會降低http性能。在實踐中,像你描述的任務只會佔用最少的CPU資源。使用cron/rake任務時,必須將數據存儲在本地數據庫中,並讓rails服務器訪問該數據庫。 –

0

如果你構建你的Rake任務的依賴來加載你的Rails應用程序,那麼你可以訪問你的Rails應用程序所有相同的數據。

desc 'My polling rake task' 
task :twitter_pool => :environment do 
    m = MyModel.find(123) # access models 
    MyModel::CONSTANT 
    ... # etc. 
end 

「=>:環境」是重要的部分。

+1

您確定這可行嗎?如果常量被定義爲rake任務的一部分,它應該只存在於運行任務的進程中。沒有? –

+1

由於Neils B說你不能共享狀態,所以這不會按需要工作,我誤解了你的問題。你最好的選擇是輪詢和緩存爲Neils descibes –

+0

我嘗試過這樣的事情,但是當從webapp調用相同的代碼以及從rake任務調用它時,全局變量不一樣。所以我相信Niels和Peer是對的。 – septerr