如何解决Cosmos Java SDK 抛出异常 x-ms-substatus=10002
我们将 Cosmos DB 与 Spring 数据结合使用
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-spring-data-cosmos</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-cosmos</artifactId>
<version>4.8.0</version>
</dependency>
对于某些请求,(间歇性地),我们会看到一些错误,例如 -
1.无法更新项目;嵌套异常是 CosmosException
2.找不到项目;嵌套异常为 CosmosException :应为其进行查询的项目可用。
3. DocumentProducer - 意外失败
{userAgent=azsdk-java-cosmos/4.8.0 Linux/5.3.0-1035-azure JRE/1.8.0_291,error=null,resourceAddress='null',requestUri='null',statusCode=0,message=null,{"userAgent":"azsdk-java-cosmos/4.8.0 Linux/5.3.0-1035-azure JRE/1.8.0_291","requestLatencyInMs":60073,"requestStartTimeUTC":"2021-06-25T05:31:17.150Z","requestEndTimeUTC":"2021-06-25T05:32:17.223Z","connectionMode":"GATEWAY","responseStatisticslist":[],"supplementalResponseStatisticslist":[],"addressResolutionStatistics":{},"regionsContacted":[],"retryContext":{"retryCount":0,"statusAndSubStatusCodes":null,"retryLatency":0},"MetadataDiagnosticsContext":{"MetadataDiagnosticList":null},"serializationDiagnosticsContext":{"serializationDiagnosticslist":[{"serializationType":"ITEM_SERIALIZATION","startTimeUTC":"2021-06-25T05:31:17.150Z","endTimeUTC":"2021-06-25T05:31:17.150Z","durationInMicroSec":0},{"serializationType":"PARTITION_KEY_FETCH_SERIALIZATION","durationInMicroSec":0}]},"gatewayStatistics":{"sessionToken":null,"operationType":"Upsert","statusCode":0,"subStatusCode":10002,"requestCharge":null,"requestTimeline":null},"systeminformation":{"usedMemory":"264619 KB","availableMemory":"3789909 KB","systemcpuLoad":"(2021-06-25T05:31:50.445Z 2.0%),(2021-06-25T05:31:55.445Z 2.0%),(2021-06-25T05:32:00.445Z 2.0%),(2021-06-25T05:32:05.445Z 2.0%),(2021-06-25T05:32:10.445Z 2.0%),(2021-06-25T05:32:15.445Z 2.0%)"},"clientCfgs":{"id":0,"numberOfClients":2,"connCfg":{"rntbd":null,"gw":"(cps:1000,rto:PT5S,icto:PT1M,p:false)","other":"(ed: true,cs: false)"},"consistencyCfg":"(consistency: null,mm: true,prgns: [southcentralus,westus])"}},causeInfo=[class: class io.netty.handler.timeout.ReadTimeoutException,message: null],responseHeaders={x-ms-substatus=10002},requestHeaders=[Accept=application/json,x-ms-date=Fri,25 Jun 2021 05:31:17 GMT,x-ms-documentdb-partitionkey=["xxxxx"],x-ms-documentdb-is-upsert=true,Content-Type=application/json]}
Stacktrace 没有显示太多信息,如果需要,我可以在这里附上。在所有这些情况下,我们在日志中只看到一个响应头 -
responseHeaders={x-ms-substatus=10002}
我们有以下问题 -
-
这个状态是什么意思?我们的 Cosmos 帮助团队正在询问 Activityid,我们无法在日志中找到这些错误的 Activityid。在这些情况下,我如何添加 activityId?我无法使用 ResponseDiagnosticsProcessor,因为它需要其他 spring cosmos 依赖项。
-
这些错误的可能原因是什么?
-
在堆栈跟踪中,为什么所有这些都显示 -
io.netty.handler.timeout.ReadTimeoutException
还有吗? -
我们如何调试这些错误?
注意:。我们没有使用 Gremlin API 并在网关模式下连接,我们看到这些错误的次数非常少,可能不到 Cosmos 请求总数的 0.05%
解决方法
子状态 10002 与 HTTP 超时有关。由于您处于网关模式,因此您的操作通过 HTTP 执行是有意义的。
在设计或编写分布式应用程序时,您始终需要考虑超时。 SDK 确实会在超时时重试(基于 https://docs.microsoft.com/azure/cosmos-db/troubleshoot-java-sdk-v4-sql#retry-logic-),但应用程序应该始终有一些超时重试层,因为它们可能因各种原因(网络信号、偶发性资源争用)而发生。
您提到您看到这不到总请求的 0.05%,这还不错,但值得检查 Java 超时指南中的区域:https://docs.microsoft.com/azure/cosmos-db/troubleshoot-request-timeout-java-sdk-v4-sql
服务端延迟高峰也可能导致超时(不太可能,但可能会发生),这是您提到的支持团队可能会提供帮助的一个方面。从诊断来看,您的请求超时似乎是 5 秒,因此任何延迟超过 5 秒的网关请求都会生成一个。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。