# #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. Пожалуйста, обратите внимание, что:
- Вам не нужно «выключать» контейнер при запуске в облаке. Он автоматически приостанавливается после завершения всех запросов, и с вас даже не взимается плата за время простоя, которое происходит вне запроса.
- Подобные операции
kick_off_terraform()
не могут выполняться в фоновом режиме (они должны быть завершены до того, как вы вернете ответ), потому что Cloud Run в настоящее время не выделяет процессор в фоновом режиме.
Вам нужно что-то вроде «запустить контейнеры для завершения», и вам, возможно, придется немного подождать, пока это будет поддерживаться Cloud Run.
Комментарии:
1. Привет, Ахмет, я ценю твой вклад. Я думаю, что пропустил объяснение моей проблемы в оригинальном посте. Идея завершения работы была «банальным» способом убедиться, что cloud run приостановит контейнер и не допустит, чтобы какие-либо другие запросы попадали в тот же запущенный контейнер. В моем случае использования функция kick_off_terraform() будет запущена и только после того, как все ресурсы будут созданы (или нет) Я возвращаю ответ обратно и обрабатываю его оттуда. Поэтому, прежде чем я установил параллелизм=1, в итоге произошло два запроса, попадающих в один и тот же контейнер, что вызывало конфликты в моем файле состояния terraform, который в моем случае используется локально
2. Сегодня трудно запустить что-то точно один раз в облачном режиме. Объединение —max-экземпляров=1 и —параллелизм=1 приблизит вас, но вы все равно можете запустить второй экземпляр в случае, если Cloud Run потребуется перенести данные между машинами или решит, что с вашим контейнером что-то не так.