1

我有一个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/**
4

0 回答 0