如何解决 Vertx 阻塞 DNS 问题

How to solve Vertx blocking DNS issue

TL;DR:是否有可能克服 Vertx 的阻塞 DNS 问题?最好使用 Vertx HttpClient?

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

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

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

提前致谢

好的,在对这个问题进行了几天的研究之后,我找到了几个可能的解决方案。我希望这可能对某人有所帮助

这些是可能的解决方案

  1. 使用 executeBlock 以编程方式解决 DNS 问题 - 这首先需要 "fixing" DNS 问题使用 vertx.executeBlocking 和未来的处理程序,并且只有在调用处理程序时调用实际的 HTTP 客户端代码。这里的一些可能的优化可能是:
    • 保存 DNS 已解析的所有主机的内存映射,如果 URL 已解析的主机到达,则将其异步废弃。
    • 在 executeBlocking 语句中将 ordered 设置为 false(如果您真的不关心顺序),因为它可以提高该代码的性能
  2. 等待 Netty 4.1 的发布。我不知道它什么时候会发生,但我显然等不及了
  3. 不要阻止事件循环。这意味着在 DNS 服务器开始缓存命中之前,该程序将运行缓慢。如果你能接受一些迟钝,那可能是个不错的选择

所有这些解决方案都来自 Vertx 邮件列表。可以看到完整的对应关系here(包括部分代码示例)

目前我是运行集群中的程序,在上面没有遇到这个问题。如果我以后需要解决这个问题,我可能会以第一个解决方案为目标(除非届时发布 Netty 4.1)

我希望我得到了所有正确的解决方案,如果有人看到这个并且有更好的想法或更正我将不胜感激

其他选项是通过将 -Dvertx.disableDnsResolver 添加到命令行来 disable dns 解析器。