【问题标题】:Can't get multiple uwsgi workers to work with flask-socketio无法让多个 uwsgi 工作人员使用 flask-socketio
【发布时间】:2019-08-01 18:36:53
【问题描述】:

在开发中,带有 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 monkey 修补

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 *

即使 workers=1 也会导致空结果。

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

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

这样做后,我得到了一个“flask-socketio”发布订阅频道,其中包含更新数据。

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

【问题讨论】:

    标签: python redis uwsgi flask-socketio python-socketio


    【解决方案1】:

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

    所以看起来你也不能有多个使用 uwsgi 的工作人员,因为它需要粘性会话。文档中提到了 gunicorn,但我没有将其解释为扩展到 uwsgi。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,我现在明白了。让我失望的是,在使用 gunicorn 的文档中,它明确提到了 w=1 并且负载平衡算法太简单而无法正常工作。我错误地认为没有提及 uwsgi 意味着它适用于 uwsgi。我想将所有请求上下文移动到例如是不可行的。雷迪斯?所以你可以不用粘滞会话吗?
      • 这个问题已经被问过很多次了。这是一个棘手的问题,因为在任何给定时间都可能有来自客户端的两个未完成的请求。如果没有粘性会话,这两个请求可能最终会出现在不同的服务器上。如果为每个客户端维护的状态都在 redis 上并且需要从多个进程中访问,那么它就会成为锁定的噩梦,对性能有很大影响。
      猜你喜欢
      • 2019-09-27
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 2018-05-22
      • 2013-11-05
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多