Выключение сервера Flask после ответа

# #python #google-cloud-platform #google-cloud-run

Вопрос:

Я много читал о различных способах выключения приложения Flask, но я не понимаю, как я мог бы реализовать что-то для своего случая использования.

Я написал и тестирую простое приложение Flask, которое принимает запрос на публикацию для создания некоторых ресурсов в облаке Google. Это приложение Flask развернуто в контейнере и работает в облачном режиме.

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

 app = Flask(__name__)

@app.route('/', methods=['POST'])
def main():
   #some validation on the request.json
   try:
      kick_off_terraform()
      return ("Success", 200)
   except Exception as e:
      print(e)

 

Комментарии:

1. Это, по-видимому, довольно экзотический вариант использования веб-приложения. Можете ли вы объяснить, зачем вам это нужно?

2. Привет, Клаус, я согласен с вами, но у меня есть особый случай использования, когда я должен обрабатывать один уникальный запрос на экземпляр (без одновременных запросов), и после проведения дополнительных исследований теперь похоже, что я нашел то, что мне нужно на стороне GCP, чтобы установить количество параллелизма на экземпляр. Я пойду дальше и отмечу этот пост как закрытый. Спасибо!

Ответ №1:

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

 gcloud run deploy $SERVICE_NAME 
          --image gcr.io/$GCP_PROJECT_ID/$SERVICE_NAME:$CI_COMMIT_SHORT_SHA
          --region=us-east1 
          --platform managed 
          --concurrency=1
 

Ответ №2:

К сожалению, хаки, подобные --concurrency=1 или --max-instances=1 не очень хороши, потому что выключение сервера после запроса может привести к сбою запроса. (Когда я делал это в прошлом, запросы не выполнялись.)

Основываясь на вашем вопросе, я предполагаю, что вы, возможно, не полностью поняли поведение среды выполнения Cloud Run. Пожалуйста, обратите внимание, что:

  1. Вам не нужно «выключать» контейнер при запуске в облаке. Он автоматически приостанавливается после завершения всех запросов, и с вас даже не взимается плата за время простоя, которое происходит вне запроса.
  2. Подобные операции kick_off_terraform() не могут выполняться в фоновом режиме (они должны быть завершены до того, как вы вернете ответ), потому что Cloud Run в настоящее время не выделяет процессор в фоновом режиме.

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

Комментарии:

1. Привет, Ахмет, я ценю твой вклад. Я думаю, что пропустил объяснение моей проблемы в оригинальном посте. Идея завершения работы была «банальным» способом убедиться, что cloud run приостановит контейнер и не допустит, чтобы какие-либо другие запросы попадали в тот же запущенный контейнер. В моем случае использования функция kick_off_terraform() будет запущена и только после того, как все ресурсы будут созданы (или нет) Я возвращаю ответ обратно и обрабатываю его оттуда. Поэтому, прежде чем я установил параллелизм=1, в итоге произошло два запроса, попадающих в один и тот же контейнер, что вызывало конфликты в моем файле состояния terraform, который в моем случае используется локально

2. Сегодня трудно запустить что-то точно один раз в облачном режиме. Объединение —max-экземпляров=1 и —параллелизм=1 приблизит вас, но вы все равно можете запустить второй экземпляр в случае, если Cloud Run потребуется перенести данные между машинами или решит, что с вашим контейнером что-то не так.