Java中的非阻塞(异步)DNS解析

Gre*_*Cat 28 java dns asynchronous event-driven nonblocking

是否有一种干净的方法以非阻塞的方式异步解析Java中的DNS查询(通过主机名获取IP)(即状态机,而不是1个查询= 1个线程 - 我想同时运行数万个查询,但是没有运行成千上万的线程)?

到目前为止我发现了什么:

  • 标准InetAddress.getByName()实现是阻塞的,看起来标准Java库缺少任何非阻塞实现.
  • 在批量问题中解决DNS讨论了类似的问题,但找到的唯一解决方案是多线程方法(即一个线程在每个给定时刻只处理1个查询),这不是真正可扩展的.
  • dnsjava库也只是阻塞.
  • dnsjava有一些古老的非阻塞扩展,可以追溯到2006年,因此缺乏任何现代的Java并发性东西,例如Future范式使用,以及非常有限的仅限队列的实现.
  • dnsjnio项目也是dnsjava的扩展,但它也适用于线程模型(即1个查询= 1个线程).
  • asyncorg似乎是我迄今为止针对此问题找到的最佳解决方案,但是:
    • 它也是从2007年开始,看起来已经废弃了
    • 几乎没有任何文档/ javadoc
    • 使用许多非标准技术,如Fun

我错过了任何其他想法/实施?

澄清.我有一个相当大(每天几TB)的日志量.每个日志行都有一个主机名,可以来自互联网上的任何地方,我需要一个IP地址作为我的进一步统计计算的主机名.行的顺序并不重要,所以,基本上,我的想法是开始2个线程:首先迭代线:

  • 读一行,解析它,获取主机名
  • 发送查询到DNS服务器以解析给定的主机名,不要阻止回答
  • 将行和DNS查询套接字句柄存储在内存中的某个缓冲区中
  • 转到下一行

第二个线程将:

  • 等待DNS服务器回答任何查询(使用epoll/ kqueuelike技术)
  • 阅读答案,找到缓冲区中的哪一行
  • 将已解析IP的行写入输出
  • 继续等待下一个答案

Perl中的一个简单的模型实现AnyEvent向我展示了我的想法通常是正确的,我可以通过这种方式轻松实现每秒15-20K查询的速度(天真的阻塞实现每秒2-3次查询 - 只是为了比较 - 所以这就像4个数量级的差异).现在我需要在Java中实现相同的 - 我想跳过我自己的DNS实现;)

and*_*soj 5

可能是在MINA之上的DNS目录服务实现是您正在寻找的.JavaDocs和其他有用的指南位于该页面的左侧边栏中.


val*_*zka 5

在netty中有一些关于非阻塞DNS 的工作,但它仍在进行中,可能只在5.0中发布