如何解决如果 503
在我的后端应用程序中,我的负载平衡器使用循环分配流量。所以,我的主机名有两条 A 记录:
- x.x.x.x myapp.com
- y.y.y.y myapp.com
如果其中任何一个发生故障,它会返回 503 Service Unavailable。
现在,在我的 Android 应用程序中,我使用 OkHttp 4.x 进行网络操作,并且 DNS 解析缓存在设备上。因此,如果缓存 IP 出现故障,它不会尝试访问另一个 IP 并且请求失败。我尝试了多种方法来使它工作,但直到现在还没有废话。我尝试过的事情:
- 添加网络拦截器并设置
Retry-After: 0
标头以强制其重试请求。 - 添加一个计数变量并再次发送请求,直到计数变为0
- 将连接池设置为
.connectionPool(new ConnectionPool(0,1,TimeUnit.MILLISECONDS))
以避免缓存连接并重试请求 - 根据 docs,它说它应该在连接失败时自动重试,但对于状态代码 503 则不会。我在探查器中验证了这一点,我只能看到 1 个请求正在执行。
OkHttpClient client = new OkHttpClient.Builder().build();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
List<InetAddress> addr = client.dns().lookup("myapp.com");
for ( InetAddress a : addr ) {
Log.d(TAG,a.toString());
}
} catch (Exception e) {
e.printstacktrace();
}
}
});
thread.start();
我得到了日志中的两个条目:
myapp.com/x.x.x.x
myapp.com/y.y.y.y
那么,有没有办法让 OkHttp 客户端在失败的情况下尝试另一个 IP?
解决方法
这不能由任何应用程序完成,除非您可以访问您的 DNS 服务器源,让他选择发送请求的 IP。
如果 DNS 记录可以通过任何方式编辑,例如使用主机文件来确定域指向哪个 IP,那么您可以即时更改该文件,并完成工作。但是即使有主机文件,Android OS/IOS 也不会让你这样做。
您不能选择将请求发送到某个特定的 IP,除非您知道将域名传递给请求头中的该请求的神奇方法,尤其是当它带有 SSL 时。
故障转移到一台服务器(如果另一台服务器关闭)的唯一方法是在您的基础架构中放置一个控制器,它会知道您的两台服务器中的哪一台已启动并正在运行,并将请求路由到那台服务器。
>版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。