在启用重试功能的情况下构建云功能时,如何实现增量退避?

时间:2019-03-27 14:13:39

标签: node.js google-cloud-functions gcloud

我正在尝试构建将数据加载到API的Google云功能。他们的指南显示了有关如何避免无限重试(https://cloud.google.com/functions/docs/bestpractices/retries#functions-tips-retry-node6)的示例,但是我找不到指导说明如何实现增量退避的指南。

如果API掉线,则GCP函数似乎会尽快重试。理想的选择是随着重试次数的增加而增加延迟。

有人有代码示例(节点)来实现吗?如果没有编写代码,则说明或制定攻击计划也将有所帮助。

对文档进行了无济于事的搜索。

3 个答案:

答案 0 :(得分:1)

https://cloud.google.com/functions/docs/bestpractices/retries#set_an_end_condition_to_avoid_infinite_retry_loops

 /**
 * Background Cloud Function that only executes within
 * a certain time period after the triggering event
 *
 * @param {object} event The Cloud Functions event.
 * @param {function} callback The callback function.
 */
exports.avoidInfiniteRetries = (event, callback) => {
  const eventAge = Date.now() - Date.parse(event.timestamp);
  const eventMaxAge = 10000;

  // Ignore events that are too old
  if (eventAge > eventMaxAge) {
    console.log(`Dropping event ${event} with age ${eventAge} ms.`);
    callback();
    return;
  }

  // Do what the function is supposed to do
  console.log(`Processing event ${event} with age ${eventAge} ms.`);
  callback();
};

似乎总是会强制重试该函数。但是,您可以确保在退避间隔中调用该函数的实际重要部分。

只需执行以下操作:

if(eventAge < 1000 && eventAge > 0)
{
   //Do stuff
}else if (eventAge < 3000 && eventAge > 1000) {
   // Do stuff
}(...)
else{
 return;
}

这样,您的实际代码将仅在通过逻辑设置的间隔内执行。

答案 1 :(得分:0)

除了您查看的官方文档之外。即使为Cloud IoT Core指定了文档,您也可以尝试查看本文档[1]。您会发现取决于运行时环境的不同示例。这可能有助于说明如何实现指数补偿。

[1] https://cloud.google.com/iot/docs/how-tos/exponential-backoff

答案 2 :(得分:0)

检查文档中的GCS,有一个关于截断指数补偿的很好的解释。

但是,更有趣的是,它指出:

  

Node.js的Google Cloud Client库可以自动使用   后退策略,以使用autoRetry参数重试请求。

因此,在任何随机的@google-cloud库中进行挖掘并寻找该选项,我们将直接转到this piece of code处理退休事宜。

由于该代码位于Apache License 2.0下,因此我假设您只要遵守许可限制,就可以复制该代码段。