4

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

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

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

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

提前致谢

4

2 回答 2

2

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

于 2018-12-10T20:36:15.470 回答
1

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

这些是可能的解决方案

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

所有这些解决方案都来自 Vertx 邮件列表。您可以在此处查看完整的对应关系(包括一些代码示例)

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

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

于 2016-03-01T14:46:09.100 回答