在我的代码中,有一个循环构建 Future,这很慢。仅构建 1 个 Future 就需要大约数百毫秒。我只是在谈论设置 Future 对象,而不是获取 Reponse。代码如下:
while(settings.getCrawlerQueue().size() < settings.getCrawlerQueueSize()) {
Task task = taskQueue.poll();
task = setFutureInTask(assignment, task);
}
以及setFutureInTask()
代码:
public Task setFutureInTask(String assignment, Task task) {
task.setParserAssignment(assignment);
switch(assignment){
case "stuff":
task.setFuture(asyncClientStandard
.prepareGet("http://"+task.getDomain())
.execute()
);
break;
[...]
我按照我读过的一些东西中的建议尝试了不同的 Java JDK 和版本(找不到它:/),但这没有帮助。还尝试了 JDKAsyncHttpProvider 来代替默认的 NettyAsyncHttpProvider ,它更快,但也提供了很多 Flase-Negatives (它似乎取消了非常(!)通常有效的域)。 我注意到的是:我住在德国,德国 .de 域名明显比西类牙等其他国家的域名快。
任何疯狂的猜测都将受到高度赞赏! :)
[EDIT]
只需切换到另一个 DNS 服务器即可解决该问题。
最佳答案
我在编写和试验 HTTP 负载测试插件时遇到了类似(如果不相同)的问题。名称解析似乎在创建 future 时同步发生,如果您的 DNS 缓存无法正常工作,您每次都要为整个 DNS 查找往返付费。
至于如何解决这个问题,很难说。我通常会切换到另一个不会显示此问题的网络接口(interface)。
关于java - Ning 的 AsyncHttpClient 构建 Future 的速度太慢(在本例中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24874275/