我正在尝试在AWS上实施如下解决方案:
我有一个爬虫程序,它将每天运行一次以索引某些网站。我想缓存这些数据并以 API 的形式公开它,因为在抓取后,这些数据一整天都不会改变。爬网程序重新获取后,我想使此缓存失效并重建以提供更新的数据。我正在尝试使用无服务器架构来构建它。
可能的解决方案
很明显,爬虫程序将在AWS Lambda上运行。我不清楚的是,如何管理将为数据提供服务的缓存。以下是我想到的一些解决方案
-
用于缓存的 S3 和 Cloudfront:爬网后,将数据以 .json 文件的形式存储在 S3 中,这些文件将使用 AWS Cloudfront 进行缓存。当爬网程序重新获取新数据时,它将重新构建这些文件并要求 Cloudfront 使缓存失效。
API 网关 DynamoDB :爬网后将数据存储在DynamoDB中,然后由缓存的 API 网关提供服务。这里唯一的问题是,当爬网程序重新爬网时,我如何要求此缓存失效?由于数据将静态一天,我怎么能不为 DynamoDB 运行的额外时间付费(因为如果我在 API 网关上实施缓存,则只会调用一次 DynamoDB 进行缓存,之后它将闲置一天(
我还有其他方式吗?
谢谢!
您可以将新数据存储在 S3 中的不同路径中,其中包括创建日期。也许像这样:
index_2017_08_11.json
这样,就无需使 CloudFront 端的缓存失效。由于要访问这些新对象,您需要提供新的 URL,因此旧的 CloudFront 缓存不会成为问题。您可以使用 S3 TTL 功能删除前一天的 S3 文件。
另一种选择是将过期缓存 HTTP 标头设置为设置何时应使缓存中的数据失效:
"过期"标头字段允许您指定过期日期和时间 使用 RFC 2616 中指定的格式, 超文本传输协议 -- HTTP/1.1 第 3.3.1 节,完整日期,例如:周六, 27 Jun 2015 23:59:59 GMT
您可以在 API 网关中设置此标头,以指定何时应使对象失效。
由于数据将静态一天,我怎么能不支付 DynamoDB 将运行的额外时间
如果数据是静态的,是否可以将其存储在 S3 中,并使用 API 网关从 S3 而不是 DynamoDB 提供数据?