【问题标题】:AWS Lambda with Elasticache Redis without NATAWS Lambda 与 Elasticache Redis 没有 NAT
【发布时间】:2020-06-20 22:01:02
【问题描述】:

我将提及我的需求以及我目前拥有的东西,所以请耐心等待。首先,一个 lambda 函数说 F1 在调用时会从一个站点获得 100 个链接。这些链接中的大多数说大约 95 个与上次调用 F1 时相同,因此必须仅对这 5 个“新”链接进行进一步处理。一种解决方案是将已经处理的链接写入 Dynamodb 数据库,并且每次调用 F1 时,查询数据库并跳过这些链接。但是我发现“数据库读取”虽然以毫秒为单位使 lambda 运行时间增加了一倍,尤其是如果 F1 被频繁调用并且如果有一百万个已处理的链接。所以我决定将 Elasticache 与 Redis 一起使用。

我很快发现只有当 F1 在同一个 VPC 上运行时才能访问 Redis,并且因为 F1 需要访问互联网,所以需要 NAT。 (我对网络了解不多)所以我按照指南设置了 VPC 和 NAT 并让一切正常工作。我对性能改进感到高兴,几乎将预期的 lambda 成本降低了一半,降至每月 30 美元。但后来我发现 NAT 不包含在免费套餐中,我必须每月为 NAT 支付近 30 美元。这对我来说并不理想,因为这个项目可能需要几个月的开发时间,而且我觉得我支付与 compute 相同的金额只是为了 internet 访问

我想知道我是否犯了任何基本错误。我是否以正确的方式使用 Elasticache?有没有更好的方法可以同时访问 Redis 和 Internet?有没有办法以不同的方式构建我的堆栈,以便在免费层结束后我保持性能而无需支付两倍的金额。也许添加另一个 lambda 函数?我没有任何想法。非常感谢任何 分钟 改进。谢谢。

【问题讨论】:

  • 也许先建立另一个pre-F1 来过滤掉重复的链接?所以你可以避免在这个解决方案中添加更多的层?
  • 我正在使用名为 colly 的 GoLang scraper,它内置了对 Redis 的支持,因此如果它在同一个函数中是最佳的。我不介意再增加一层,只要它比我使用 DynamoDB 获得的性能更好。会试试这个。
  • 我也在考虑另一种潜在的解决方案,在 EC2 上运行 Redis 服务器并从 lambda 访问它。

标签: amazon-web-services redis aws-lambda amazon-dynamodb amazon-vpc


【解决方案1】:

有很多方法可以实现这一点,而且它们都有一些权衡。其他一些想法供您考虑:

  1. 在没有 VPC 的情况下运行 F1。它无需 NAT 即可直接连接到 DynamoDB,从而为您节省 NAT 网关的成本。

  2. micro EC2 实例而不是在 Lambda 中运行您的函数,并将您的链接查找保存到本地磁盘上的某个文件,甚至是本地 Redis。随着无服务器的大肆宣传,我认为人们有时会高估简单地运行操作系统的难度(和稳定性)。管理起来并不难,设置备份也很容易,根据您的可用性要求和其他需求,它可能是一种选择。

  3. 将链接数据保存到 S3 并将 VPC 端点设置为 S3 gateway endpoint。不确定它是否足以满足您的需求。

【讨论】:

  • 1.正如我所提到的,使用 Redis 而不是 DynamoDB 将我的实例时间减少了一半,因此不愿意使用 DynamoDB。 2. 好吧,总的来说,我觉得这是一个很好的解决方案,但我认为它对我没有好处,因为我本质上是一个爬虫,而 lambda 也可以作为一个免费的“代理”。 (据我所知,lambda 的 IP 地址可能会随着时间的推移而改变,这对我来说非常有益) 3. 我不知道这一点。我会试试这个,看看它是否比 1 更好。
猜你喜欢
  • 2021-11-08
  • 2019-09-12
  • 2017-05-23
  • 2018-05-06
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多