DNS解析导致java api获取本机IP超时

简介: 背景 因为业务需求导致服务迁移,迁移过程中发现新机房同样接口的系统响应时间变的异常缓慢(普通有100-200ms的时延)。整个迁移过程中代码发布包完全拷贝,所以当时就定位为系统原因进行排查。 整个排查过程通过在代码中关键路径切入耗时监控,从而定位具体耗时部分的代码,缩小排查范围。

背景

 因为业务需求导致服务迁移,迁移过程中发现新机房同样接口的系统响应时间变的异常缓慢(普通有100-200ms的时延)。整个迁移过程中代码发布包完全拷贝,所以当时就定位为系统原因进行排查。

 整个排查过程通过在代码中关键路径切入耗时监控,从而定位具体耗时部分的代码,缩小排查范围。


排查过程

定位的代码逻辑因为保密原因省略了很多跟问题无关的代码,仅列出核心的代码。

  • try/catch过程中的核心代码没有任何耗时的逻辑。
  • finally的处理过程中增加了getLocalIP()方法获取本地ip地址。
  • 经过添加日志监控耗时怀疑getLocalIP()方法比较耗时。
    public RecomResult recommend(RequestId reqId, RecomParam condition) {
        lock.readLock().lock();
        long timeStart = System.currentTimeMillis(); 

        try {
            // 省略核心代码
            return result;
        } catch (Throwable t) {
           // 省略核心代码
        } finally {
            mapTag.put("ip", engineContext.getLocalIP());
            lock.readLock().unlock();  
        }
    }



getLocalIP()方法的实现逻辑就是调用java api获取本机ip地址

  • 网上查询类似文章InetAddress.getLocalHost() 执行很慢开始怀疑DNS解析问题。
  • 通过for循环执行dig命令确认dns解析时好时坏耗时在100-200ms不等。
  • 验证猜测确认是DNS解析问题,并开始通过本地hosts或缓存本地ip地址减少解析。。
    public String getLocalIP() {

        try {
            if (null == localIp) {
                localIp = InetAddress.getLocalHost().getHostAddress();
            }
        } catch (UnknownHostException e1) {
            LOG.error("get ip failed, e is {}", e1);
        }
        return localIp;
    }


解决方案

解决方案本身分为代码本身优化和DNS解析优化。

  • DNS层优化主要是服务器DNS解析增加本地缓存,牺牲DNS解析的时效性。
  • 代码层面优化主要获取本地ip地址后缓存只需要进行一次host解析即可。
目录
相关文章
|
25天前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
213 92
|
1月前
|
缓存 安全 Java
Java并发性能优化|读写锁与互斥锁解析
本文深入解析Java中两种核心锁机制——互斥锁与读写锁,通过概念对比、代码示例及性能测试,揭示其适用场景。互斥锁适用于写多或强一致性场景,读写锁则在读多写少时显著提升并发性能。结合锁降级、公平模式等高级特性,助你编写高效稳定的并发程序。
108 0
|
25天前
|
存储 Java API
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
150 68
|
1月前
|
安全 Oracle Java
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
159 0
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
|
28天前
|
算法 Java 测试技术
零基础学 Java: 从语法入门到企业级项目实战的详细学习路线解析
本文为零基础学习者提供完整的Java学习路线,涵盖语法基础、面向对象编程、数据结构与算法、多线程、JVM原理、Spring框架、Spring Boot及项目实战,助你从入门到进阶,系统掌握Java编程技能,提升实战开发能力。
78 0
|
1月前
|
Java API 网络架构
java调用api接口自动判断节假日信息
java调用api接口自动判断节假日信息
515 0
|
2月前
|
安全 Java API
Java 集合高级应用与实战技巧之高效运用方法及实战案例解析
本课程深入讲解Java集合的高级应用与实战技巧,涵盖Stream API、并行处理、Optional类、现代化Map操作、不可变集合、异步处理及高级排序等核心内容,结合丰富示例,助你掌握Java集合的高效运用,提升代码质量与开发效率。
191 0
|
2月前
|
Java API
深入解析Java API中Object类的功能
了解和合理运用 Object类的这些方法,对于编写可靠和高效的Java应用程序至关重要。它们构成了Java对象行为的基础,影响着对象的创建、识别、表达和并发控制。
60 0
|
Java 应用服务中间件 nginx

热门文章

最新文章

相关产品

  • 云解析DNS
  • 推荐镜像

    更多
  • DNS