Да накарате zmq сървър да работи вечно в Django?

Опитвам се да разбера, че най-добрият начин да поддържам zeroMQ слушател да работи завинаги в моето django приложение.

Настройвам zmq сървърно приложение в моя проект Django, което действа като вътрешен API за други приложения в нашата мрежа (няма нужда да минавам през http/requests неща, тъй като тези приложения са вътрешни). Искам zmq слушателят в моя django проект винаги да е жив.

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

В момента си мисля:

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

  • използвате celery worker, за да поддържате винаги zmq слушателя жив? Но не съм съвсем сигурен как да накарам celery worker да рестартира задача само ако не се изпълнява. Всички документи за целина са за честота/забавено изпълнение. Или може би трябва да оставя celery да изчисти задачата @ даден интервал и въпреки това да я рестартира..

Някакви съвети, съвети относно последиците от производителността или алтернативни подходи?


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. Започнете работници с целина на множество кутии, като консумирате от една и съща опашка, за която е предназначена вашата периодична задача.

Второто решение е по-сложно и по-трудно за правилно; така че, ако можете, сингълтън е страхотен и обмислете използването на нещо като supervisord, за да сте сигурни, че процесът ще се рестартира, ако по някаква причина се повреди.

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