当前位置: 首页 > 面试题库 >

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

袁鸿雪
2023-03-14
问题内容

有没有一种干净的方法可以以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实现;)


问题答案:

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



 类似资料:
  • 本文向大家介绍java 中同步、异步、阻塞和非阻塞区别详解,包括了java 中同步、异步、阻塞和非阻塞区别详解的使用技巧和注意事项,需要的朋友参考一下 java 中同步、异步、阻塞和非阻塞区别详解 简单点说: 阻塞就是干不完不准回来,一直处于等待中,直到事情处理完成才返回; 非阻塞就是你先干,我先看看有其他事没有,一发现事情被卡住,马上报告领导。 我们拿最常用的send和recv两个函数来说吧..

  • 我认为下面的流量链将通过事件循环放置/执行(像JS)。因此,运行下面的代码将首先打印阻塞循环&然后将执行通量链。 但是,整个通量总是先执行,然后才移动到循环。[我确实有一些语句正在阻塞。但是有两个阶段] 当我们使用reactor时,通过使用一些调度程序来实现异步/非阻塞行为的唯一方法? 如果我不使用任何调度器,并让代码使用当前线程执行,那么即使对于IO密集型应用程序,使用WebFlux而不是Spr

  • 从进程调度谈起 现代操作系统(如 Windows、Linux 等)都是分时系统。分时系统允许同时允许多个任务,但实际上,由于一台计算机通常只有一个 CPU,所以不可能真正地同时运行多个任务。这些进程实际上是轮番运行,每个进程运行一个时间片。由于时间片通常很短,用户不会感觉到,所以这些进程看起来就像是同时运行。 每个进程的时间片由操作系统完成初始化,所有进程轮番地执行相应的时间。具体下一个时间片轮到

  • 本文向大家介绍请你说一下阻塞,非阻塞,同步,异步相关面试题,主要包含被问及请你说一下阻塞,非阻塞,同步,异步时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 阻塞和非阻塞:调用者在事件没有发生的时候,一直在等待事件发生,不能去处理别的任务这是阻塞。调用者在事件没有发生的时候,可以去处理别的任务这是非阻塞。 同步和异步:调用者必须循环自去查看事件有没有发生,这种情况是同步。调用者不用自己去查看

  • 本文向大家介绍详解socket阻塞与非阻塞,同步与异步、I/O模型,包括了详解socket阻塞与非阻塞,同步与异步、I/O模型的使用技巧和注意事项,需要的朋友参考一下 socket阻塞与非阻塞,同步与异步 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步: 所谓同步,就是在

  • 实时的web特性通常需要为每个用户一个大部分时间都处于空闲的长连接. 在传统的同步web服务器中,这意味着需要给每个用户分配一个专用的线程,这样的开销是十分巨大的. 为了减小对于并发连接需要的开销,Tornado使用了一种单线程事件循环的方式. 这意味着所有应用程序代码都应该是异步和非阻塞的,因为在同一时刻只有一个操作是有效的. 异步和非阻塞这两个属于联系十分紧密而且通常交换使用,但是它们并不完全