当Netty从名称服务器收到主机的响应时,主机名已成功解析。
一段时间(不到一分钟)后,当没有收到来自名称服务器的同一主机的响应时,netty引发了io.netty.resolver.dns.DnsResolveContext $ SearchDomainUnknownHostException异常。我们可以设置一些缓存TTL来解决此类问题吗?

Netty请求dns作为主机名:hostname.removed.by.me.com

2019-01-21 21:38:30,204+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-4] DEBUG - [id: 0x00c6985d] WRITE: [17454: /10.12.1.198:53], DefaultDnsQuestion(hostname.removed.by.me.com. IN A)
2019-01-21 21:38:30,205+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-4] DEBUG - [id: 0x00c6985d] WRITE: [22100: /10.12.1.198:53], DefaultDnsQuestion(hostname.removed.by.me.com. IN AAAA)
2019-01-21 21:38:30,205+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-4] DEBUG - [id: 0xf7e571f5] WRITE: [7006: /10.12.1.197:53], DefaultDnsQuestion(hostname.removed.by.me.com. IN A)
2019-01-21 21:38:30,205+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-4] DEBUG - [id: 0xf7e571f5] WRITE: [643: /10.12.1.197:53], DefaultDnsQuestion(hostname.removed.by.me.com. IN AAAA)


已成功解决:

2019-01-21 21:38:30,205+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-6] DEBUG - [id: 0xf7e571f5] RECEIVED: [643: /10.12.1.197:53], DatagramDnsResponse(from: /10.12.1.197:53, to: /0:0:0:0:0:0:0:0:51179, 643, QUERY(0), NoError(0), RD RA)
    DefaultDnsQuestion(hostname.removed.by.me.com. IN AAAA)
    DefaultDnsRawRecord(removed.by.me.com. 28 IN SOA 66B)
    DefaultDnsRawRecord(OPT flags:0 udp:4000 0B)
2019-01-21 21:38:30,206+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-6] DEBUG - [id: 0xf7e571f5] RECEIVED: [7006: /10.12.1.197:53], DatagramDnsResponse(from: /10.12.1.197:53, to: /0:0:0:0:0:0:0:0:51179, 7006, QUERY(0), NoError(0), RD RA)
    DefaultDnsQuestion(hostname.removed.by.me.com. IN A)
    DefaultDnsRawRecord(hostname.removed.by.me.com. 11 IN A 4B)
    DefaultDnsRawRecord(OPT flags:0 udp:4000 0B)
2019-01-21 21:38:30,206+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-6] DEBUG - [id: 0x00c6985d] RECEIVED: [22100: /10.12.1.198:53], DatagramDnsResponse(from: /10.12.1.198:53, to: /0:0:0:0:0:0:0:0:51178, 22100, QUERY(0), NoError(0), RD RA)
    DefaultDnsQuestion(hostname.removed.by.me.com. IN AAAA)
    DefaultDnsRawRecord(removed.by.me.com. 433 IN SOA 66B)
    DefaultDnsRawRecord(OPT flags:0 udp:4000 0B)
2019-01-21 21:38:30,207+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-6] DEBUG - [id: 0x00c6985d] RECEIVED: [17454: /10.12.1.198:53], DatagramDnsResponse(from: /10.12.1.198:53, to: /0:0:0:0:0:0:0:0:51178, 17454, QUERY(0), NoError(0), RD RA)
    DefaultDnsQuestion(hostname.removed.by.me.com. IN A)
    DefaultDnsRawRecord(hostname.removed.by.me.com. 11 IN A 4B)
    DefaultDnsRawRecord(OPT flags:0 udp:4000 0B)



不到一分钟后,再次要求dns使用相同的主机名。

2019-01-21 21:39:19,278+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-1] DEBUG - [id: 0x00c6985d] WRITE: [51012: /10.12.1.198:53], DefaultDnsQuestion(hostname.removed.by.me.com. IN A)
2019-01-21 21:39:19,278+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-1] DEBUG - [id: 0x00c6985d] WRITE: [18882: /10.12.1.198:53], DefaultDnsQuestion(hostname.removed.by.me.com. IN AAAA)
2019-01-21 21:39:19,278+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-1] DEBUG - [id: 0xf7e571f5] WRITE: [51838: /10.12.1.197:53], DefaultDnsQuestion(hostname.removed.by.me.com. IN A)
2019-01-21 21:39:19,279+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-1] DEBUG - [id: 0xf7e571f5] WRITE: [32353: /10.12.1.197:53], DefaultDnsQuestion(hostname.removed.by.me.com. IN AAAA)


没有从名称服务器收到响应,netty引发了异常:

2019-01-21 21:39:24,279+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-6] ERROR - Unable to resolve hostname.removed.by.me.com io.netty.resolver.dns.DnsResolveContext$SearchDomainUnknownHostException: Search domain query failed. Original hostname: 'hostname.removed.by.me.com' failed to resolve 'hostname.removed.by.me.com' after 2 queries
    at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:845) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.resolver.dns.DnsResolveContext.tryToFinishResolve(DnsResolveContext.java:806) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.resolver.dns.DnsResolveContext.query(DnsResolveContext.java:333) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.resolver.dns.DnsResolveContext.query(DnsResolveContext.java:322) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.resolver.dns.DnsResolveContext.access$500(DnsResolveContext.java:62) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.resolver.dns.DnsResolveContext$3.operationComplete(DnsResolveContext.java:379) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:504) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:483) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:121) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.resolver.dns.DnsQueryContext.setFailure(DnsQueryContext.java:216) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.resolver.dns.DnsQueryContext.access$300(DnsQueryContext.java:43) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.resolver.dns.DnsQueryContext$4.run(DnsQueryContext.java:166) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.PromiseTask$RunnableAdapter.call(PromiseTask.java:38) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:127) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:462) [netty-transport-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:897) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at java.lang.Thread.run(Thread.java:745) [?:1.7.0_60]
Caused by: io.netty.resolver.dns.DnsNameResolverTimeoutException: [/10.12.1.197:53] query timed out after 5000 milliseconds (no stack trace available)


有什么方法可以增加DNS缓存TTL,以免发生此类问题?

最佳答案

当没有从名称服务器收到相同主机的响应时


此问题已在Redisson 2.15.1 / 3.10.1中解决

09-16 04:06