У меня есть две облачные функции, первая облачная функция запускается сообщением pubsub, а вторая облачная функция запускается HTTP, которые вставляют записи в хранилище данных. Хрон, который запускается каждую минуту, публикует сообщение в очереди pubsub, которое вызывает первую облачную функцию. Основная цель первой облачной функции - получить все записи из хранилища данных и обработать их. Проблема в том, что при операции чтения для извлечения записей из хранилища данных для выполнения запроса требуется слишком много времени (извлечение около 20 тыс. Записей). Иногда кажется, что облачная функция прервана между ними.
Из-за ограничения чтения / записи хранилища данных в секунду я использую осколки, но даже тогда возвращение значения из хранилища данных занимает вечность.
Вот метод, связанный с запросом на чтение -
async function fetchEntry(entityName, pageCursor) {
let query = datastore.createQuery([entityName]).limit(2000);
if (pageCursor) {
query = query.start(pageCursor);
}
//console.log("Result jsonStr - " + JSON.stringify(results));
const results = await datastore.runQuery(query);
const entries = results[0];
const info = results[1];
if (info.moreResults !== Datastore.NO_MORE_RESULTS) {
//console.log(`item in batch ${entityName} - ${entries.length}`);
// If there are more results to retrieve, the end cursor is
// automatically set on `info`. To get this value directly, access
// the `endCursor` property.
const results = await fetchEntry(hostName, entityName, info.endCursor);
// Concatenate entities
results[0] = entries.concat(results[0]);
console.log(`${entityName} BATCH READ ${results[0].length}`);
return results;
}
console.log(`${entityName} BATCH READ F - ${entries.length}`);
return [entries, info];
}
Я читал разные блоги и пробовал разные способы преодолеть одно и то же, вот мое наблюдение -
- Изначально я не использовал разбиение на страницы, так как не нашел никаких ограничений на максимальное количество объектов, которые можно извлечь в одной операции чтения, но для проверки я добавил разбиение на страницы, но все равно это занимает то же время.
- Если выполняется одна облачная функция и другое сообщение публикуется в очередь, существующая обработка прерывается, и новая обработка принимает ее на себя. (Проверено через ведение журнала стекового драйвера). Я остановил cron, чтобы не вызывать новую облачную функцию, обработка записей 4k заняла около 5 минут.