我有一个Node.js (v 12.x) Express站点作为Lambda函数在负载均衡器的单个实例后面运行。负载均衡器设置为 us-east-1a 和 us-east-1b。一切都在同一个区域。我使用负载均衡器的原因是因为这是您可以将 Route 53 域路由到 Lambda 函数的唯一方法。
当我第一次启动所有内容时,在从网站接收任何内容之前至少有 6 秒,最多 10 秒的延迟。即使我做了一个简单的页面刷新,从我的服务器取回任何内容所需的时间至少是 6 秒,即使浏览器缓存了它。然而,所有文件最终都在 Chrome DevTools 窗口中以零错误交付,平均只需要大约 10 秒才能看到页面。
为了加快速度,我将 Lambda 函数的内存从 128 MB 增加到 1024 MB,并将其中单个 Express 应用程序的内存大小设置为相同的值。然后我提供了 3 个并发单元和 5 个保留的并发单元。我还将超时值提高到最大值 29 秒。这解决了速度问题,并将响应时间降至 3 秒以下。但是,除了前几个请求之外,我立即开始在浏览器中收到每个交付的文件的 502 错误。浏览器确实会快速重试,然后在第二次通过时获取大部分文件。不幸的是,它永远不会得到所有这些,而且总是很少有它们从未被下载并在 Chrome DevTools 窗口中显示为中止 502 错误 (ERR_ABORTED),
- 如果我查看 Lambda 监视器屏幕,则没有任何图表显示错误。
- 如果我查看 Cloudwatch 日志,我也看不到任何错误。
- 但是,如果我从保存它们的 S3 存储桶下载负载均衡器访问日志,在前 2 或 3 个成功处理请求之后,我会看到大量像这样的“Lambda Throttling”错误:
h2 2021-11-18T02:56:38.095418Z app/MAIN-BALANCER/506da40318eeac61a552 {REMOVED}:18034 - 0.004 0.009 0.000 502 - 44 594 "GET https://neobandbattles.com:443/javascripts/google-closure/base.js HTTP/2.0" "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 arn:aws:elasticloadbalancing:us-east-1:977323236257:targetgroup/EXPRESS-LAMBDA-FUNCTION/2dfd7eac9069e4feb81 "Root={REMOVED}" "neobandbattles.com" "arn:{REMOVED}" 0 2021-11-18T02:56:38.082000Z "forward" "-" "LambdaThrottling" "-" "-" "-" "-"
该网站每天最多有 2 或 3 个访问者。我已经阅读了有关 Lambda 限制的文档,但我看不出有任何方式达到了 1000 个并发请求限制或任何接近它的限制。有人可以告诉我如何解决这个问题吗?请注意,网站总共只请求了大约 22 个文件,这些文件是呈现页面所必需的。这不像渲染页面需要大量可能触发限制错误的请求。这里还有其他严重错误。
这是我的 serverless.yml 文件的相关部分,因为它设置了 Lambda 函数配置:
service: my-web-site
projectDir: ./
provider:
name: aws
runtime: nodejs12.x
timeout: 29 # Max is 29 seconds.
tracing:
lambda: true
iamRoleStatements:
- Effect: "Allow"
Action:
- dynamodb:Query
- dynamodb:Scan
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:DeleteItem
Resource: "{REMOVED}"
stage: dev
region: us-east-1
memorySize: 1024
environment: {REMOVED}
functions:
app:
description: My web site
handler: app/app.handler
events:
- http:
path: /
method: ANY
cors: true
- http:
path: /{proxy+}
method: ANY
cors: true
memorySize: 1024
provisionedConcurrency: 3
reservedConcurrency: 5
tracing: PassThrough
package:
exclude:
- .git/**