Мне нужно постоянно проверять тысячи прокси-серверов.
Чтобы ускорить его, я думаю создать пакет размером N (скажем, 50) и одновременно отправлять запросы на них.Каждый прокси-сервер имеет уникальный IP / порт и аутентификацию по имени пользователя и паролю.
Поскольку я проверяю прокси, я настрою запрос на использование данного прокси и отправлю запрос на целевой сайт и измерим ответ.
Вот пример использования прокси с аутентификацией из документации клиента Apache:
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 прокси-серверов, мне нужно создать нового клиента для каждого из них.Это означает, что запросы не будут параллельными и лучше, если я просто использую многопоточное решение.
Проблема в том, что если я использую многопоточность, то я буду чрезмерно загружать сервер, поскольку большинство потоков будетблок ввода / вывода.Параллельный неблокирующий ввод / вывод намного лучше для этого типа задач.
Как я могу одновременно проверить несколько прокси-серверов, прошедших проверку подлинности, если мне нужно создать клиент для каждого из них?