我正在使用Ruby Grape創建一個API,並面臨以下問題。 當有新的GET請求時,請求大量數據,這需要很長時間,同時反應器被阻塞,並且在請求完成之前不能處理新的請求。 代碼很直截了當:紅寶石葡萄反應器被阻止
class API < Grape::API
resource :users do
get do
get_users()
end
end
end
get_users連接到另一個系統通過TCP,並得到大量轉換成JSON數據。這是使用第三方寶石完成的。 什麼是處理這種情況的最佳選擇?
謝謝Yuriy。 1.我正在使用Thin。我正在考慮像NginX + HAProxy + Thin這樣的體系結構,其中有幾個實例。我也會檢查乘客和獨角獸。 2.我試圖用EM.defer做類似的事情。你認爲這是好方法嗎?緩存是我沒有想過的。我也會檢查。 但我認爲我更喜歡你的第二點。 – antiziclon 2013-03-11 21:18:55
其實我的意思是另一回事。這裏是一個例子: 1.客戶端調用獲取用戶 2.應用程序保存此請求,並將生成的請求密鑰返回給客戶端 3.應用程序通過delayed_job或類似的方式生成get_users() 4.應用程序保存get_users()與請求密鑰關聯 5.客戶端調用通過密鑰獲取用戶 6.應用返回與密鑰關聯的結果。 當get_users()尚未完成時,應用程序應返回not_ready。 應用程序應該過期鍵和結果。 缺點是客戶必須改變它的邏輯。所以這隻適用於報表生成等非常長的操作。 – 2013-03-12 03:30:33
我現在明白了。我不太喜歡這種方法,因爲它需要客戶改變其邏輯,如你所說。我會測試你的觀點1,看看我能做些什麼。 – antiziclon 2013-03-12 08:56:49