【问题标题】:How is inactivity time accounted in a wsgi application on aws lambda?在 aws lambda 上的 wsgi 应用程序中如何计算不活动时间?
【发布时间】:2019-09-15 11:40:54
【问题描述】:

主要问题是:部署在 aws Lambda 上的 wsgi 应用程序的时间是如何计算的?

假设我部署了以下简单的 Flask 应用:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
  return "Hello World!", 200

在 AWS Lambda 上使用 Zappa,配置如下:

{
    "dev": {
        "app_function": "simple_application.app",
        "profile_name": "default",
        "project_name": "simple_application",
        "runtime": "python3.7",
        "s3_bucket": "zappa-deployments-RANDOM",
        "memory_size": 128,
        "keep_warm": false,
        "aws_region": "us-east-1"
    }
}

现在,如果 AWS 对我的网站有请求,它会启动一个包含我的代码的容器,并让它处理该请求。假设请求在 200 毫秒内得到处理。

显然,内部带有 wsgi 服务器的 Lambda 继续运行(Zappa 默认使 lambda 运行至少 30 秒)。

现在到各个子问题:

  1. 执行需要多少时间?

    • 200ms 因为请求持续时间
    • 30 秒,因为我的 lambda 执行时间有以下限制
    • 直到 lambda 被 AWS 杀死以回收空间(甚至可能在 30-45 分钟后发生)
  2. 如果出现另一个请求(并且第一个请求仍在处理中),第二个请求是否会启动另一个 Lambda 容器,或者它将排队等待阈值时间过去?

通过阅读 AWS Lambda 定价页面,我预计只收取 200 毫秒的费用,但我敢打赌它会收取 30 秒的费用,因为毕竟,我是施加这种限制的人。

如果我只收取 200 毫秒(以及后续请求时间)的费用,但容器连续运行 30-45 分钟,我有第三个子问题:

  1. 现在假设我想使用一个全局变量作为一个简单的本地缓存,并在容器被杀死之前将它与数据库(比如说 DynamoDB)同步。 为此,我想将我的 lambda 的执行时间限制提高到 15m,然后在 lambda 创建时设置一个 Timer 来触发一个同步状态并在 14m30s 后中止该函数的函数。

    在此设置中计算的运行时间将如何变化(即,在一定时间后触发的计时器)?

此子问题的建议 lambda 代码是:

from flask import Flask
from threading import Timer
from db import Visits
import sys

lambda_uuid = "SOME-UUID-OF-LAMBDA-INSTANCE"

# Collects number of visits
visits = 0

def report_visits():
    Visits(uuid=lambda_uuid, visits=visits).save()
    sys.exit(0)

t = Timer(14 * 60 + 30, report_visits)
t.start()

# Start of flask routes
app = Flask(__name__)

@app.route("/")
def hello():
    visits = visits + 1
    return "Hello World!", 200

提前感谢您提供任何信息。

【问题讨论】:

    标签: aws-lambda sleep wsgi


    【解决方案1】:

    Zappa 默认让 lambda 运行至少 30 秒

    我找不到支持这一点的文档,而且我能找到的所有 Zappa 文档都指出,一旦返回响应,Zappa 函数将立即结束(就像任何其他 AWS Lambda 函数一样),因此您只是按生成响应所需的毫秒数计费。

    我确实看到 Zappa Lambda 函数的默认最长执行时间是 30 秒。也许这就是你感到困惑的地方?该设置只是告诉 AWS Lambda 在运行这么长时间时终止正在运行的函数实例。

    通过阅读 AWS Lambda 定价页面,我预计只收取 200 毫秒的费用,但我敢打赌它会收取 30 秒的费用,因为毕竟,我是施加这种限制的人。

    您需要为函数运行的确切时间付费。因此,如果它运行 200 毫秒,那么您需要支付 200 毫秒的费用。

    如果我只收取 200 毫秒(以及后续请求时间)的费用,但容器连续运行 30-45 分钟,我有第三个子问题:

    1. 它不会一直运行那么久,它会在返回响应时结束。
    2. 如果您的函数实例运行时间超过 30 秒,您将告诉 Lambda 终止它,因此在您当前的设置下,它的运行时间永远不会超过 30 秒。
    3. AWS Lambda 函数当前的最长运行时间是 15 分钟,因此无论如何它不可能运行 30-45 分钟。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      相关资源
      最近更新 更多