【发布时间】: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 秒)。
现在到各个子问题:
-
执行需要多少时间?
- 200ms 因为请求持续时间
- 30 秒,因为我的 lambda 执行时间有以下限制
- 直到 lambda 被 AWS 杀死以回收空间(甚至可能在 30-45 分钟后发生)
如果出现另一个请求(并且第一个请求仍在处理中),第二个请求是否会启动另一个 Lambda 容器,或者它将排队等待阈值时间过去?
通过阅读 AWS Lambda 定价页面,我预计只收取 200 毫秒的费用,但我敢打赌它会收取 30 秒的费用,因为毕竟,我是施加这种限制的人。
如果我只收取 200 毫秒(以及后续请求时间)的费用,但容器连续运行 30-45 分钟,我有第三个子问题:
-
现在假设我想使用一个全局变量作为一个简单的本地缓存,并在容器被杀死之前将它与数据库(比如说 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