gpt4 book ai didi

python - 将响应发送回客户端时,AWS lambda 未完成执行

转载 作者:行者123 更新时间:2023-12-04 15:00:47 26 4
gpt4 key购买 nike

我正在尝试使用 FastAPI 实现即发即弃机制。我在实现该机制时遇到了一些困难。

我有两个应用程序。一种是用 FastAPI 开发的,另一种是 Flask 开发的。 FastAPI 将在 AWS Lambda 中运行,并将请求发送到在 AWS ECS 上运行的 Flask 应用。

目前,我能够向 Flask API 发送请求并立即收到来自 FastAPI 应用程序的响应。但我看到 FastAPI 仍在后台运行 bg_tasks.add_task(make_request, request),它在 lambda 执行阈值时间(15 分钟)后超时。

快速 API 应用:


def make_request(data):
"""
Function to make a post request to flask application
:param data: Data from the user to write into the file
:return: None
"""

print("***** Inside post *****")

requests.post(url=root_url, data=data)

print("***** Post completed *****")


@router.post("/write-to-file")
async def write_to_file(request: Dict, bg_tasks: BackgroundTasks):
"""
Function to queue the requests and return to the post function
:param request: Request from the user
:param bg_tasks: Background task instance
:return: Some message
"""

print(f"****** Request call started ******")

bg_tasks.add_task(make_request, request)

print(f"****** Request completed ******")

return {"Message": "Data will be written into the file"}

flask 应用:

@app.route('/', methods=['POST'])
def write():
"""
Function to write the request data into the file
:return:
"""
request_data = request.form
try:
print(f"Sleep time {int(request_data['sleep_time'])}")
time.sleep(int(request_data["sleep_time"]))
request_data = dict(request_data)
request_data['current_time'] = str(datetime.now())
with open("data.txt", "a") as f:
f.write("\n")
f.write(json.dumps(request_data, indent=4))

return {"Message": "Success"}

except Exception as e:
return {"Message": e}

Fast API(http://localhost:8000/write-to-file/)调用write_to_file方法,将所有任务(请求)加入后台队列,并在后台运行.

该函数不等待进程完成。但是,它将响应返回给客户端。 ma​​ke_request 方法将触发 Flask 端点 (http://localhost:5000/),后者将处理请求并写入文件。将 make_request 视为一个 AWS lambda,如果 flask 应用程序需要更多时间来处理,lambda 将等待更长的时间。

是否可以在请求发布后终止 lambda,或者采取其他措施来解决超时问题?

最佳答案

使用当前设置,您的 lambda 会运行很长时间,因为 Flask 端点需要处理您的请求。实际上,两个 API 的运行时间完全相同。

这是因为 lambda 函数中的 requests.post 必须等待响应完成。鉴于您不关心该响应的结果,我可以想出其他几种方法来解决这个问题。

如果我是你,我会把队列处理移到ECS端。然后,lambda 唯一负责将作业放入 ECS worker 在有容量时将处理的队列中。

此选项可让您摆脱其中一个 API:您将能够直接查询 Flask API 并终止 lambda 函数,或者终止 Flask API 并在 ECS 上运行工作进程。

或者,您可以 respond early在 Flask API 端,这将完成您的 HTTP 请求,从而更快地完成 lambda 执行。这可能会使设置变得困惑,并且首先违背了公开 HTTP API 的目的。此外,在某些情况下,Flask 请求的执行可能会在默认超时(~30 秒)后被网络服务器终止。

最后,如果您真的非常想保留您现在的代码,您可以设置 request to timeout很短的时间后。如果您走这条路,请确保为 Flask 选择足够长的超时以开始处理请求:

try:
requests.post(url=root_url, data=data, timeout=5) # throw after 5 seconds of waiting
except requests.exceptions.Timeout:
pass

关于python - 将响应发送回客户端时,AWS lambda 未完成执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67002640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com