Заставить сервер zmq работать вечно в Django?

Я пытаюсь найти лучший способ, чтобы прослушиватель zeroMQ работал вечно в моем приложении django.

Я настраиваю серверное приложение zmq в своем проекте Django, которое действует как внутренний API для других приложений в нашей сети (нет необходимости проходить через http/requests, поскольку эти приложения являются внутренними). Я хочу, чтобы слушатель zmq внутри моего проекта django всегда был жив.

Мне нужен прослушиватель zmq в моем проекте Django, чтобы у меня был доступ ко всем моделям проектов (для запросов) и другим контекстным вещам django.

Я сейчас думаю:

  • Настройте команду управления Django, которая будет запускать прослушиватель и поддерживать его в рабочем состоянии навсегда (также известный как бесконечный цикл внутри кода прослушивателя zmq) или

  • использовать работника сельдерея, чтобы всегда поддерживать прослушиватель zmq? Но я не совсем уверен, как заставить работника сельдерея перезапустить задачу, только если она не запущена. Все документы сельдерея посвящены частоте/отложенному запуску. Или, может быть, я должен позволить сельдерею очистить задачу с заданным интервалом и все равно перезапустить ее.

Любые советы, рекомендации по влиянию на производительность или альтернативные подходы?


person user772401    schedule 03.10.2013    source источник
comment
Ваш первый выбор выглядит как путь для меня: наличие выделенного процесса для управления сокетом zeromq (в то время как процесс Django обрабатывает HTTP-запросы).   -  person sebastibe    schedule 03.10.2013


Ответы (1)


Настройка команды управления — прекрасный способ сделать это, особенно если вы работаете на собственном оборудовании.

Если вы работаете в облаке, где машина может исчезнуть вместе с вашим процессом, то последний вариант — лучший вариант. Вот как я это сделал:

  1. Настройте периодическую задачу, которая запускается каждые N секунд (вам нужно где-то запустить celerybeat)
  2. Когда задача запускается, она сначала проверяет общий сетевой ресурс (redis, zookeeper или db), чтобы увидеть, есть ли у другого процесса активный/действительный аренда. Если он существует, прервать.
  3. Если действующей аренды нет, получите ее (остерегайтесь параллелизма здесь!), и запустите бесконечный цикл, периодически продлевая аренду.
  4. Добавьте инструментарий, чтобы знать, кто и где выполняет процесс.
  5. Запустите сельдерейных рабочих на нескольких ящиках, потребляя из той же очереди, для которой предназначена ваша периодическая задача.

Второе решение более сложное, и его труднее реализовать правильно; поэтому, если вы можете, синглтон — это здорово, и рассмотрите возможность использования чего-то вроде супервизора, чтобы гарантировать перезапуск процесса, если он по какой-то причине дает сбой.

person Nino Walker    schedule 04.10.2013
comment
Я создал команду управления, я думаю, что это намного проще после изучения способов ее реализации с использованием сельдерея. Спасибо за объяснение облака, я просто могу использовать его когда-нибудь! - person user772401; 05.10.2013
comment
Нет необходимости в периодической задаче. Вместо этого настройте процесс демона. Это имеет много преимуществ, таких как использование pidfiles и мониторинг с помощью чего-то вроде Monit. - person Alex; 05.09.2016