【问题标题】:Refresh every 5 seconds - how to cache s3 files?每 5 秒刷新一次 - 如何缓存 s3 文件?
【发布时间】:2019-11-11 10:43:49
【问题描述】:

我将我的用户模型的图像文件存储在 s3 上。我的前端每 5 秒从后端 (nodeJS) 获取新数据。在每次提取中,都会检索所有用户,这涉及从 s3 获取图像文件。一旦应用程序扩展,这会导致 s3 上的大量请求和高成本,所以我认为在后端缓存文件是有意义的,因为它们一旦上传就很少更改。

我该怎么做?将从 s3 下载的文件缓存到服务器的本地文件系统中,并且仅在发生新上传时再次下载它们?还是有更好的机制?

或者,当我在 s3 文件上设置缓存标头时,每次我调用 s3.getObject 时是否仍会获取它们,还是已经实现了我想要做的事情?

【问题讨论】:

    标签: node.js caching amazon-s3


    【解决方案1】:

    您在成本方面是对的,CloudFront 不会改进。我误导了。

    回到您的问题,您可以将文件缓存在 S3 存储桶中,为此添加元数据。 例如:

    Cache-control = max-age=172800
    

    您可以在控制台中执行此操作,或者通过 aws cli 例如。

    如果您直接请求文件,并且这些文件有标题,浏览器应该执行check on the etag

    使用 ETag 验证缓存的响应 TL;DR 服务器使用 ETag 用于传递验证令牌的 HTTP 标头。验证令牌 启用有效的资源更新检查:不传输数据,如果 资源没有改变。

    如果您使用 s3.getObject 方法请求文件,它无论如何都会执行请求,因此它会再次下载文件。


    推送而不是请求:

    如果您无法做到这一点,您可能需要考虑后端仅将新数据推送到前端,而不是每 5 秒请求一次新数据,这样会显着降低负载。

    ---

    没有那么划算,更注重速度。

    您可以将 CloudFront 用作 S3 存储桶的 CDN。这将使您能够更快地获取文件,而且 CloudFront 也会为您处理缓存。

    您需要根据需要设置 TTL,如果需要,您还可以在每次上传文件时使缓存无效。

    From the docs:

    使用 S3 存储静态内容具有很多优势。但为了帮助优化应用程序的性能和安全性,同时有效地管理成本,我们建议您还设置 Amazon CloudFront 以使用您的 S3 存储桶来提供和保护内容。 CloudFront 是一项内容交付网络 (CDN) 服务,可在全球范围内安全、大规模地交付静态和动态 Web 内容、视频流和 API。按照设计,从 CloudFront 交付数据比从 S3 直接向您的用户交付数据更具成本效益。

    【讨论】:

    • 这主要是为了提高性能,而不是减少实际的数据传输,从而降低成本,对吧?
    • 可能降低数据传输成本。由于数据并非每次都从特定 AWS 区域的同一个 S3 存储桶传输。所以基本上,如果数据在 S3 中没有变化,它总是会响应缓存的版本(这也与你的 TTL 相关),因此数据传输更少。
    • 据我了解 CloudFront 您不必为 s3 和 CloudFront 之间的数据传输付费,而只需为您的服务器和 CloudFront 之间传输的数据付费,这实际上意味着它是与直接从 s3 中检索它的数量相同,因为将缓存 s3 和 CloudFront 之间的通信。
    • @phoebus 抱歉,您在成本方面完全正确,实际上并没有改善它。我做了另一个想法的更新,你能否指定为什么你需要每 5 秒更新一次所有用户图像?他们经常改变吗?如果是这样,缓存也不是一个有效的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2016-03-21
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    相关资源
    最近更新 更多