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

Я работаю над процессом развертывания, включающим следующее:

  • Gitlab runner помещает приложение Magento 1.9 в корзину S3
  • Gitlab runner развертывает приложение с помощью CodeDeploy
  • CodeDeploy развертывает приложение на всех экземплярах, находящихся в группе автоматического масштабирования.

Проблема в том, что события CodeDeploy не обязательно происходят в одну и ту же секунду, и это может вызвать проблемы с тем, как мы перезагружаем кеш приложения.

Наше приложение должно очищать кеш только тогда, когда все активные экземпляры находятся в обслуживании, чтобы избежать получения новых HTTP-запросов (в противном случае оно может вызвать исключение «Фронтальный контроллер достиг 100 итераций соответствия маршрутизатора»).

Мы думали об использовании файлов блокировки в общей папке во всех экземплярах, но это звучит очень старомодно.

Любая идея о том, как обеспечить обслуживание всех экземпляров для очистки кеша, будет высоко оценена!


person cellover    schedule 18.09.2018    source источник


Ответы (1)


Я мало что знаю о Magento, но похоже, что есть несколько вещей, которые должны произойти:

<сильный>1. Перевод экземпляров в режим обслуживания

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

<сильный>2. Подождите, пока все экземпляры перейдут в режим обслуживания и очистят кеш

Предполагая, что вы перевели хосты в режим обслуживания в ApplicationStop, вы можете использовать другой перехватчик жизненного цикла для ожидания перехода всех экземпляров в режим обслуживания. Например, у вас может быть сценарий в BeforeInstall, который проверяет, все ли экземпляры прошли ApplicationStop, и запускает очистку, если они это сделали (т.е. это последний).

Вот некоторый псевдокод:

# BeforeInstall or something other hook script

# 1. Get the instance details from CodeDeploy
instances = listDeploymentInstances().map(instanceId -> getDeploymentInstance(instanceId))

# 2. Check if all of the instances have completed ApplicationStop
for instance in instances {
  applicationStopStatus = instance.instanceSummary.lifecycleEvents
    .findFirst(event -> event.lifecycleEventName == "ApplicationStop")
    .status

  # If it's succeeded, we're good to go
  if status == "Succeeded
    purgeCache()
  # If it's failed, you'll have to decide what should be done
  else if status == "Failed"
    # Abort the deployment or handle some other way
  # If it's not completed, ignore it and let another instance kick off the purge
  else
    return
}

<сильный>3. Дождитесь завершения очистки и выйдите из режима обслуживания

Используя другой хук жизненного цикла, возможно, ApplicationStart или ValidateService, дождитесь завершения очистки и выйдите из режима обслуживания. Пока очистка занимает менее 1 часа, ваши инстансы не должны истечь время ожидания перехватчиков жизненного цикла.

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

person EmptyArsenal    schedule 28.12.2018