我们正在使用azure-spring-data-cosmos库连接cosmos数据库。我们能够在20毫秒内收到响应,但对于5%的请求(1TPS负载),它需要超过5秒。请求卡在Unsafe.park.
container.queryItems(querySpec, options, Store.class)
.stream()
.collect(Collectors.toList());
我们观察到.collect(collections . tolist ());
DirectConnectionConfig directConnectionConfig = DirectConnectionConfig.getDefaultConfig();
cosmosClient = new CosmosClientBuilder()
.endpoint(uri)
.key(key)
.contentResponseOnWriteEnabled(true)
.directMode(directConnectionConfig)
.multipleWriteRegionsEnabled(true)
.consistencyLevel(ConsistencyLevel.valueOf(consistencyLevel.trim().toUpperCase()))
.preferredRegions(Arrays.asList(preferredRegion.split("\s*,\s*")))
.buildClient();
为什么请求进入等待状态?如何改进?
我们尝试设置maxRequestsPerConnection= 8或16。idleEndpointTimeout = 24hrs。没有运气。
如果您还没有启用,我建议在您的Configuration.java(或同等的)中启用查询度量和响应诊断。响应诊断将有助于调试客户端资源问题,查询指标将有助于排除高RU费用,因为这是导致响应时间变慢的原因。在此基础上,您可能需要研究其他领域,如数据模型、分区键等。
@Bean
public CosmosConfig cosmosConfig() {
return CosmosConfig.builder()
.responseDiagnosticsProcessor(new ResponseDiagnosticsProcessorImplementation())
.enableQueryMetrics(properties.isQueryMetricsEnabled())
.build();
}
private static class ResponseDiagnosticsProcessorImplementation implements ResponseDiagnosticsProcessor {
@Override
public void processResponseDiagnostics(@Nullable ResponseDiagnostics responseDiagnostics) {
logger.info("Response Diagnostics {}", responseDiagnostics);
}
}
参见此处的快速入门示例。