微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果 503

如何解决如果 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 个请求正在执行。

为了确保两个 IP 都得到解析,我添加了以下代码

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?