我的应用程序(py3,应用程序引擎flexi)接收到一个Web请求>运行BQ查询>获取数据>处理数据(不是占用大量CPU!)>返回响应。
请求可以由
调用由于BQ查询的性质:
我遇到[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 ..)
答案 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),但是在这种情况下,这主要取决于您更习惯使用什么。