我使用 Gunicorn 和工作类型 gthread 在 Cloud Run 上运行 Flask 应用程序。在低级别上,此 API 仅从数据存储区和 Pubsub 写入/检索条目,因此所有操作都很轻。流量为每天 20,000 个请求,最大 QPS 20 个请求,平均 QPS 2
每隔几天/几周,一部分流量 (25%-50%) 就会收到 504 响应,并显示以下错误:
由于已达到最大请求超时时间,请求已终止。要更改此限制,请参阅https://cloud.google.com/run/docs/configuring/request-timeout
几个小时后,问题自行解决(重新部署应用程序或启动新的 CR 实例即可立即解决问题)。这些 504 请求似乎根本没有到达应用程序。此错误似乎与 stderr、stdout 中的任何错误或 QPS 的增加无关。我已经设置了一些高级日志记录和云分析器,但我没有得到任何有用的信息。该应用程序在具有gunicorn同步工作器的App Engine上运行得非常好。唯一的区别是gunicorn 设置。同步工作线程在 CR 上运行速度非常慢,所以我使用了 gthread。
有什么想法下一步该去哪里吗?
Dockerfile
ENTRYPOINT ["gunicorn"]
CMD ["-b", ":8080", "--worker-class", "gthread", "--workers", "5", "--threads", "2", "api.app:app" ]
Run Code Online (Sandbox Code Playgroud)
应用程序.py
def run(**kwargs):
app.run(port=8080, debug=False)
app = connexion.App(__name__, specification_dir='./swagger/')
app.app.json_encoder = encoder.JSONEncoder
app.add_api('swagger.yaml', resolver=connexion.resolver.RestyResolver('api'))
app.app.config.from_object(Config)
if __name__ == '__main__':
run()
Run Code Online (Sandbox Code Playgroud)
gcloud部署命令:
gcloud run …
Run Code Online (Sandbox Code Playgroud)