Heroku文件存储与sidekiq



我有一个简单的设置,我正在rails中构建一个API。

zip是通过POST上传的,我把文件,使用载波将其存储在rails.root/tmp中,然后后台使用sidekiq上传s3。

我临时存储文件的原因是因为我不能向sidekiq发送一个复杂的对象,所以我存储它并发送id,让sidekiq找到它并处理它,然后在完成后删除文件。

问题是,一旦我的sidekiq工作器通过路径找到文件时,它就找不到,因为它不存在。我读到过heroku的临时文件系统会在重新配置/重启服务器等情况下删除文件。

这些事情都没有发生,但是文件不存在。所以我的理论是,sidekiq工作程序实际上是试图打开传递到它自己的文件系统上的路径,因为它是一个单独的工作程序,并且该文件不存在。有人能证实吗?如果是这样的话,还有其他的方法吗?

如果您的worker在web进程之外的另一个动态进程上执行,则由于动态隔离而遇到此问题。在这里阅读更多内容:https://devcenter.heroku.com/articles/dynos#isolation-and-security

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

如果您的应用程序增长或经历暂时的高负载,您可能希望将负载分散到多个服务器上,并且通常在单独的服务器上运行您的worker而不是您的web进程,以便在您的worker使服务器保持繁忙的情况下不会阻塞web进程。

在所有这些情况下,你永远不能在web进程和worker之间共享本地文件系统上的数据。

我建议考虑使用https://github.com/waynehoover/s3_direct_upload直接将文件上传到S3这也为你的web服务器减轻了很多负担

最新更新