首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的非阻塞(异步) DNS解析

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

Stack Overflow用户
提问于 2012-08-14 15:11:36
回答 6查看 10.3K关注 0票数 30

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

我到目前为止发现的是:

  • 标准InetAddress.getByName()实现是阻塞的,看起来标准Java库缺少任何非阻塞实现。
  • 批量解析DNS问题讨论了类似的问题,但找到的唯一解决方案是多线程方法(即一个线程在给定时间内只处理一个查询),这并不是真正可扩展的。
  • 泼尼斯瓦库也只阻塞。
  • 对dnsjava的古代非阻塞扩展可以追溯到2006年,因此缺乏任何现代的Future并发工具,比如Future范式的使用,以及非常有限的仅队列实现。
  • 强尼项目也是dnsjava的扩展,但它也适用于线程模型(即1 query =1线程)。
  • 异步似乎是到目前为止针对这个问题找到的最好的解决方案,但是:
    • 它也是从2007年开始的,看起来被遗弃了
    • 缺少几乎任何文档/javadoc
    • 使用许多非标准技术,如Fun类。

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

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

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

第二条线索是:

  • 等待DNS服务器回答任何查询(使用类似epoll / kqueue的技术)
  • 阅读答案,找出它在缓冲区中的用途。
  • 将带有解析IP的行写入输出
  • 继续等待下一个答案

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-08-18 00:49:51

也许你要找的就是米娜上面的Apache目录服务的DNS实现。JavaDocs和其他有用的指南在页面的左边栏中.

票数 5
EN

Stack Overflow用户

发布于 2013-06-03 15:55:48

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

票数 5
EN

Stack Overflow用户

发布于 2012-08-18 00:40:54

我认为,您必须自己使用基本套接字支持在原始UDP之上实现DNS客户端协议,或者使用NIO通道在TCP之上实现。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11955409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档