1

我在这里读到未处理的错误可能会导致冷启动。我正在实现一个触发功能,如下:

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)?

A:

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; // <----
}

更新

基于弗兰克解决方案:

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();
  });
4

1 回答 1

2

如果任何异常从 Cloud Function 主体中逃脱,则运行时假定容器处于不稳定状态,并且不会再安排它来处理事件。

为防止这种情况发生,请确保您的代码中没有异常逃逸。您可以不返回任何值,也可以返回一个表示代码中的任何异步调用何时完成的承诺。

于 2021-12-20T17:25:21.587 回答