我正在寻找快速解决方案来检查列表中代理的可用性(最多10k)。
如果我们可以连接它,代理是可用的,因此要检查10k代理,我们必须发出10k请求。由于连接超时设置为10秒,因此请求应该是并行的。
以下是现在检查可用性的方法:
private boolean isAvailable(Proxy proxy) {
try {
URL u = new URL(url);
HttpURLConnection conn = (HttpURLConnection) u.openConnection(proxy);
conn.connect();
LOG.warn("Proxy " + proxy.address() + " is OK");
conn.disconnect();
return true;
} catch (Exception e) {
LOG.warn("Proxy " + proxy.address() + " is unavailable");
return false;
}
}
在Java中运行10k个线程并不是一个好主意,即使合理数量的32个线程也会给我们持续时间(10.000 / 32)* 10 = 3100秒。
所以我认为带有选择器的Java NIO是最好的选择,但是我不记得教程中的例子,这些例子旨在扩展那么多。我想像netty这样的第三方库可以轻松解决这个问题,但是我想看看如何用纯java来完成它。
此外,由于资源使用,我的方案是否有任何阈值?客户端连接是否消耗资源,因此最好只使用500个并发请求?这种情况是否存在理论上的最大值(除了端口数)?