如何解决Vertx阻塞DNS问题

4
TL;DR: 是否可能使用Vertx来解决DNS阻塞问题?最好能在Vertx HttpClient中实现?
我正在尝试使用Vertx爬取一些具有不同主机的URL。目前我正在使用Vertx HttpClient,但最近遇到了一个阻塞DNS调用的问题,它有时会阻止我的HttpClient请求(从而也阻止事件循环)。可以在此处找到这个问题的描述:here
我不能在“executeBlocking”函数中使用阻塞http客户端,因为我选择Vertx方案是因为它是异步的,并且应该能够处理我所预期的负载。而且,我也无法自己解析IP地址,因为它只为特定的主机解决了这个问题,而我正在尝试获取许多不同的主机。
因此,我的问题是:是否有任何(相对)优雅的解决方案,可以解决此问题,而不需要等待未来的Netty版本?最好是使用本地的Vertx HttpClient。
谢谢您的帮助。
2个回答

3

另一种选择是通过在命令行中添加-Dvertx.disableDnsResolver禁用dns解析器。


@ElliotVargas 对我来说它是有效的。你对这种方法有什么特别的顾虑吗? - Ruslan Akhundov
不,只想确认这个解决方案有效。谢谢 - Elliot Vargas

1

好的,经过几天的研究,我找到了一些可能的解决方案。希望这能对某些人有所帮助

以下是可能的解决方案:

  1. 使用executeBlock以编程方式解决DNS问题 - 这需要使用vertx.executeBlocking和future handler首先“修复”DNS问题,只有在处理程序被调用时才调用实际的HTTP客户端代码。可能的优化如下:
    • 保存所有DNS已经解析的主机的内存映射表,如果到达一个已解析主机的URL,则异步地放弃它。
    • 在executeBlocking语句中设置ordered为false(如果您真的不关心排序),因为它可以提高该代码的性能。
  2. 等待Netty 4.1发布。我不知道它什么时候会发生,但我显然不能等待它。
  3. 不要采取任何措施来阻止事件循环。这意味着直到DNS服务器开始获得缓存命中,程序将变得缓慢。如果您可以接受一些缓慢,那可能是一个好选择。

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

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

我希望我已经正确理解了所有解决方案,如果有人看到这篇文章并有更好的想法或更正意见,我将不胜感激。


注意:我们仍然存在Netty 4.1.1和4.1.5的问题。 - рüффп

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接