Мы используем запланированную функцию в нашем проекте Firebase, как описано здесь для ежедневного резервного копирования всех наших коллекций:
schedule-backup.function.ts
import * as functions from 'firebase-functions';
import firestore from '@google-cloud/firestore';
const client = new firestore.v1.FirestoreAdminClient();
export function onScheduledBackupFunction() {
return functions
.runWith({
timeoutSeconds: 540,
})
.pubsub.schedule('30 1 * * *')
.onRun(() => {
return client
.exportDocuments(
{
name: client.databasePath(process.env.GCLOUD_PROJECT, '(default)'),
outputUriPrefix: `gs://BACKUPS`,
collectionIds: [], // "all collections"
});
});
}
Время от времени мы сталкиваемся со следующей ошибкой:
"Error: 4 DEADLINE_EXCEEDED: Deadline exceeded
at Object.callErrorFromStatus (/srv/node_modules/@grpc/grpc-js/build/src/call.js:30:26)
at Http2CallStream.call.on (/srv/node_modules/@grpc/grpc-js/build/src/client.js:96:33)
at emitOne (events.js:121:20)
at Http2CallStream.emit (events.js:211:7)
at process.nextTick (/srv/node_modules/@grpc/grpc-js/build/src/call-stream.js:97:22)
at _combinedTickCallback (internal/process/next_tick.js:132:7)
at process._tickDomainCallback (internal/process/next_tick.js:219:9)"
Глядя на справочник по API Do c, мы также пытались увеличить тайм-аут вызова exportDocuments:
client
.exportDocuments(
{
name: client.databasePath(process.env.GCLOUD_PROJECT, '(default)'),
outputUriPrefix: `gs://BACKUPS`,
collectionIds: [], // "all collections"
}),
{
timeout: 540000
} as CallOptions;
Но ошибка остается. Мы используем версию 3.4.0
из @google-cloud/firestore
. Итак, как мы можем безопасно экспортировать все документы ежедневно, не прибегая к этим тайм-аутам?