【问题标题】:Heroku file storage with sidekiqHeroku 文件存储与 sidekiq
【发布时间】:2014-07-14 14:21:04
【问题描述】:

我有一个简单的设置,用于我在 Rails 中构建的 API。

通过 POST 上传 zip,然后我获取文件,使用carrierwave 将其存储在rails.root/tmp 中,然后使用sidekiq 进行s3 上传。

我暂时存储文件的原因是因为我无法将复杂对象发送到sidekiq,所以我存储它并发送id,让sidekiq找到它并使用它,然后在完成后删除文件.

问题是,一旦我的 sidekiq 工作人员需要按路径查找文件,它就不能,因为它不存在。我读过 Heroku 的临时文件系统会在重新配置/重新启动服务器等时删除其文件。

这些事情都没有发生,但是文件不存在。所以我的理论是sidekiq工作人员实际上是在尝试在自己的文件系统上打开传递给它的路径,因为它是一个单独的工作人员并且该文件不存在。有人可以证实这一点吗?如果是这种情况,是否有任何替代方法可以做到这一点?

【问题讨论】:

    标签: ruby-on-rails file-upload heroku carrierwave sidekiq


    【解决方案1】:

    如果您的工作人员在您的 Web 进程之外的另一个测功机上执行,您会因为测功机隔离而遇到此问题。在此处阅读更多信息:https://devcenter.heroku.com/articles/dynos#isolation-and-security

    虽然可以在同一台机器上运行 sidekiq worker 和 web 进程(也许不在 heroku 上,我不确定),但不建议这样设计你的系统架构。

    如果您的应用程序增长或遇到临时高负载,您可能希望将负载分散到多个服务器上,并且通常还会在与您的 Web 进程不同的服务器上运行您的工作程序,以便在您的工作程序运行时不会阻塞 Web 进程使服务器忙。

    在所有这些情况下,您永远无法在 Web 进程和工作线程之间共享本地文件系统上的数据。

    我建议考虑使用https://github.com/waynehoover/s3_direct_upload 直接将文件上传到 S3 这也减轻了您的网络服务器的大量负载

    【讨论】:

    • 谢谢。我会考虑这个,不幸的是它是前端的 iphone 应用程序,但会研究类似的解决方案
    • 在您的场景中,解决方案可能更简单。在您的 iOS 应用程序中,您可以直接上传到 S3,而不必担心不暴露任何 S3 凭据。我不熟悉 iOS 开发,但有一些 SDK 可以直接存储 S3 文件。
    猜你喜欢
    • 2014-06-26
    • 2023-03-19
    • 2016-09-25
    • 1970-01-01
    • 2014-11-18
    • 2016-05-04
    • 2015-12-31
    • 2016-10-24
    • 1970-01-01
    相关资源
    最近更新 更多