Мой горячий (развернутый) сервер: нужны ваши входные данные для проектирования (домашняя работа) - PullRequest
0 голосов
/ 29 сентября 2011
from  multiprocessing import Process    
a=Process(target=worker, args=())
a.start()

Я делаю приложение с несколькими рабочими процессами (пока не смейтесь), в котором каждый работник может грациозно перезагрузиться.Всякий раз, когда код обновляется, новые запросы обслуживаются новыми рабочими процессами с новым кодом.Это так, что

  1. Недавно запущенный поток содержит обновленный код
  2. , гарантирующий, что никакие запросы не отброшены

Я уже сделал работника, который слушает:

  1. обслуживает запросы, когда получает сигнал запроса
  2. убивает себя, когда сигнал next является управляющим сигналом

Я сделал этов Zeromq.Клиенты подключаются к этому серверу, используя zeromq.Клиенты не не взаимодействуют по HTTP.


Какой хороший способ перезагрузить код?Можете ли вы объяснить схему, которая является простой и достаточно глупой, чтобы быть надежной?


Что я имею в виду / могу сделать

Запустить поток внутри основного процесса, который повторяется:

  1. Сигнализировать о смерти всех рабочих процессов
  2. Запускать новые рабочие процессы

Но этот подход пропадет (я настроил его таким образом)запросы между смертью последнего старого работника и порождением первого нового работника.


И нет, я не студент колледжа.«Домашнее задание» означает любопытство.

Ответы [ 2 ]

2 голосов
/ 29 сентября 2011

Перезагрузка кода в python - это общеизвестно трудная проблема .

Вот как я бы с ней справился:

  • при запуске сервера, слушайте ваш HTTPпорт (но не начинайте принимать соединения)
  • Использовать многопроцессорность или что-то подобное для создания некоторых рабочих процессов;это должно произойти после , когда сокет начинает слушать, так что подпроцессы наследуют сокет.
  • каждый работник может затем accept подключения и запросы на обслуживание.
  • когда родительский процессузнает, что он должен перезагрузиться, он отключает сокет прослушивания.
  • когда работник пытается принять закрытый сокет, он получает исключение socket.error и должен прекратить
  • родительский процесс можетзапустите новый основной процесс (как в subprocess.Popen(sys.argv)), новый процесс может немедленно начать принимать подключения.
  • старый процесс теперь может ожидать завершения работы дочерних процессов;дети не могут принимать новые соединения (так как прослушивающая розетка отключена).Как только все дочерние процессы закончили обработку запросов в полете и закрылись, родительский процесс также может завершиться.
1 голос
/ 11 ноября 2011

Способ, которым я сделал это в python, довольно прост, но зависит от посредника или брокера сообщений.По сути, я получаю сообщение, обрабатываю его и подтверждаю.Если сообщение не получено, то по истечении времени ожидания его запрашивает брокер.

Имея это, вы просто убиваете и перезапускаете процесс.В моем случае процесс перехватывает SIGINT и делает упорядоченное завершение работы.Как бы то ни было, руководитель замечает, что работник умер, и запускает новый, который продолжает обрабатывать сообщения из очереди.

Меня вдохновила модель дерева наблюдения Эрланга, где все рассчитано на то, чтобы пережить смертьпроцесс.Я даже заставил моих работников периодически отправлять контрольное сообщение супервизору (PUB ZeroMQ для SUB супервизора), чтобы супервизор мог убить и перезапустить процесс, если он по какой-либо причине зависает.

...