如何解决Vertx阻止DNS问题

时间:2016-02-28 09:41:10

标签: java dns netty vert.x vertx3

TL; DR:是否可以克服Vertx阻止DNS问题?最好使用Vertx HttpClient?

我正在尝试使用Vertx来抓取一些不同主机的网址。我目前正在使用Vertx HttpClient这样做,我最近遇到了阻塞DNS调用的问题,这有时会阻止我的HttpClient请求(因此也会阻止事件循环)。此问题的描述为here

我不能在“executeBlocking”函数中使用阻塞http客户端,因为我使用Vertx解决方案,因为它是异步的,应该能够处理我期望的负载。此外,我无法自己解析IP地址,因为它只是在我尝试获取许多不同的主机时解决了特定主机的问题

所以我的问题是:这个问题是否有任何(相对)优雅的解决方案,不需要我等待未来的Netty版本?最好是使用原生Vertx HttpClient的东西。

提前致谢

2 个答案:

答案 0 :(得分:1)

好的,所以在经过几天挖掘这个问题之后,我找到了几个可能解决这个问题的方法。我希望这可以帮助某人

这些是可能的解决方案

  1. 使用executeBlock以编程方式解决DNS问题 - 这需要先修复"修复"使用vertx.executeBlocking与未来处理程序的DNS问题,并且仅在调用处理程序时调用实际的HTTP客户端代码。这里可能的一些优化可能是:
    • 保存DNS已解析的所有主机的内存映射,如果已解析主机的URL到达,则只是异步废弃它。
    • 在executeBlocking语句中将order ordered设置为false(如果您真的不关心排序),因为它可以提高该代码的性能
  2. 等待Netty 4.1出来。我不确切知道它何时会发生,但我显然不能等待它
  3. 不要阻止事件循环。这意味着程序将缓慢,直到DNS服务器开始获取缓存命中。如果你能接受一些迟钝,这可能是一个很好的契合
  4. 所有这些解决方案均来自Vertx邮件列表。您可以看到完整的通信here(包括一些代码示例)

    目前我在群集中运行该程序,但我没有遇到此问题。如果我以后需要解决这个问题,我可能会针对第一个解决方案(除非当时发布Netty 4.1)

    我希望我能找到所有正确的解决方案,如果有人看到这个并且有更好的想法或更正,我会非常感激

答案 1 :(得分:0)

其他选择是通过在命令行中添加-Dvertx.disableDnsResolverdisable dns解析器。