【问题标题】:Caching and invalidating AWS Lambda response缓存和使 AWS Lambda 响应无效
【发布时间】:2017-07-23 04:24:11
【问题描述】:

我正在尝试在 AWS 上实施如下解决方案:

我有一个每天运行一次的爬虫来索引某些网站。我想缓存这些数据并以 API 的形式公开它,因为在抓取之后,这些数据一整天都不会改变。爬虫重新取回后,我想使这个缓存失效并重建以提供更新的数据。我正在尝试使用无服务器架构来构建它。

可能的解决方案

很明显,爬虫将在 AWS Lambda 上运行。我不清楚的是如何管理将为数据提供服务的缓存。以下是我想到的一些解决方案

  1. 用于缓存的 S3 和 Cloudfront: 爬取后,将数据以 .json 文件的形式存储在 S3 中,将使用 AWS Cloudfront 进行缓存。当爬虫重新获取新数据时,它会重建这些文件并要求 Cloudfront 使缓存失效。

  2. API Gateway DynamoDB:抓取后将数据存储在 DynamoDB 中,然后由缓存的 API Gateway 提供服务。这里唯一的问题是,当爬虫重新爬取时,我怎么能要求这个缓存在一天结束时失效?由于数据将是一天的静态数据,我怎么能不为 DynamoDB 运行的额外时间付费(因为如果我在 API Gateway 上实现缓存,那么只有一次调用 DynamoDB 进行缓存,之后它将处于空闲状态一天)

还有其他我想念的方法吗?

谢谢!

【问题讨论】:

  • 您无需为 DynamoDB 的“闲置”一天付费。

标签: amazon-s3 amazon-dynamodb aws-lambda aws-api-gateway serverless-architecture


【解决方案1】:

您可以将新数据存储在 S3 中包含创建日期的不同路径中。可能是这样的:

index_2017_08_11.json

那么就不需要在 CloudFront 端使缓存失效。由于要访问这些新对象,您需要提供新的 URL,所以旧的 CloudFront 缓存不会成为问题。您可以使用 S3 TTL feature 删除前一天的 S3 文件。

另一种选择是设置Expires缓存HTTP头来设置缓存中的数据should be invalidated:

Expires 标头字段可让您指定到期日期和时间 使用 RFC 2616 中指定的格式,超文本传输​​协议 -- HTTP/1.1 第 3.3.1 节,完整日期,例如:2015 年 6 月 27 日,星期六 格林威治标准时间 23:59:59

您可以在 API Gateway 中设置此标头以指定对象何时应失效。

既然数据会是一天的静态数据,我怎么能不付钱呢? DynamoDB 将运行的额外时间

如果数据是静态的,是否可以将其存储在 S3 中并使用 API Gateway 从 S3 而不是 DynamoDB 提供数据?

【讨论】:

  • 由于客户端的 URL 将被静态编码,因此最好使缓存无效并要求 Cloudfront 重新验证它,以便不需要更改客户端 URL。数据在一天内是静态的,但每天都会变化,但在 S3 中存储 json 文件似乎更像是一种 hack,而不是真正的解决方案。对于我的用例,我还有什么可以在 AWS 中使用的吗?我想使用 Lambda -> 在某处缓存 1 天 -> 通过 API 提供缓存 -> 一天后失效
  • 这个怎么样:Lambda爬虫->写入S3;客户端 -> Cloudfront(在边缘缓存数据)-> API Gateway -> Lambda(设置 Expires 标头)-> S3。
  • 在这种情况下,您将收到一个对 Lambda 的请求,因为如果您设置“Expires”标头,Cloudfront 将保留缓存直到一天结束,并且只有在缓存到期时才会执行另一个请求。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
相关资源
最近更新 更多