Kinesis Lambda消费者最小批量大小

时间:2017-09-01 23:00:50

标签: node.js amazon-web-services aws-lambda batch-processing amazon-kinesis

我使用AWS Lambda(node.js)作为AWS Kinesis Consumer。我可以看到您可以设置最大批量大小,但我想知道是否可以设置最小批量大小。这样我就可以确保每个lambda将处理至少50个(或任何数量)的记录。

我希望拥有最小批量大小,因为lambda使用者将建立与RDS MySQL实例的连接,并且我试图保持较低的并发连接数。

如果没有设置最低限度的配置功能,我们将不胜感激任何解决方法。

感谢。

2 个答案:

答案 0 :(得分:1)

一种方法是使用Kinesis Firehose,它根据您的传输流的缓冲配置连接多个传入记录。

  1. Send data to Firehose - 使用他们的API直接将记录放入Firehose Stream,或将Firehose附加到您现有的kinesis流中。
  2. Set S3 as your Firehose's destination - 这实际上会聚合您的个人记录,并将它们作为单个对象放入S3中​​。您可以指定分隔符,甚至可以在单个记录上转换lambda函数。
  3. Listen for S3:PutObject - 附上你的lambda以收听从Firehose流接收这些聚合记录的S3存储桶。

答案 1 :(得分:0)

我的第一个问题是你在流中打开了多少个分片?每个分片只能同时执行1个lambda实例。因此,如果你只有一个碎片,那么你一次只能有1个lambda来击中你的RDS实例。

  

你有数据表明它有问题吗?

以下是 hack ,可能会或可能无法正常运行。并且应该不应该在prod环境中使用。

对于最小批量大小,如果批量大小小于所需的记录数,则可以从node.js lambda函数返回error

E.g。

handler(event, context, callback) {
  const records = event.Records;
  if (records.length() < minBatchSize) {
    callback('insufficient batch size');
  } else {
    processRecords(records, callback);
  }
}

但是 会浮现两个问题:

1)您无法无限期地执行此操作,而不会冒丢失数据的风险,因为您的流上配置了最大事件时间限制。在此之后,记录从流中消失。请注意,您需要为此功能支付额外费用(请参阅extended data retention)。

您可以从lambda / kinesis分片迭代器年龄指标中看出批量年龄,请参阅http://docs.aws.amazon.com/streams/latest/dev/monitoring-with-cloudwatch.html

我不确定这是多么可靠,特别是如果你有超过1个碎片,但是例如。

handler(event, context, callback) {
  const records = event.Records;
  if (records.length() < minBatchSize) {
    if (calculateLambdaAge() > tooLongDelayThreshold) {
      processRecords(records, callback);
    } else {
      callback(new Error('insufficient batch size'));
    }
  } else {
    processRecords(records, callback);
  }
}

calculateLambdaAge() {
  // interrogate cloudwatch
}

如果cloudwatch没有告诉你,你可能需要自己跟踪它,它至少与你的RDS(redis / dynamo)一样可扩展。

2)而不是努力使#1可靠,那么额外的努力是否可以扩展你的RDS实例,使你当前的使用效率更高?

在汇总代码示例时,我已提及thisthis