@Idobrodushniy

Django + UWSGI + Redis pub-sub — как правильно запустить это дело?

Всем привет!)
В нашем джанго приложении мы используем Redis pubsub, для того, чтобы наши два независимих приложения джанги могли общаться между собой. Для работы pubsub нам нужно запустить сабскрайбера в том приложении, которое будет слушать каналы. Для этого мы запускаем в wsgi.py наш демон поток редиса.

from django.conf import settings
from django.core.wsgi import get_wsgi_application

application = get_wsgi_application()

if settings.START_DELETE_SUBSCRIBER:
    from app1.handlers import App1Subscriber

    App1Subscriber().start()


Стартуем приложение мы таким образом : uwsgi --ini app1_uwsgi_config.ini
Содержание uwsgi файла:
[uwsgi]
http = 0.0.0.0:8000
chdir = /opt/app1
module = django_project.wsgi:application
master = True
cheaper = 2
processes = 16
harakiri = 70
max-requests = 5000
vacuum = True
reaper = True
enable-threads = True
single-interpreter = True


Вся проблема состоит в том, что порой uwsgi сервер после запуска просто не отдает никакого респонса, а порой всё ок. Он не выбрасывает никакие ворнинги или ошибки в консоль, просто запустился, но с 8000 порта хоста просто не приходит никакой респонс.
Вот реализация самого сабскрайбера:
class App1Subscriber(BasePubSub, metaclass=abc.ABCMeta):
    redis = StrictRedis(settings.REDIS_HOST, settings.REDIS_PORT)
    thread = None
    pubsub = None
    handler = None
    channel = None

    def __init__(self):
        self.pubsub = self.redis.pubsub()
        self.channel = **some_channel**
        self.handler = **some_handler**

    def start(self, daemon=True):
        if self.thread:
            raise RuntimeError('Subscriber is already running')

        sub = getattr(self.pubsub, 'subscribe')
        sub(**{self.channel: self.handler})
        self.thread = self.pubsub.run_in_thread(daemon=daemon)

    def stop(self):
        if not self.thread:
            raise RuntimeError('Subscriber is not running')
        self.thread.stop()

    @property
    def running(self):
        return self.thread.is_alive()

В чем может быть причинак такого поведения ?
P.S. Написал вопрос чтобы не выслушать о том, что не нужно использовать пабсаб, а потому что хочу понять в чем проблема при вот такой вот реализации и что я не знаю о поведении UWSGI.
  • Вопрос задан
  • 682 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы