【问题标题】:How to solve Vertx blocking DNS issue如何解决 Vertx 阻塞 DNS 问题
【发布时间】:2016-06-11 09:25:20
【问题描述】:

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

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

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

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

提前致谢

【问题讨论】:

    标签: java dns netty vert.x vertx3


    【解决方案1】:

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

    【讨论】:

    • @ElliotVargas 它对我有用。您对这种方法有什么特别的顾虑吗?
    • 不,只是想确认此解决方案有效。谢谢
    【解决方案2】:

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

    这些是可能的解决方案

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

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

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

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

    【讨论】:

    • 注意:Netty 4.1.1 和 4.1.5 仍然存在问题。
    猜你喜欢
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多