如何解决Vertx拦截DNS问题

2022-04-04 00:00:00 dns java netty vert.x vertx3

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

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

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

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

提前谢谢


解决方案

好的,在对这个问题深入研究了几天之后,我找到了这个问题的几个可能的解决方案。我希望这能帮助一些人

这些是可能的解决方案

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

所有这些解决方案都来自Vertx邮件列表。您可以看到完整的通信here(包括一些代码示例)

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

我希望我所有的解决方案都是正确的,如果有人看到这一点并有更好的想法或更正,我将非常感激

相关文章