2014-05-25 23 views
0

我有一個簡單的安裝程序,用於在rails中構建的API。帶有sidekiq的Heroku文件存儲器

通過POST上傳一個zip文件,我將該文件存儲在rails.root/tmp中,使用carrierWave,然後使用sidekiq將s3上傳到後臺。

我暫時存儲文件的原因是因爲我無法發送一個複雜的對象到sidekiq,所以我存儲它併發送id,並讓sidekiq找到它並使用它,然後刪除文件完成。

問題是,一旦我的sidekiq工作人員通過它的路徑找到文件,它就不能因爲它不存在。我讀過,當重新配置/服務器重啓等情況下,heroku的短暫文件系統會刪除它的文件。

這些事情都沒有發生,但文件不存在。所以我的理論是,sidekiq worker實際上是試圖打開在它自己的文件系統上傳遞給它的路徑,因爲它是一個單獨的工作者,並且該文件不存在。有人可以證實這一點?如果是這種情況,是否有其他方法可以做到這一點?

回答

1

如果您的工作人員在您的網絡進程以外的另一個測功機上執行,則由於動態隔離,您遇到此問題。在這裏閱讀更多關於此:https://devcenter.heroku.com/articles/dynos#isolation-and-security

儘管可能在同一臺機器上運行sidekiq工作和web進程(可能不在heroku上,但我不確定),但不建議您設計系統體系結構像那樣。

如果您的應用程序增長或經歷了暫時的高負載,您可能希望將負載分散到多個服務器上,並且通常還會在不同於您的Web進程的服務器上運行您的工作,以便在您的應用程序工作人員保持服務器繁忙。

在所有這些情況下,您永遠無法在Web進程和worker之間共享本地文件系統上的數據。

我會建議考慮使用https://github.com/waynehoover/s3_direct_upload 這也需要大量的負載斷開你的網絡服務器

+0

感謝文件直接上傳到S3。我會考慮這一點,不幸的是它是前端的iphone應用程序,但會查看類似的解決方案 – volk

+0

在您的情況下,解決方案可能會更簡單。在您的iOS應用程序中,您可以直接上傳到S3,而無需關心不公開任何S3憑證。我對iOS開發並不熟悉,但是有適合您的直接S3文件存儲的SDK。 –

相關問題