以编程方式在Firebase云功能中激活重试

时间:2019-04-10 07:17:46

标签: firebase google-cloud-firestore google-cloud-functions

我正在部署Firebase云功能,以通过连续部署来监听Firestore中的更改。

我只能找到一种激活重试manually的方法。这与我们的CD方法背道而驰。

看普通的gcp cloud functions,可以在部署时给出重试标志。但是我在firebase-cli或firebase-functions界面(2.1.0)中找不到类似的选项

关于如何解决此问题的任何提示? 卡斯滕

2 个答案:

答案 0 :(得分:2)

当前没有使用Firebase CLI进行部署的类似选项。

这是Firebase团队正在处理的事情,请随时关注更新。

答案 1 :(得分:2)

您可以手动使用GCloud Console在Firebase Functions中启用重试。在firebase-functions 3.10.0中添加了以编程方式重试基于触发器的功能(请参阅changelog和相关的pull request)。

由于从PR或文档中并不完全清楚,因此下面是该语法的快速示例:

export const myFirebaseFunc = functions
  .runWith({
    failurePolicy: {
      retry: {},
    },
    memory: '512MB',
    timeoutSeconds: 60,
  })
  .firestore.document('/path/to/some/doc')
  .onCreate(async (snap, context) => {
   /* do stuff */
 })

现在,看来故障策略只是打开还是关闭。因此,这是等效的

export const myFirebaseFunc = functions
  .runWith({
    failurePolicy: true,
    memory: '512MB',
    timeoutSeconds: 60,
  })
  .firestore.document('/path/to/some/doc')
  .onCreate(async (snap, context) => {
   /* do stuff */
 })

一些警告:

  • 您还必须使用--force

    进行部署
  • 您只能在触发的功能上启用重试,而不能在http调用的功能上启用重试。

  • 不建立某些保护措施将是愚蠢的。重试策略将在7天后用尽,并且会像其他任何函数调用一样收费,因此,如果您遇到一些未处理的错误,它可能会重复运行整整一周。您可以使用context.eventTimestamp来了解首次尝试的大致时间。

请阅读:https://firebase.google.com/docs/functions/retries,并确保您的函数是幂等的。

也很难发现要返回的内容以强制重试或避免重​​试。 已触发的Firebase函数必须返回Promise。(请参阅此vid

启用重试的Firebase功能将在以下情况下重试:

  • 它返回被拒绝的承诺
  • 引发异常
  • 或函数超时

这意味着,如果遇到错误,并且您知道最终不会通过重试来解决自身(即,您想停止执行函数而不是重试),则可以返回Promise.resolve({message: 'some message'});