我必须连续检查数千个代理服务器。
为了加快速度,我正在考虑创建一批大小为N(例如50)并同时向其发送请求。每个代理服务器都有唯一的IP /端口和用户名/密码验证。
由于我正在检查代理,因此我将配置请求以使用给定的代理,并将请求发送到目标站点并评估响应。
以下是将Apache客户端文档中的auth与代理一起使用的示例:
public static void main(String[] args)throws Exception {
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
new AuthScope("localhost", 8889),
new UsernamePasswordCredentials("squid", "nopassword"));
CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
.setDefaultCredentialsProvider(credsProvider)
.build();
try {
httpclient.start();
HttpHost proxy = new HttpHost("localhost", 8889);
RequestConfig config = RequestConfig.custom()
.setProxy(proxy)
.build();
HttpGet httpget = new HttpGet("https://httpbin.org/");
httpget.setConfig(config);
Future<HttpResponse> future = httpclient.execute(httpget, null);
HttpResponse response = future.get();
System.out.println("Response: " + response.getStatusLine());
System.out.println("Shutting down");
} finally {
httpclient.close();
}
}
如您所见,如果您使用的是经过身份验证的代理,则需要在客户端本身中提供凭据。 这意味着如果我要同时检查50个代理服务器,则必须为每个代理服务器创建一个新客户端。这意味着如果我仅使用多线程解决方案,请求将不会是并发的,并且会更好。
问题是,如果我使用多线程,那么由于大多数线程将阻塞I / O,因此我将在服务器上施加过多的负载。对于这种类型的挑战,并发非阻塞I / O要好得多。
如果必须为每个认证的代理服务器创建一个客户端,如何同时检查多个认证的代理服务器?