#node.js #google-cloud-platform #google-cloud-tasks
# #node.js #google-облачная платформа #google-cloud-задачи
Вопрос:
Инфраструктура: функция Firebase, которая ставит в очередь элементы задач Google Cloud, и локальное приложение NodeJS Express, которое выполняет какое-либо длительное задание. В целях отладки я использую ngrok для туннелирования задачи в мое локальное приложение
В документах GC Tasks указано, что время ожидания по умолчанию составляет 10 минут, которое может быть скорректировано на любой промежуток между 15 секундами и 30 минутами. Но с заданиями, которые длятся чуть дольше 5 минут, я получаю другой запрос, хотя предыдущий еще не завершен.
В моем приложении nodejs я использую @google-cloud/tasks
пакет для создания задач. Я пробовал настройки по умолчанию (нет dispatchDeadline
) и пользовательские (см. Код ниже)
export const createQueueClient = (ref: string) => {
const client = new google.CloudTasksClient();
return {
client,
parent: client.queuePath(project, region, ref),
};
};
export const postMessageToQueue = async <T>(
queue: QueueNamesType,
url: string,
message: T,
context: functions.https.CallableContext
) => {
const { client, parent } = createQueueClient(queue);
const [response] = await client.createTask({
task: {
dispatchDeadline: {
seconds: 15 * 60, // <------------------- attempt to set a timeout value
},
httpRequest: {
httpMethod: 'POST',
url: url,
body: Buffer.from(
JSON.stringify({
data: message,
})
).toString('base64'),
headers: {
// forward auth header to next service
Authorization: context.rawRequest.header('Authorization') || '',
'Content-Type': 'application/json',
},
},
},
parent: parent,
});
return response;
};
ngrok:
в журналах приложений nodejs вы можете четко видеть, что разница между запросом составляет 5 минут:
[[11:46:31.084]] [LOG] Received request
[[11:51:31.317]] [LOG] Received request
[[11:51:34.006]] [LOG] Finished request iCg7raEbrw6LlbBhjpBS
Я включил панель входа в систему, и я вижу продолжительность попытки 300 секунд и статус «НЕДОСТУПЕН»
Время на скриншотах / журналах может отличаться из-за повторной попытки собрать больше «доказательств»
Все задания, которые выполняются менее 5 минут, завершаются успешно и не запрашиваются. Я что-то упустил?
Комментарии:
1. Похоже, это хорошо документированная ошибка, поэтому я предлагаю отправить ее через средство отслеживания проблем: cloud.google.com/tasks/docs /…
2. Вы когда-нибудь находили решение для этого?
3. @vitooh где это задокументировано?
4. @matth я пришел не с решением, а с каким-то обходным путем. Я помещаю идентификатор в словарь и проверяю наличие дубликатов при поступлении нового запроса.
Ответ №1:
dispatchDeadline
Свойство сработало для меня. Время ожидания увеличено до 30 минут при следующей настройке
const {CloudTasksClient} = require('@google-cloud/tasks');
class MyService {
createMyTask(...): Promise<any> {
return new Promise((resolve, reject) => {
const client = new CloudTasksClient();
const payload = {...}
const parent = client.queuePath(GCP_PROJECT_ID, GCP_SERVICE_LOCATION, GCP_TASK_QUEUE_NAME);
const url = TASK_URL;
const task = {
httpRequest: {
httpMethod: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': authToken
},
url,
body: Buffer.from(JSON.stringify(payload)).toString('base64'),
},
dispatchDeadline: { seconds: 1800 },
};
const request = {parent, task};
client.createTask(request).then((result: Array<any>) => {
resolve(`task created: ${result[0].name}`);
}).catch((err: Error) => {
reject(`Create task Error: ${err}`);
});
});
}
Наряду с dispatchDeadline вам также необходимо установить параметры повтора для Google Cloud Task.