Задачи Google Cloud запрашивают задачу через 5 минут, игнорируя большую настройку диспетчерской строки

#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.

введите описание изображения здесь