putItem(itemRequest)在JUnit测试期间工作,但在AWS Lambda控制台上测试期间不工作

时间:2016-05-03 11:11:15

标签: java amazon-web-services aws-lambda

我在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"

1 个答案:

答案 0 :(得分:1)

如果某个功能没有收到任何请求,那么亚马逊会自动将其从Lambda服务器中删除,因此它不会使用任何资源。如果发生这种情况,那么下次请求进入时,必须先将该函数重新部署到Lambda服务器,然后才能处理该请求。这被称为“冷启动”

与使用python或nodejs编写的lambda函数相比,使用JAVA编写的lambda函数从冷启动开始运行需要更长时间和更多资源。因此,建议至少分配10秒的时间限制和512MB的内存来启动。随后的运行大约需要20-30毫秒。

这是一项关于用所有3种语言编写的函数的冷启动时间和随后运行时间的研究。

JUnit4测试运行速度比Lambda可能归因于冷启动。