将 java-spanner lib 从版本 6.38.2 迁移到 6.45.0(gax 从 2.24 迁移到 2.32)后,我发现重试 DEADLINE_EXCEEDED 异常不起作用。
我有自定义重试配置:
SpannerStubSettings.Builder settingsBuilder = builder.getSpannerStubSettingsBuilder();
settingsBuilder.readSettings()
.setRetryableCodes({StatusCode.Code.DEADLINE_EXCEEDED, StatusCode.Code.UNAVAILABLE})
.setRetrySettings(
RetrySettings.newBuilder()
.setInitialRetryDelay(Duration.ofMillis(10))
.setMaxRetryDelay(Duration.ofMillis(200))
.setRetryDelayMultiplier(1.5)
.setInitialRpcTimeout(Duration.ofMillis(100))
.setMaxRpcTimeout(Duration.ofMillis(1000))
.setRpcTimeoutMultiplier(1.5)
.setTotalTimeout(Duration.ofMillis(2000))
.build());
有了这个以及 java-spanner 库的 6.45.0 版本,许多请求在 0.0999 秒后都会以异常 DEADLINE_EXCEEDED 结束,因此在初始 RPC 超时后,不再重试。在应用重试并且请求最终成功之前。
如何解释?我已经检查了 lib 存储库(java-spanner 和 gax)中的更改,但无法匹配此特定行为的任何内容。
根据@kpater87的评论发布此内容:
似乎只有在需要创建会话时才会出现此问题。第一个具有此行为的版本是 gax 2.28.1。在不考虑 init-rpc-timeout 之前,不会重试,但会提供结果(如果达到总超时限制)。
您可以在 Google API Extensions for Node.js 上查看此链接以供参考。