GCP Cloud Run Flask 应用已启动但未发布数据?

GCP Cloud Run Flask app starting but not publishing data?

提问人:Rudolph Sargenti 提问时间:11/17/2023 最后编辑:Rudolph Sargenti 更新时间:11/17/2023 访问量:19

问:

我有一个 Cloud Run 服务,其运行方式如下:

  1. 运行状况检查连接到“/”端点,flask 检测到此点并重定向到“/start”。
  2. 连接到“/start”,这将启动一个异步 main() 函数。
  3. 主要功能有一个 WebSocket 客户端连接到第三方服务器并等待数据。

在本地(Windows PC)和docker linux环境中,这可以正常工作。但是,当推送到 Cloud Run 时,运行状况检查通过并且 gunicorn 启动,但我从未看到 main 函数启动。

我尝试过打印语句和 Google 日志,但都没有从 Cloud Run 打印,只能在本地打印。甚至没有任何错误陈述。Gunicorn 收到“term”信号并在几分钟后关闭,但 Cloud Run 服务将继续运行。独角兽不会重新启动。 编辑:我也在Cloud Run模拟器中运行了它,运行良好。

以下是 python 代码(出于隐私原因进行了总结):

import asyncio
import os
import json
#import pytz
from datetime import datetime
from websockets.client import connect
from websockets.exceptions import ConnectionClosed
from flask import Flask, redirect
from google.cloud import logging

app = Flask(__name__)

@app.route('/')
def health_check():
    return redirect('/start')

@app.route('/start')
def start():
    asyncio.run(main())

async def format_message(data):
    #code for formatting and publishing data to pubsub Topic

async def main():
    headers = {
        "Authorization": "Bearer " + os.environ["API_KEY"],
        "Sec-WebSocket-Version": "13",
        "Connection": "Upgrade",
        "Upgrade": "websocket",
        "Host": "3rdparty:443"
    }
    
    async for websocket in connect(uri="wss://3rdparty:443/v1/stream?cid=our_host&type=message",      extra_headers=headers):
        try:
            print("socket started", flush=True)

            while True:
                message = await websocket.recv()
                await format_message(message)

        except ConnectionClosed as e:
            print(f"Connection closed: {type(e).__name__}: {e}", flush=True)
            
        except Exception as e:
            print(f"Error: {type(e).__name__}: {e}", flush=True)

这是我的 gunicorn 配置:

import os

workers = int(os.environ.get('GUNICORN_PROCESSES', '2'))

threads = int(os.environ.get('GUNICORN_THREADS', '4'))

bind = f"{os.environ.get('HOSTNAME', '127.0.0.1')}:{os.environ.get('PORT', '3000')}"

forwarded_allow_ips = '*'

secure_scheme_headers = { 'X-Forwarded-Proto': 'https' }

下面是 Dockerfile:

FROM python:3.10

API_KEY=SECRET_KEY \
PORT=8080 \
HOSTNAME=0.0.0.0 \
GUNICORN_THREADS=4 \
GUNICORN_PROCESSES=2 \
PYTHONUNBUFFERED=TRUE

EXPOSE 8080

COPY . /hsrb-proofpoint-pod-email-eds-avalon

WORKDIR /hsrb-proofpoint-pod-email-eds-avalon

RUN pip install -r requirements.txt

ENTRYPOINT ["gunicorn", "--config", "config.py", "main:app"]
docker 烧瓶 google-cloud-platform gunicorn google-cloud-run

评论

0赞 John Hanley 11/17/2023
您是否希望运行状况检查遵循重定向到?AFAIK,运行状况检查不遵循重定向。如果要计划对端点的 HTTP GET 请求,请使用 Cloud Scheduler。/start
1赞 guillaume blaquiere 11/17/2023
我不是python专家,asyncio对我来说很神秘。但是你是想在后台开始一些事情吗?Cloud Run 在请求上下文之外限制 CPU(但支持 websocket 并且运行良好)

答: 暂无答案