我一直在测试 DynamoDB 作为可扩展和稳定吞吐量数据库的潜在选项,适用于将被频繁访问并需要非常快的响应时间(< 50 毫秒)的站点。我看到以下代码的响应非常慢(在本地和 EC2 实例上):
public static void main(String[] args) {
try {
AWSCredentials credentials = new PropertiesCredentials(new File("aws_credentials.properties"));
long start = System.currentTimeMillis();
AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials);
System.out.println((System.currentTimeMillis() - start) + " (ms) to connect");
DynamoDBMapper mapper = new DynamoDBMapper(client);
start = System.currentTimeMillis();
Model model = mapper.load(Model.class, "hashkey1", "rangekey1");
System.out.println((System.currentTimeMillis() - start) + " (ms) to load Model");
} catch (Exception e) {
e.printStackTrace();
}
}
仅与数据库的连接平均需要 800 (ms)
,使用 mapper
加载需要额外的 200 (ms)
。根据Amazon's page about DynamoDB我们应该期待“平均服务端延迟......通常是一位数毫秒。”我不希望完整的往返 HTTP 请求增加那么多开销。这些预期数字是否在 EC2 实例上也是如此?
最佳答案
我认为更好的测试是避免在启动 JVM 和加载类时产生的初始成本/延迟。像这样的东西:
public class TestDynamoDBMain {
public static void main(String[] args) {
try {
AWSCredentials credentials = new PropertiesCredentials(new File("aws_credentials.properties"));
AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials);
DynamoDBMapper mapper = new DynamoDBMapper(client);
// Warm up
for (int i=0; i < 10; i++) {
testrun(mapper, false);
}
// Time it
for (int i=0; i < 10; i++) {
testrun(mapper, true);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static void testrun(DynamoDBMapper mapper, boolean timed) {
long start = System.nanoTime();
Model model = mapper.load(Model.class, "hashkey1", "rangekey1");
if (timed)
System.out.println(
TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start)
+ " (ms) to load Model");
}
}
此外,您可以考虑启用 AWS SDK for Java 的默认指标,以查看 Amazon CloudWatch 中的细粒度时间分配。有关详细信息,请参阅:
http://java.awsblog.com/post/Tx1O0S3I51OTZWT/Taste-of-JMX-Using-the-AWS-SDK-for-Java
希望这对您有所帮助。
关于java - 如何提高 DynamoDB 请求的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21420766/