Невозможно заставить нескольких работников UWSGI работать с колбой
В процессе разработки flask-socketio (4.1.0) с uwsgi прекрасно работает только с одним рабочим и стандартной инициализацией.
Сейчас я готовлюсь к производству и хочу заставить его работать с несколькими рабочими.
Я сделал следующее:
Добавлен redis message_queue в init_app:
socketio = SocketIO()
socketio.init_app(app,async_mode='gevent_uwsgi', message_queue=app.config['SOCKETIO_MESSAGE_QUEUE'])
(Sidenote: мы используем redis и в самом приложении)
Gevent Monkey исправления в верхней части файла, который мы запускаем с UWSGI
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 ошибочными ответами на запрос. Я подозреваю, что они соответствуют ошибкам "Invalid session....", которые появляются при включении ведения журнала SocketIO.
Первоначально он не использовал Redis вообще,
redis-cli > PUBSUB CHANNELS *
привело к пустому результату даже с рабочими =1.
казалось, что следующее (взято из другого SO-ответа) исправило это:
# https://stackru.com/a/19117266/492148
import gevent
import redis.connection
redis.connection.socket = gevent.socket
после этого у меня появился канал pubsub "flask-socketio" с обновлением данных.
но после возвращения к нескольким работникам проблема вернулась. Учитывая, что смена сокета redis, кажется, привела вещи в правильном направлении, я чувствую, что monkeypatching еще не работает должным образом, но код, который я использовал, кажется, соответствует всем примерам, которые я могу найти, и находится в самой верхней части файла, который загружается uwsgi.
2 ответа
Вы можете запустить столько рабочих, сколько захотите, но только если вы запускаете каждого работника как отдельный процесс uwsgi с одним работником. После того, как все эти рабочие запустят каждый на своем собственном порте, вы можете поместить nginx вперед для балансировки нагрузки с помощью липких сессий. И, конечно же, вам также нужна очередь сообщений, которую рабочие могут использовать при координации трансляций.
В конце концов найден https://github.com/miguelgrinberg/Flask-SocketIO/issues/535
так что кажется, что у вас не может быть нескольких рабочих с uwsgi, так как для этого нужны липкие сессии. Документация упоминает, что для gunicorn, но я не интерпретировал это, чтобы распространиться на uwsgi.