我使用AWS Lambda(node.js)作为AWS Kinesis Consumer。我可以看到您可以设置最大批量大小,但我想知道是否可以设置最小批量大小。这样我就可以确保每个lambda将处理至少50个(或任何数量)的记录。
我希望拥有最小批量大小,因为lambda使用者将建立与RDS MySQL实例的连接,并且我试图保持较低的并发连接数。
如果没有设置最低限度的配置功能,我们将不胜感激任何解决方法。
感谢。
答案 0 :(得分:1)
一种方法是使用Kinesis Firehose,它根据您的传输流的缓冲配置连接多个传入记录。
答案 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实例,使你当前的使用效率更高?