wechatpay-apiv3 / wechatpay-java

微信支付 APIv3 的官方 Java Library
Apache License 2.0
923 stars 206 forks source link

使用双域名实现跨城容灾 #175

Closed xy-peng closed 1 year ago

xy-peng commented 1 year ago

根据 跨城冗灾升级指引,在 HTTP 层实现了在网络失败时,使用 api2.wechatpay.cn 重试。

实现方案有两种:

  1. 目前使用的方案,使用拦截器,IOException 时重试,修改请求的 hostname 至 api2.wechatpay.cn
  2. 重写 OkHttp.Dns,域名解析返回 api 和 api2 混合的 IP 列表

综合考虑,采用第一种方案,它虽然略微复杂,测试麻烦,但易于扩展,能有效地标识重试请求,可以跟踪重试的情况。

xy-peng commented 1 year ago

使用OkHttp Application Interceptor重试,OkHttp底层先会自动对DNS解析出来的多个(对于api域名是2个)重试。按现在的实现,出现网络问题是会多连接几次,有整体超时变长的可能。

例如:

api.mch.weixin.qq.com解析得到[ipa1, ipa2] (1/2的顺序随机) api2.mch.weixin.qq.com解析得到[ipb1, ipb2](1/2的顺序随机)

当前重试的顺序是 [ipa1, ipa2, ipb1, ipb2]

可以用setRetryOnConnectionFailure关闭,顺序变为 [ipa1, ipb1]

xy-peng commented 1 year ago

实现做了调整

  1. 默认不开启,为了避免影响已经自行实现了重试策略的商户系统
  2. 增加了 disableRetryOnConnectionFailure 可关闭 OkHttp 默认的重试,并补充了 readme 说明
sonarcloud[bot] commented 1 year ago

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 0 Code Smells

97.4% 97.4% Coverage
0.0% 0.0% Duplication