java - 如何提高 DynamoDB 请求的速度

标签 java amazon-web-services amazon-dynamodb

我一直在测试 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/

相关文章:

amazon-web-services - 如何在创建 postgres rds 时设置 log_line_prefix 的值

php - DynamoDB 本地基本 PHP 设置

java - 从文件读取数据到 JCombobox

python - 如何检查最后一次更新 S3 存储桶的时间?

amazon-web-services - DependsOn 上的 AWS 云形成条件

amazon-dynamodb - 如何使用DynamoDBMapper查询仅具有hashKey的具有GSI的Dynamo DB

java - Amazon DynamoDB 和类层次结构

java - @Bean @Configuration可以继承吗?

java - 过滤器中的自定义 propertyConverter 在 Neo4j OGM 中被覆盖

java - 放大 android - 保持图像可见