在我的代码中有一个构建期货的循环,这是一种缓慢的方式。构建一个Future需要几百毫秒的时间。我只是在谈论设置Future对象而不是获取response。下面是代码:
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 - negative(它似乎取消了非常(!)经常有效的域)。我注意到的是:我住在德国,德国的。de域名明显比西班牙等其他国家的域名快。
任何大胆的猜测都是高度赞赏的!:)
[EDIT]
简单地切换到另一个DNS服务器解决了这个问题。
我在编写和试验HTTP负载测试插件时遇到了类似的(如果不是完全相同的)问题。名称解析似乎在创建future时同步进行,如果DNS缓存不能正常工作,则每次都要为整个DNS查找往返支付费用。
关于如何修复这个问题,很难说。我通常会切换到另一个网络接口,这样就不会出现这个问题了。