2

在开发中,带有 uwsgi 的 flask-socketio (4.1.0) 只需 1 个工作人员和标准初始化就可以很好地工作。

现在我正在为生产做准备,并想让它与多个工人一起工作。

我做了以下事情:

在 init_app 中添加了 redis message_queue:

socketio = SocketIO()
socketio.init_app(app,async_mode='gevent_uwsgi', message_queue=app.config['SOCKETIO_MESSAGE_QUEUE'])

(旁注:我们也在应用程序本身中使用 redis)

在我们使用 uwsgi 运行的文件顶部进行 gevent 猴子补丁

from gevent import monkey
monkey.patch_all()

运行 uwsgi:

uwsgi --http 0.0.0.0:63000 --gevent 1000 --http-websockets --master --wsgi-file rest.py --callable application --py-autoreload 1 --gevent-monkey-patch --workers 4 --threads 1

这似乎不起作用。连接开始在连接和 400 错误请求响应之间快速交替。我怀疑这些对应于我在启用 SocketIO 日志记录时看到的“无效会话 ....”错误。

最初它根本没有使用redis,

redis-cli > PUBSUB CHANNELS *

即使工人= 1,也会导致空结果。

似乎以下内容(取自另一个 SO 答案)修复了:

# https://stackoverflow.com/a/19117266/492148
import gevent
import redis.connection
redis.connection.socket = gevent.socket

这样做之后,我得到了一个更新数据的“flask-socketio”pubsub 频道。

但是在返回多个工人后,问题又回来了。鉴于更改 redis 套接字似乎确实使事情朝着正确的方向发展,我觉得猴子补丁还不能正常工作,但我使用的代码似乎与我能找到的所有示例相匹配,并且位于文件的最顶部由 uwsgi 加载。

4

2 回答 2

1

最终找到https://github.com/miguelgrinberg/Flask-SocketIO/issues/535

因此,您似乎也不能拥有多个使用 uwsgi 的工作人员,因为它需要粘性会话。文档中提到了 gunicorn,但我没有将其解释为扩展到 uwsgi。

于 2019-08-01T19:49:04.390 回答
1

您可以运行任意数量的工作程序,但前提是您将每个工作程序作为独立的单工作程序 uwsgi 进程运行。一旦所有这些工作人员都在自己的端口上运行,您就可以将 nginx 放在前面以使用粘性会话进行负载平衡。当然,您还需要消息队列供工作人员在协调广播时使用。

于 2019-08-02T08:52:24.200 回答