#javascript #node.js #google-cloud-platform #google-cloud-pubsub #google-cloud-run
# #javascript #node.js #google-облачная платформа #google-cloud-pubsub #google-cloud-run
Вопрос:
У нас запущен экземпляр Google Cloud Run, и мы получаем запросы Post на определенную конечную точку. Когда поступает запрос, мы публикуем его в Pubsub и запускаем асинхронную функцию javascript с некоторыми запросами и изменениями в базе данных Prisma.
В настоящее время мы этого не ожидаем, а просто отправляем ответ до того, как вызов этой функции будет готов.
Теперь мне интересно, является ли это хорошим поведением для облачного запуска Google.
Некоторый пример кода:
app.post("/endpoint/example", async (req, res) => {
try {
const data = req.query.data
this.pubSubService.publish(data);
return res.send(200)
} catch (error) {
return res.send(400)
}
});
В публикации pubSubService мы запускаем другую асинхронную функцию с изменениями / запросами БД.
Мой вопрос:
Нужно ли нам ожидать эту функцию публикации, да или нет? И почему?
Комментарии:
1. Вероятно, вам следует взглянуть на то, что на самом деле делает
await
ключевое слово — оно просто приостанавливает выполнениеasync
функции «до тех пор, пока aPromise
не будет установлено (то есть выполнено или отклонено), и возобновить выполнениеasync
функции после выполнения».2.Cloud Run — это система HTTP-запросов / ответов. Когда ваш код возвращает HTTP-ответ, ваш контейнер может быть завершен, процессор работает на холостом ходу и т. Д. Не создавайте фоновые потоки, которые продолжают выполнение после HTTP-ответа.
After startup, you should only expect to be able to do computation within the scope of a request: a container instance does not have any CPU allocated if it is not processing a request.
cloud.google.com/run/docs/reference/container-contract3. Итак, @JohnHanley, если я правильно понимаю, нам нужно подождать, пока мы не отправим res.send(200). Итак, после выполнения каждого запроса / мутации / обещания и отправки ответа?
4. Как только ваш код вернет HTTP-ответ, предположим, что ваш контейнер будет остановлен / завершен.
Ответ №1:
При облачном запуске процессор активен только тогда, когда обрабатывается запрос. Это означает, что если у вас обрабатывается только один запрос в определенный момент времени, сразу после того, как вы отправили HTTP-ответ обратно клиенту, экземпляр облачного запуска останавливает любой процесс (на самом деле дросселирование близко к 0 выделенному процессору)
Поэтому, если вы создаете фоновый процесс и немедленно возвращаете ответ, у фонового процесса не будет процессора для выполнения своей работы.
Итак, выполните все, что вам нужно сделать, здесь отправьте сообщение в PubSub, (а) дождитесь правильной отправки, а затем ответьте отправителю запроса.