【问题标题】:Google Cloud Run: Error: Stream error in the HTTP/2 framing layerGoogle Cloud Run:错误:HTTP/2 帧层中的流错误
【发布时间】:2019-12-15 18:32:28
【问题描述】:

我使用https://www.starlette.io/、docker image python:3.7-slim-stretch 创建了一个 API,并且在本地以及在 AWS ECS 上部署时一切都运行良好。

但是当我尝试在 Google Cloud Run 上部署相同的应用程序时,我无法收到任何请求。 我可以使用根域/ 上的浏览​​器访问服务器,但是当我尝试访问/prediction-url 时,会收到类似Error: Stream error in the HTTP/2 framing layerService unavailable 的响应错误。尝试使用 Insomnia、javascript 请求以及 curl 请求访问 API。 奇怪的是,一切都在 AWS ECS 上 100% 运行,但我无法在 Googl Cloud Run 上运行。 部署到 Google Cloud Run 时有什么需要特别考虑的吗?

请求路由定义:

@app.route("/classify-url", methods=["GET"])
@requires("authenticated")
async def classify_url(request):
    img_bytes = await get_bytes(request.query_params["url"])
    return await predict_image_from_bytes(img_bytes)

服务器启动命令:

if __name__ == "__main__":
    if "serve" in sys.argv:
        # int(os.environ.get('PORT', 8080))
        uvicorn.run(app, host="0.0.0.0", port=8080, log_level="info")

码头文件:

FROM python:3.7-slim-stretch

RUN apt-get update && apt-get install -y git python3-dev gcc \
    && rm -rf /var/lib/apt/lists/*

COPY requirements.txt .

RUN pip install --upgrade -r requirements.txt

COPY . .

EXPOSE 8080
EXPOSE 8000
EXPOSE 80
ENV LISTEN_PORT=8080

# Start the server
CMD ["gunicorn", "-w 1", "-k uvicorn.workers.UvicornWorker", "-b 0.0.0.0:8080", "-t 8", "main:app"]

【问题讨论】:

    标签: google-cloud-platform google-cloud-run


    【解决方案1】:

    正如您在 known issues 中看到的,完全托管的 Cloud Run 不支持 HTTP 流式传输。团队正在努力,但目前无法使用,也没有公布发布日期。

    如果你想使用流式传输,你可以在 GKE 上使用 Cloud Run,但管理和成本不一样。

    【讨论】:

    • 感谢您的提示,我已将 gunicorntimeout 更改为 CMD ["gunicorn", "-w 1", "-k uvicorn.workers.UvicornWorker", "-b 0.0.0.0:8080", "-t 30", "main:app"] 之类的东西,现在它可以工作了。所以我猜这个错误更多地与超时或响应问题有关,然后是连接或套接字问题。仍然会感兴趣如何使用日志来解决这个问题,或者更好地锁定在哪里以及锁定哪些日志?
    • @BenWhite - 查看您所做的更改以及是否应该使用工人。 Cloud Run 确实支持后台线程,但是当 HTTP 请求返回时,CPU 空闲为零,这意味着后台线程将 CPU 不足导致它们失败。
    • @JohnHanley 这是一个非常有趣的观点,我实际上从未想过。我想我明白了你的观点,即与工作人员一起增加超时而不是防止线程 CPU 饿死,然后在请求 响应之间进行正确设置。您能否详细说明一下,或者指出正确的方向,在那里我可以找到有关正确设置的更多信息。例如,我知道处理一个单独的请求大约需要 3 秒,那么我如何确定正确的设置可能是什么?提前致谢!
    • @BenWhite - Cloud Run 是一种 HTTP 请求/响应设计。这意味着处理在您调用端点时开始,并在端点返回时结束。如果您有复杂的设计(多线程)或长时间的处理,Cloud Run 可能不是一个很好的匹配。我不建议将 Cloud Run 用于调用图像识别等其他服务的任务。 Cloud Run 应该是一项服务,而不是其他服务的代理。考虑到 30 秒超时和定价,F1-micro 实例可能是更便宜、更好的选择。
    猜你喜欢
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 2012-07-26
    • 2020-07-07
    • 2020-09-13
    • 1970-01-01
    • 2021-12-06
    相关资源
    最近更新 更多