Нужно ли ожидать запуска процесса в облаке, чтобы избежать фоновых действий?

#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 функции «до тех пор, пока a Promise не будет установлено (то есть выполнено или отклонено), и возобновить выполнение 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-contract

3. Итак, @JohnHanley, если я правильно понимаю, нам нужно подождать, пока мы не отправим res.send(200). Итак, после выполнения каждого запроса / мутации / обещания и отправки ответа?

4. Как только ваш код вернет HTTP-ответ, предположим, что ваш контейнер будет остановлен / завершен.

Ответ №1:

При облачном запуске процессор активен только тогда, когда обрабатывается запрос. Это означает, что если у вас обрабатывается только один запрос в определенный момент времени, сразу после того, как вы отправили HTTP-ответ обратно клиенту, экземпляр облачного запуска останавливает любой процесс (на самом деле дросселирование близко к 0 выделенному процессору)

Поэтому, если вы создаете фоновый процесс и немедленно возвращаете ответ, у фонового процесса не будет процессора для выполнения своей работы.

Итак, выполните все, что вам нужно сделать, здесь отправьте сообщение в PubSub, (а) дождитесь правильной отправки, а затем ответьте отправителю запроса.