Amazon web services 是否有提供<;=20毫秒的查询延迟?

Amazon web services 是否有提供<;=20毫秒的查询延迟?,amazon-web-services,amazon-dynamodb,latency,dynamodb-queries,low-latency,Amazon Web Services,Amazon Dynamodb,Latency,Dynamodb Queries,Low Latency,对于一个用例,我的团队使用DynamoDB查询一个GSI随着返回的行数增加,查询延迟增加。 我们的代码看起来像这样(Java)(非常正常) Map keyConditions=newhashmap(); put(indexHashKeyName,新条件() .WithAttributeValue列表(Collections.singletonList(新的AttributeValue(identifier.toString())) .使用ComparisonOperator(Comparison

对于一个用例,我的团队使用DynamoDB查询一个GSI随着返回的行数增加,查询延迟增加。

我们的代码看起来像这样(Java)(非常正常)

Map keyConditions=newhashmap();
put(indexHashKeyName,新条件()
.WithAttributeValue列表(Collections.singletonList(新的AttributeValue(identifier.toString()))
.使用ComparisonOperator(ComparisonOperator.EQ));
QueryRequest QueryRequest=新的QueryRequest();
queryRequest.setTableName(tableName);
queryRequest.setIndexName(indexName);
queryRequest.setKeyConditions(keyConditions);
queryRequest.withAttributesToGet(attributesRequired);
QueryResult结果=dynamoDB.query(queryRequest);
我们的DynamoDB表大约有4-5个String类型的属性。我们使用AWS KMS进行静态加密,所有4-5个属性都存在于GSI中

我们看到GSI上的p99延迟通常为30-40ms(毫秒),用于检索约30行数据

有没有一种好方法可以减少这种延迟(除了缓存)?对于我们的服务接收的客户端流量模式,缓存不是一个可行的解决方案

我们正在研究几个选项:-

  • 创建一个DynamoDB新表,该表在GSI散列键上建立索引,所有数据存储为JSON blob(或压缩blob)。这将减少延迟,因为查询现在将成为GET。但一旦项目超过400KB属性大小限制,这将变得很困难

  • 创建一个新的DynamoDB表,该表在GSI has键上建立索引,其范围键为1,2,3。。。每次数据块超过400KB时,创建一个新的范围项,并执行多次获取以检索多行JSON块。一旦开始为给定的哈希键创建过多的范围键,这将增加延迟

  • 使用ElasticSearch执行上述操作(推测ElasticSearch对文档大小的限制较小),但我们不确定延迟是否与DynamoDB查询延迟相似或更差

  • AWS是否提供了任何其他数据库解决方案来帮助我们的用例

    注意:-我们的EC2主机与DynamoDB表位于同一区域。30-40ms的延迟纯粹用于dynamoDB查询

  • 我想你说的是查询时间,而不是延迟。如果需要改善延迟,可以使用VPC端点。实际上,默认情况下,DDB在公共互联网上工作
  • 如果您想提高查询时间,可能需要更改RCU容量。或者转向按需定价

  • 我指的是查询时间,不是延迟。。我们的EC2主机和DynamoDB表都位于同一AWS区域。RCU消耗是可以的。如果你不使用VPC端点,你到DDB的流量会通过公共互联网,而不是AWS网络,这可能会对最近的网络产生巨大的影响!那我得检查一下
            Map<String, Condition> keyConditions = new HashMap<>();
            keyConditions.put(indexHashKeyName, new Condition()
                    .withAttributeValueList(Collections.singletonList(new AttributeValue(identifier.toString())))
                    .withComparisonOperator(ComparisonOperator.EQ));
            QueryRequest queryRequest = new QueryRequest();
            queryRequest.setTableName(tableName);
            queryRequest.setIndexName(indexName);
            queryRequest.setKeyConditions(keyConditions);
            queryRequest.withAttributesToGet(attributesRequired);
            QueryResult result = dynamoDB.query(queryRequest);