GRPC 会在重试时循环尝试不同的服务器吗?

Will GRPC try a different server in a round robin when retrying?

我正在考虑将 GRPC 与 DNS 循环法结合使用(通过 Docker swarm 的 dnsrr 模式)。我想知道,如果启用 enableRetry() 时连接失败,它会路由到 DNS-RR 中的不同 IP 吗?

Round-robin DNS 对客户端隐藏 IP 地址。如果与后端 gRPC 的连接失败,最终将 re-resolve DNS 并希望收到一个新的 IP,但 DNS 记录可能会缓存其完整的 TTL,因此这应该被视为一个缓慢的过程。重试在这里不起作用;连接总是有指数退避的重新连接尝试。

重试针对 RPC,与连接无关。当 RPC 失败并被服务配置指定的重试策略触发重试时,RPC 将再次发送。如果跨多个 IP 使用 client-side round-robin,重试通常会转到不同的服务器,但不能保证。但是如果DNS返回的IP地址只有一个,那么重试到同一台服务器不会导致DNS re-resolutions.

请注意,enableRetry() 仅启用重试子系统(也是默认设置)。您可能想通过服务配置指定重试策略。