1

我们正在 Heroku 上构建一个 Rails 应用程序,用户可以在其中上传图像(存储在 S3,美国标准区域)。用户可以向朋友发送一个链接,他们可以在其中将图像下载为存档 (zip)。这个档案必须即时生成——根据一些“神奇规则”,每个用户的内容(即哪个图像)都是不同的。

问题:当朋友打开下载 URL 时,需要几秒钟来构建存档。所有图像(总共大约 4Mb)都必须从 S3 下载到 Rails 应用程序,然后打包到存档中。您是否有加快此过程的想法,或者您能帮我评估以下选项吗?

  1. 异步下载:我们可以使用异步作业队列进行打包(这不会使过程更快,但可扩展性更好:))
  2. 在文件系统上缓存:我们可以在文件系统上缓存图像。但由于 Heroku 上的 Web 进程不一定共享相同的文件系统,因此必须为每个新的 Web 进程执行此操作。
  3. 并行下载:下载当前是按顺序完成的,线程(哎呀,更好的几个作业队列?)可用于并行化
  4. 通用缓存组件(memcached、redis):我们可以使用 memcached 或 redis 来更快地访问,而不是在文件系统上进行缓存(因此我们不必为每个 Web 进程预热缓存)。

我对缓存策略做了一些简短的基准测试,我尝试从不同的位置下载 100Kb:

  • 文件系统:0.0002s
  • 内存缓存:0.01s-0.09s
  • Redis:0.01s-0.09s
  • S3:0.1-0.25s

因此使用缓存(文件系统、memcached 或 redis)肯定会提高性能,最终的解决方案可能是结合不同的方法。

你会觉得吗?非常感谢您的帮助!

4

0 回答 0