我在Lambda中有一个putItem JAVA函数的代码。该功能正常工作,直到client.putItem(itemRequest);
行。该功能正在正确读取输入。在进行JUnit4测试(总时间<2秒)时,整个代码正常工作,我可以看到数据库中的条目。但是当在putItem行使用Lambda控制台进行测试时,这会失败(5secs后的Times Out)。
public class HelloDB implements RequestHandler<UserClass, String> {
AmazonDynamoDBClient client = null;
public HelloDB() throws IOException {
AWSCredentials credentials = new PropertiesCredentials(HelloDB.class
.getResourceAsStream("AwsCredentials.properties"));
client = new AmazonDynamoDBClient(credentials);
System.out.println("Creds created");
}
@Override
public String handleRequest(UserClass input, Context context) {
System.out.println("U: " + input.getUserName() + " p: " + input.getPasswordHash());
System.out.println("UI: " + input.userId + " O: " + input.getOpenIdToken());
String tableName = "User";
Map<String, AttributeValue> item = new HashMap<String, AttributeValue>();
item.put("userName", new AttributeValue().withS(input.getUserName()));
item.put("passwordHash", new AttributeValue().withS(input.getPasswordHash()));
item.put("userId", new AttributeValue().withN(input.getUserId().toString()));
item.put("openIdToken", new AttributeValue().withS(input.getOpenIdToken()));
PutItemRequest itemRequest = new PutItemRequest().withTableName(tableName).withItem(item);
System.out.println("item request");
client.putItem(itemRequest);
System.out.println("client put item request");
item.clear();
return "Success";
}
以下是错误消息:
"errorMessage": .... Task timed out after 5.00 seconds"
当时间增加到15秒而不是5秒时,我收到此错误:
"errorMessage": "Metaspace",
"errorType": "java.lang.OutOfMemoryError"
答案 0 :(得分:1)
如果某个功能没有收到任何请求,那么亚马逊会自动将其从Lambda服务器中删除,因此它不会使用任何资源。如果发生这种情况,那么下次请求进入时,必须先将该函数重新部署到Lambda服务器,然后才能处理该请求。这被称为“冷启动”
与使用python或nodejs编写的lambda函数相比,使用JAVA编写的lambda函数从冷启动开始运行需要更长时间和更多资源。因此,建议至少分配10秒的时间限制和512MB的内存来启动。随后的运行大约需要20-30毫秒。
这是一项关于用所有3种语言编写的函数的冷启动时间和随后运行时间的研究。
JUnit4测试运行速度比Lambda可能归因于冷启动。