一尘不染

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

java

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

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

  • 标准InetAddress.getByName()实现正在阻塞,并且看起来标准Java库缺少任何非阻塞实现。
  • 批量解决DNS问题也讨论了类似的问题,但是找到的唯一解决方案是多线程方法(即,一个线程在每个给定的时间段内仅对1个查询进行处理),这实际上不是可扩展的。
  • dnsjava库也仅阻止。
  • dnsjava可以追溯到2006年,是古老的非阻塞扩展,因此缺少任何现代Java并发功能,例如Future范式用法和可惜的是,仅队列实现非常有限。
  • dnsjnio项目也是dnsjava的扩展,但它也适用于线程模型(即1个查询= 1个线程)。
  • 到目前为止,asyncorg似乎是我找到的针对此问题的最佳可用解决方案,但是:
    • 也是从2007年开始的
    • 几乎没有任何文档/ javadoc
    • 使用很多非标准技术,例如Fun课堂

还有其他我想念的想法/实现吗?

澄清
。我有相当大的日志(每天数TB)。每个日志行都有一个主机名,该主机名几乎可以来自Internet上的任何地方,我需要该主机名的IP地址来进行进一步的统计计算。行的顺序并不重要,因此,基本上,我的想法是启动2个线程:首先遍历行:

  • 读一行,解析它,获取主机名
  • 向DNS服务器发送查询以解析给定的主机名,请勿阻塞以获取答案
  • 将线路和DNS查询套接字句柄存储在内存中的某些缓冲区中
  • 转到下一行

第二个线程将:

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

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


阅读 396

收藏
2020-12-03

共1个答案

一尘不染

您可能正在寻找MINA之上的Apache Directory Services
DNS实现
。JavaDocs和其他有用的指南在该页面的左侧栏中。

2020-12-03