AppEng Py Flexi ::长时间运行的请求:: 502错误

时间:2018-08-14 02:20:49

标签: python-3.x google-app-engine

我的应用程序(py3,应用程序引擎flexi)接收到一个Web请求>运行BQ查询>获取数据>处理数据(不是占用大量CPU!)>返回响应。

请求可以由

调用
  • 直接在浏览器中尝试使用URL
  • 或通过cron作业调用URL作业

由于BQ查询的性质:

  • 我确定该请求将花费> 30秒的时间(大约2-5分钟)
  • 我不关心并发请求的数量,只有几个请求会同时出现(<10)

我遇到[CRITICAL] WORKER TIMEOUT(PID:7)错误,我认为我通过调整gunicorn.conf.py中的timeout设置得以解决。但是Nginx继续返回502 error作为响应(并且cron作业状态以Failed结尾)

有人可以分享为什么我继续出现502错误以及应调整哪些参数(在app.yaml或应用程序PY代码中)以管理此超时吗?最佳做法是如何处理您确定需要2-5分钟(甚至更长的时间)的请求

或者,我现在正在考虑创建Cloud Function端点,因为CF支持PY(并支持higher timeouts as high as 9 minutes ..)

1 个答案:

答案 0 :(得分:2)

即使您知道请求将花费<9分钟,也不是让客户端应用等待的好习惯,因为有多种方法可以中断请求。

做到这一点的方法是通过工作/操作(正是BQ,大多数Google API都这样做)。查询开始后(插入BQ作业),您将存储BQ返回的作业ID并为您的应用生成一个新的ID(例如,在数据存储区中)。

然后,客户端应用程序开始轮询此操作。每隔5秒,它会询问您的应用程序(或您的功能)是否完成了操作。然后,您的应用会从存储checks in the BQ API if that job is finished中检索BQ作业ID,并在未完成的情况下返回未完成的状态。

一旦应用检查了BQ端的作业是否完成,it can retrieve the data,对其进行处理并返回结果。

这将使该过程更具幂等性和弹性,并避免保持所有这些连接均处于打开状态,而这些连接根本无法扩展。

使用这样的体系结构,您可以将其部署到任何您喜欢的位置(GAE,函数等),并且仍然可以使用。为了易于使用,我将使用带有数据存储区的Google Cloud Functions(用于存储您的操作ID),但是在这种情况下,这主要取决于您更习惯使用什么。