Firebase 函数 - 抛出错误会导致冷启动吗?
Firebase Functions - Does throwing errors produce cold starts?
我读到 here 未处理的错误可能会导致冷启动。我正在实现一个触发函数,如下:
exports.detectPostLanguage = functions
.region("us-central1")
.runWith({ memory: "2GB", timeoutSeconds: "540" })
.firestore.document("posts/{userId}/userPosts/{postId}")
.onCreate(async (snap, context) => {
// ...
const language = await google.detectLanguage(post.text);
// ... more stuff if no error with the async operation
});
我是否需要捕获 google.detectLanguage() 方法错误以避免冷启动?
如果是,我应该怎么做(A 或 B)?
甲:
const language = await google.detectLanguage(post.text)
.catch(err => {
functions.logger.error(err);
throw err; // <---- Will still cause the cold start?
});
乙:
try {
var language = await google.detectLanguage(post.text)
} catch(err) {
functions.logger.error(err);
return null; // <----
}
更新
基于 Frank 的解决方案:
exports.detectPostLanguage = functions
.region("us-central1")
.runWith({ memory: "2GB", timeoutSeconds: "540" })
.firestore.document("posts/{userId}/userPosts/{postId}")
.onCreate(async (snap, context) => {
try {
// ...
const language = await google.detectLanguage(post.text);
// ... more stuff if no error with the async operation
} catch(err) {
return Promise.reject(err);
}
return null; // or return Promise.resolve();
});
如果任何异常从 Cloud Function 主体中逃逸,运行时会假定容器处于不稳定状态并且不会再安排它处理事件。
为防止这种情况发生,请确保您的代码中没有任何异常逃逸。您可以 return 没有值,也可以是指示代码中任何异步调用何时完成的承诺。
我读到 here 未处理的错误可能会导致冷启动。我正在实现一个触发函数,如下:
exports.detectPostLanguage = functions
.region("us-central1")
.runWith({ memory: "2GB", timeoutSeconds: "540" })
.firestore.document("posts/{userId}/userPosts/{postId}")
.onCreate(async (snap, context) => {
// ...
const language = await google.detectLanguage(post.text);
// ... more stuff if no error with the async operation
});
我是否需要捕获 google.detectLanguage() 方法错误以避免冷启动?
如果是,我应该怎么做(A 或 B)?
甲:
const language = await google.detectLanguage(post.text)
.catch(err => {
functions.logger.error(err);
throw err; // <---- Will still cause the cold start?
});
乙:
try {
var language = await google.detectLanguage(post.text)
} catch(err) {
functions.logger.error(err);
return null; // <----
}
更新
基于 Frank 的解决方案:
exports.detectPostLanguage = functions
.region("us-central1")
.runWith({ memory: "2GB", timeoutSeconds: "540" })
.firestore.document("posts/{userId}/userPosts/{postId}")
.onCreate(async (snap, context) => {
try {
// ...
const language = await google.detectLanguage(post.text);
// ... more stuff if no error with the async operation
} catch(err) {
return Promise.reject(err);
}
return null; // or return Promise.resolve();
});
如果任何异常从 Cloud Function 主体中逃逸,运行时会假定容器处于不稳定状态并且不会再安排它处理事件。
为防止这种情况发生,请确保您的代码中没有任何异常逃逸。您可以 return 没有值,也可以是指示代码中任何异步调用何时完成的承诺。