【问题标题】:How would I create a global Counter for AWS Lambda functions?如何为 AWS Lambda 函数创建全局计数器?
【发布时间】:2018-05-08 20:43:11
【问题描述】:

如果我想每 2 分钟启动一个 lambda 函数,它会调用一个带有索引号的 api。我将如何存储 lambda 的索引号以在初始化时读取并在每次 lambda 函数成功调用 api 时将其加一?

我认为只为计数器配备一个发电机表是大材小用。

【问题讨论】:

  • 如果您没有运行并发 Lambda:只需在 S3 中存储一个带有计数器索引号的简单 .txt 文件?
  • @MaiKaY 是的,可以。我希望有一些类似于 cloudwatch 存储变量的东西。理想情况下不会真正增加 lambda 运行时间的东西。
  • 您也可以使用 AWS Step Functions。第一种状态:等待 2 分钟,第二种状态:调用 API 并执行下一个 Step Functions。
  • @MaiKaY 我会让 step 函数运行 6 个月左右,然后用之前的计数器重新调用它?

标签: amazon-web-services aws-lambda serverless-framework


【解决方案1】:

我会争辩说,使用 dynamoDB 以外的其他东西会有点矫枉过正。

DynamoDB 正是为此目的而设计的。对于您的用例,它几乎是免费的。并且只会增加或多或少 10 毫秒的运行时间。与您的 Lambda 将获得的冷启动相比,这可以忽略不计。


如果您真的想同时削减 DynamoDB 成本和 Lambda 运行时,您可以将计数器缓存在 Lambda 容器内(在您的处理程序之外)。

假设没有并发调用(仅通过预定事件触发),我会为每个调用做这样的事情:

  1. 检查缓存的计数器值。
  2. 如果是counter == 0,则从 DynamoDB 读取值。如果是 counter > 0,则使用该值。
  3. 随心所欲。
  4. DynamoDB 中的增量计数器和缓存值。

【讨论】:

  • Lambda 函数必须是无状态的。缓存的计数器不是一个安全的选择。 lambda可以启动函数的多个实例(即使你不做并发调用)
  • @Hugodby 这样我就可以选择 DynamoDB 选项了。它只会有一行,但如果它是性能最高的,那么meh
【解决方案2】:

开箱即用,您可以将消息记录到 CloudWatch Logs。然后,您可以创建一个指标过滤器来获取实际值。

您甚至可以使用它触发 CloudWatch 事件。

【讨论】:

    【解决方案3】:

    如果 API 调用失败,则让您的 lambda 处理程序回调/抛出错误。 JS 示例:

    export.handler = function(event, context, callback) {
      apiCall().then(resp => callback(null, resp).catch(err => callback(err));
    }
    

    使用 CloudWatch,您可以获得有关 lambda 调用和错误的指标。通过使用数学表达式,您可以执行调用错误,这将为您提供成功调用的次数。您可以定义时间段和时间范围。

    如果您需要编程访问,请使用 AWS CLI 或 AWS 开发工具包。 AWS CLI get-metric-data

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 1970-01-01
      • 2019-04-16
      • 2016-03-25
      • 1970-01-01
      • 2018-01-13
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多