Flask Socket-IO 跨 Google Cloud Run 容器实例发出

问题描述 投票:0回答:1

我一直在开发一个使用 Flask Web 服务器、Flask socket-io 和 Flask 会话的 Web 应用程序。之前我通过 docker 镜像部署到 Google Cloud Run。 Google Cloud Run 根据流量增加了活动容器的数量,并且为了实现会话持久性,我正在使用 Gunicorn、Redis、Eventlet 新部署到网络。

然而,使用 redis 和 eventlet 会引发使用 Flask socket-io 发出的问题。尝试发出时会记录以下消息:

Cannot publish to redis... giving up

这会导致发射无法工作。

在网上搜索后,我相信我的问题是因为 Redis 没有正确设置以允许 Google Cloud Run 容器相互发送。我已经研究了好几天的配置,但似乎无法弄清楚。有谁知道为什么会出现这个问题?

这是我的 docker 文件

FROM python:3.8.12
WORKDIR .
RUN apt-get update && apt-get install -y \
  redis-server 
COPY requirements.txt /tmp/requirements.txt
COPY . .
RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r /tmp/requirements.txt
ENV PORT 8080
#EXPOSE $PORT
CMD exec gunicorn --worker-class eventlet --bind :$PORT --workers 1 --threads 8 --timeout 0 server:app

我的 server.py 文件中的设置

import eventlet
eventlet.monkey_patch()
# other imports
# ...
# Initiate session
Session(app)

# Initiate socket IO object
socketio = SocketIO(app, message_queue='redis://')
# I additionally tried socketio = SocketIO(app, message_queue='redis://0.0.0.0:6379')

# Example of how I emit within a path
@app.route('/path', methods=['GET'])
def functionThatEmits():
    # some stuff
    socketio.emit(someval, someval, namespace='/anamespace', broadcast=True)
    # more stuff

# How the app is run
if __name__ == "__main__":
    socketio.run(app, host='0.0.0.0', port=8080, debug=False) # For running on gcloud

redis、eventlet、flask-socketio、flask、gunicorn的版本如下

eventlet==0.33.3
Flask==2.3.2
flask_session==0.5.0
Flask_SocketIO==5.1.1
redis==5.0.0 
gunicorn==21.2.0

谢谢大家的宝贵时间。

docker google-cloud-platform redis flask-socketio eventlet
1个回答
0
投票

我最终尝试了来自谷歌云的redis内存存储,它似乎解决了我的问题。对于将来遇到此问题的任何人,请按照此处操作,并使用以下命令作为gunicorn命令。

gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 server:app

像这样定义套接字 IO:

socketio = SocketIO(app, message_queue=f'redis://{redis_host}:{redis_port}')

最后像这样运行应用程序:

socketio.run(app, host='127.0.0.1', port=8080, debug=False)

您不需要 eventlet 或猴子修补,因此您可以将其删除并确保在 server.py 中导入 redis。

对于那些好奇的人来说,在问题中,gunicorn 命令不正确,请参阅here了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.