You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

超低网络环境下OKHTTP WebSocket请求启用DNS缓存及调整TTL方法

OkHttp WebSocket 配置DNS缓存及调整TTL

OkHttp 默认的 Dns.SYSTEM 实现没有内置DNS缓存,弱网环境下重复发起DNS解析会额外增加耗时,你可以通过以下两种方式配置DNS缓存并自定义TTL:

方式一:使用OkHttp官方内置的DnsCache(OkHttp 4.9.0+)

OkHttp 4.9.0及以上版本提供了DnsCache类,可直接包装默认DNS实现添加缓存:

  1. 创建带TTL的缓存DNS实例
// 设置DNS缓存TTL为5分钟(300秒),可根据网络需求调整
Dns cachedDns = new DnsCache(Dns.SYSTEM, Duration.ofMinutes(5));
// 可选:限制缓存条目数量,避免内存占用过高
// Dns cachedDns = new DnsCache(Dns.SYSTEM, Duration.ofMinutes(5), 100);
  1. 将缓存DNS配置到OkHttpClient,再建立WebSocket连接
OkHttpClient client = new OkHttpClient.Builder()
    .dns(cachedDns)
    // 其他配置(如超时、拦截器等)
    .build();

// 构建WebSocket请求
Request wsRequest = new Request.Builder()
    .url("wss://your-target-domain.com")
    .build();

// 建立连接
WebSocket webSocket = client.newWebSocket(wsRequest, new WebSocketListener() {
    @Override
    public void onOpen(WebSocket webSocket, Response response) {
        // 连接成功处理逻辑
    }

    @Override
    public void onMessage(WebSocket webSocket, String text) {
        // 接收消息处理逻辑
    }

    // 其他回调方法按需实现
});

方式二:自定义DNS缓存实现(兼容旧版本OkHttp)

如果使用的OkHttp版本低于4.9.0,可借助缓存库或自定义容器实现DNS缓存:

  1. 实现自定义CachedDns类
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import okhttp3.Dns;
import java.io.IOException;
import java.net.InetAddress;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

public class CachedDns implements Dns {
    private final Dns delegate;
    private final Cache<String, List<InetAddress>> dnsCache;

    public CachedDns(Dns delegate, long ttlSeconds, long maxCacheEntries) {
        this.delegate = delegate;
        this.dnsCache = CacheBuilder.newBuilder()
                .expireAfterWrite(ttlSeconds, TimeUnit.SECONDS)
                .maximumSize(maxCacheEntries)
                .build();
    }

    @Override
    public List<InetAddress> lookup(String hostname) throws IOException {
        try {
            // 缓存优先,未命中则调用默认DNS解析
            return dnsCache.get(hostname, () -> delegate.lookup(hostname));
        } catch (ExecutionException e) {
            throw new IOException("DNS lookup failed for hostname: " + hostname, e.getCause());
        }
    }
}
  1. 配置到OkHttpClient
OkHttpClient client = new OkHttpClient.Builder()
    // 设置TTL为10分钟(600秒),最大缓存100条记录
    .dns(new CachedDns(Dns.SYSTEM, 600, 100))
    .build();

// 后续WebSocket连接逻辑同方式一

注意事项

  • TTL值需平衡设置:弱网环境可设较长TTL(如10-15分钟)减少解析次数,但如果域名存在IP变动需求,需避免TTL过长导致解析结果过期。
  • 缓存会作用于该OkHttpClient实例发起的所有请求(包括WebSocket和普通HTTP请求)。

内容的提问来源于stack exchange,提问作者Abdul Hakeem Mahmood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:50:03