Как обновить приложение Python в производстве - PullRequest
0 голосов
/ 02 июля 2018

Я написал приложение Python, которое работает на сервере Linux в качестве демона. Что он делает, так это слушает тему Rabbitmq. Всякий раз, когда появляется новое сообщение, приложение обрабатывает сообщение, выполняя следующие 5 шагов.

  1. Запрос к базе данных и получение аудиоданных в формате String.
  2. Преобразование аудиоданных в формат WAV.
  3. Вызывает модель глубокого обучения для прогнозирования звука
  4. Загрузить WAV в S3 bucket
  5. Отправить результат обратно в веб-API.

Основная программа работает с многопоточностью:

for i in range(2):
    t = threading.Thread(target=process_msg, name='worker-%s' % i)
    t.setDaemon(True)
    t.start()
while True:
    time.sleep(5)

Функция обратного вызова process_msg - это метод, который выполняет 5 шагов.

В настоящее время так я внедряю изменения на сервере разработчиков.

  1. Убить активный процесс приложения
  2. Do git pull для получения обновлений
  3. Запустите приложение снова.

Этот ручной процесс подходит для dev, но он не годится для производства. Потому что, если я остановлю приложение, пока оно находится в процессе обработки сообщения, оно завершит работу, не завершив работу. Каков наилучший способ CICD это приложение, не прерывая процесс?

1 Ответ

0 голосов
/ 02 июля 2018

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

CI / CD

  1. не используйте git в качестве инфраструктуры доставки кода. запустить частное хранилище пипов и каждый раз создавать версионные пип пакеты Вы хотите выпустить новый код - вы также получите контроль над тем, какие функции выпускаются ..

  2. Используйте Jenkins для автоматизации процесса

  3. Когда вы устанавливаете новый код, все, что вам нужно сделать, это установить pip -U my_app = 1.2.3 на сервере, а затем просто перезапустите приложение.

Чтобы не прерывать процесс, также есть несколько опций ..

вот один:

запустить ваш код как службу (systemd, systemv, upstart).
после того, как вы установите свой код (с надеждой на pip), вы можете использовать следующую команду service my_app restart

в вашем приложении добавьте код для прослушивания SIGTERM например:

import signal

def handler_stop_signals(*args, **kwargs):
    """ Handle system signals
    only SIGTERM expected to trigger this"""

    logger.info('Shutting down gracefully ')
    # wait for all tasks to finish before exiting 


signal.signal(signal.SIGTERM, handler_stop_signals)

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

tldr

Используйте Jenkins для выпуска пакетов pip вашего кода.
Используйте Jenkins для развертывания ваших пип-пакетов на целевом сервере.
Настройте свой код для прослушивания системных сигналов и действуйте соответственно

пс:
Более продвинутым решением (решение только для Linux) является упаковка вашего кода в пакеты Debian и их доставка.
Вы можете использовать такие инструменты, как debpackager , чтобы достичь этого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...