And*_*ose 6 java performance amazon-dynamodb aws-lambda
这是Java lambda,使用AWS提供的SDK需要4秒钟来执行2个DynamoDB操作。我听说这些通常会在20毫秒内完成,但对我来说要高出3个数量级。这些较长的操作是(a)创建DynamoDB对象,以及(b)在完全空的表上执行表扫描(下面的代码)。
我应该如何减少延迟?
创建DynamoDB对象
log("Creating AmazonDynamoDB");
AmazonDynamoDB db = AmazonDynamoDBClientBuilder
.standard()
.withRegion(Regions.EU_WEST_1)
.build();
log("Creating DynamoDBMapper");
DynamoDBMapper mapper = new DynamoDBMapper(db);
Run Code Online (Sandbox Code Playgroud)
执行扫描
log("Scanning table");
List<MyItem> items = dbMapper.scan(MyTable.class, new DynamoDBScanExpression());
for (MyItem item : items) {
// Irrelevant - there aren't any
}
log("Table scan complete");
Run Code Online (Sandbox Code Playgroud)
这是运行中的日志。
20:07:41 START RequestId: 9d436db7-5d32-11e8-8555-8564d2094ccc Version: $LATEST
20:07:41 Received request: APIGatewayRequest(path=/data/foo, httpMethod=POST, body=)
20:07:41 Creating AmazonDynamoDB
20:07:45 Creating DynamoDBMapper
20:07:45 Creating DataHandler
20:07:45 Handling request
20:07:45 Scanning table
20:07:49 Table scan complete
20:07:49 Request handled - response object: []
20:07:49 APIGatewayResponse(isBase64Encoded=false, statusCode=200, body=[], headers={})
20:07:49 END RequestId: 9d436db7-5d32-11e8-8555-8564d2094ccc
20:07:49 REPORT RequestId: 9d436db7-5d32-11e8-8555-8564d2094ccc Duration: 8256.47 ms Billed Duration: 8300 ms Memory Size: 512 MB Max Memory Used: 85 MB
Run Code Online (Sandbox Code Playgroud)
根据这个帖子从该AWS论坛的AWS员工,在施工AmazonDynamoDB对象是昂贵的。将构造(返回)移动到静态初始值设定项中并结合一点额外的内存(=CPU)分配基本上可以解决问题。
日志中的数据仍然显示,上面确定的 2 个缓慢步骤中的每一个都需要大约一半的时间。因此,推测AmazonDynamoDB对象的构建和首次使用都很慢。
显然,这对第一个请求没有帮助,它仍然需要与问题相同的时间。但是,一旦 lambda 被加热,后续请求需要大约 15毫秒(远低于 100 毫秒的最低计费阈值)。解决第一个请求问题很容易理解- 例如,通过使用 CloudWatch Events 来安排对 lambda 的定期调用以使其保持温暖。
2020年编辑:也可以使用Provisioned Currency来处理冷启动问题。