Java中的非阻塞(异步)DNS解析
有没有一种干净的方法可以以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
/kqueue
like技术) - 阅读答案,找到缓冲区中的哪一行
- 将已解析IP的行写入输出
- 继续等待下一个答案
在Perl中使用的一个简单模型实现AnyEvent
向我展示了我的想法通常是正确的,并且我可以以这种方式轻松实现每秒15-20K查询的速度(天真的阻塞实现每秒获得2-3查询-
只是为了比较-所以大约相差4个数量级)。现在,我需要在Java中实现相同的功能-我想跳过推出自己的DNS实现;)
回答:
您可能正在寻找MINA之上的Apache Directory Services
DNS实现。JavaDocs和其他有用的指南在该页面的左侧栏中。
以上是 Java中的非阻塞(异步)DNS解析 的全部内容, 来源链接: utcz.com/qa/404202.html