2012-11-06 102 views
2

它的我的理解是,當我將一個文件上傳到我的heroku實例時,它的同步請求會在請求完成時返回200,這意味着我的上傳已被處理並通過回形針存儲。將多個文件上傳到heroku系列鎖定所有dynos

我正在使用plupload做一個串行上傳(一次一個文件)。在Heroku上,我有3個dynos,並且我的應用程序變得沒有響應,並且我嘗試使用該應用程序的超時。我的上傳實際上最多隻能綁定一個dyno,而所有文件都是上傳的,因爲它是串行完成的,文件2不會啓動,直到從文件1返回響應爲止。

作爲測試,我將我的dynos撞到了15並運行上傳。我再次看到帖子進入日誌,然後開始看到回形針命令的輸出(不記得是否識別或轉換),我開始超時。

我真的失去了爲什麼會發生這種情況。我知道我可以直接上傳到s3,但我目前的方法應該沒問題。它的管理界面只能由一個人使用,並且最多隻能綁定一個dyno,因爲所有上傳的文件都是串行發送的。

任何想法?

+0

你看過delayed_pa​​perclip(https://github.com/jstorimer/delayed_pa​​perclip)嗎?如果您使用回形針爲上傳的圖像創建樣式,則可能需要大量資源,因爲圖像處理可能是瓶頸。 – John

+0

我得看看這個寶石..但是我的理解有沒有差距?即使它是流程密集型的,它仍然是連續的。 –

+0

delayed_pa​​perclip +沒有工作的寶石。 delayed_pa​​perclip爲每個文件處理位產生Delayed_Jobs,並且無工作的自動生成Heroku工作者在後臺處理它們。 – poetmountain

回答

1

我一直在解決相同的問題幾天。據我瞭解,問題是,當通過heroku上傳文件時,您的請求仍受30秒超時限制的約束。最重要的是,似乎後續的請求發送到相同的dyno(應用程序實例)可能導致它累積響應時間並終止。例如,如果您向Web應用程序發出兩個後續請求,每個請求需要15秒才能上傳,則可能會收到超時,這將強制dyno終止請求。這很可能是您收到超時錯誤的原因。如果這種情況繼續存在多個dynos,那麼最終可能會導致應用程序崩潰,或者通常性能不佳。

我最終做的是使用jquery-file-upload。但是,如果您正在上傳大文件(多個MB),那麼您仍然會遇到錯誤,因爲heroku仍在處理上傳。特別是I used this technique可以完全繞過heroku並直接從客戶端瀏覽器上傳到s3。我使用它來上傳到臨時目錄,然後使用carrierwave通過將作業推送到Qu來「重新下載」該文件並在後臺處理介質和縮略圖版本。現在,沒有超時,但用戶必須等待作業在後臺處理。

另外需要注意的是,heroku dynos彼此獨立運作,所以通過增加網絡dynos的數量,您可以爲其他用戶創建更多的應用程序實例,但每個實例仍然需要30秒的超時時間, 512Mb的內存。無論您擁有多少個dynos,您仍然會遇到同樣的問題。 More dynos != better performance

+0

但在我的情況下,上傳是串行的。上傳2甚至沒有開始,直到上傳1收到200響應。在這種情況下,我永遠不應該有兩次上傳。看起來會發生的是Heroku發佈200響應。同時paperclip已經發布了內核中的一個exec,用於轉換/標識,這在請求之外,但是導致你的dynos資源枯竭......這就是我的理論。 –

0

您可以使用類似Dropzonejs的東西,以便將您的文件分成隊列並分別發送。這樣的請求不會超時。