【问题标题】:OKHttp3: how to retry another IP address if one is unreachableOKHttp3:如果一个 IP 地址无法访问,如何重试另一个 IP 地址
【发布时间】:2021-10-18 20:53:15
【问题描述】:

OkHttp3 是否支持以下情况:

  • x.x.x.x myapp.com
  • y.y.y.y myapp.com

一个主机名有两个 IP,看起来 OkHttpClient 总是重试第一个 IP 地址,而不是尝试另一个可用的 IP 地址。

retryOnConnectionFailure(true) 支持这个吗?从文档中,默认情况下它应该支持这个?

将此客户端配置为在遇到连接问题时重试或不重试。默认情况下,此客户端会静默地从以下问题中恢复:

  • 无法访问的 IP 地址。如果 URL 的主机有多个 IP 地址,未能到达任何单独的 IP 地址不会失败 总体要求。这可以提高多宿主的可用性 服务。

    过时的池连接。 ConnectionPool 重用套接字 减少请求延迟,但这些连接偶尔会 超时。

    无法访问代理服务器。 ProxySelector 可用于尝试 多个代理服务器按顺序排列,最终退回到一个 直接连接。

    将此设置为 false 以避免在这样做时重试请求 破坏性的。在这种情况下,调用应用程序应该自己做 连接故障的恢复。

【问题讨论】:

    标签: okhttp


    【解决方案1】:

    OkHttp 会依次尝试。

    【讨论】:

    • 但在我们的测试中,我们看到它确实重试了第一个无法访问的 IP,并且没有尝试第二个可用的 IP。可能是什么原因?我应该明确调用 retryOnConnectionFailure(true) 吗?
    • 我确实看到 dns 响应 3663 16.544083 192.168.3.4 192.168.3.234 DNS 149 标准查询响应 0xa986 A smf.xxx.com A 100.66.31.25 A 1.1.1.1 NS dns-primary.xxx。 com A 100.70.181.24 但它只在第一个 ip 1.1.1.1 上重新传输,这是假 ip。但从来没有看到它尝试连接到 100.70.181.24,我确实设置了 retryOnConnectionFailure(true)。
    • 有人可以回答我的问题吗?我确实看到了一些代码来循环由 dns lookup() 检索到的 IP 地址:
    • 你知道okhttp3包中的哪个java类,okhttp会尝试两个IP地址吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2015-08-17
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多