我们正在 Heroku 上构建一个 Rails 应用程序,用户可以在其中上传图像(存储在 S3,美国标准区域)。用户可以向朋友发送一个链接,他们可以在其中将图像下载为存档 (zip)。这个档案必须即时生成——根据一些“神奇规则”,每个用户的内容(即哪个图像)都是不同的。
问题:当朋友打开下载 URL 时,需要几秒钟来构建存档。所有图像(总共大约 4Mb)都必须从 S3 下载到 Rails 应用程序,然后打包到存档中。您是否有加快此过程的想法,或者您能帮我评估以下选项吗?
- 异步下载:我们可以使用异步作业队列进行打包(这不会使过程更快,但可扩展性更好:))
- 在文件系统上缓存:我们可以在文件系统上缓存图像。但由于 Heroku 上的 Web 进程不一定共享相同的文件系统,因此必须为每个新的 Web 进程执行此操作。
- 并行下载:下载当前是按顺序完成的,线程(哎呀,更好的几个作业队列?)可用于并行化
- 通用缓存组件(memcached、redis):我们可以使用 memcached 或 redis 来更快地访问,而不是在文件系统上进行缓存(因此我们不必为每个 Web 进程预热缓存)。
我对缓存策略做了一些简短的基准测试,我尝试从不同的位置下载 100Kb:
- 文件系统:0.0002s
- 内存缓存:0.01s-0.09s
- Redis:0.01s-0.09s
- S3:0.1-0.25s
因此使用缓存(文件系统、memcached 或 redis)肯定会提高性能,最终的解决方案可能是结合不同的方法。
你会觉得吗?非常感谢您的帮助!