Google Cloud Async Processing возвращает 200
Я использую облачную функцию Google в качестве веб-крючка для получения полезной нагрузки от стороннего сервиса. Как правило, когда такие сервисы отправляют запросы веб-пользователям, они ожидают HTTP 200 в качестве подтверждения. Однако с настройкой облачной функции, как показано ниже (и в соответствии с рекомендациями Google), запрашивающая служба возвращается 408, когда происходит текущая обработка.
В этой ситуации сторонний сервис (в данном случае это облачная почта, но то же самое относится и к любому веб-крюку, с которым я пытался интегрироваться) будет повторять запрос, даже если он был успешно обработан.
Мой вопрос: как я могу заставить облачную функцию возвращать 200 и при этом продолжать асинхронную обработку?
//This will return a 408 even though the request is processed successfully
exports.emailIngest = functions.https.onRequest((request, response) =>
{
//return the promise from the firestore admin SDK as per google docs
return admin.auth().getUserByEmail(request.body.envelope.from).then((user) => {
console.log('Successfully fetched user data:', user.toJSON());
}).catch(function (error) {
console.log('Error fetching user data:', error);
});
});
1 ответ
Поскольку HTTP-триггеры эффективно завершаются и очищаются после отправки ответа, вы не сможете продолжить асинхронную работу в функции после отправки ответа. То, что вам нужно сделать, это заставить делегат функции HTTP работать с какой-то другой фоновой функцией, которая продолжается вне области HTTP-запроса.
Один из способов сделать это - использовать триггер pubsub. Триггер HTTP может транслировать сообщение pubsub, которое затем вызывает выполнение триггера pubsub. Pubsub требует, чтобы биллинг был включен для проекта.
Другим способом является запись в какое-либо место в базе данных реального времени или в Firestore, и в ответ на эту запись есть другой триггер функции. Другая функция, вероятно, захочет удалить записанные данные до их завершения.