Этот вопрос состоит из двух частей
Мне нужно сделать массовые вызовы API доступа для сторонних API, т. Е. Около 300 тыс. В час, поэтому лучший способ оптимизировать мой код для своевременного получения ответа. Как и в тесте, я попытался создать 1000 потоков и вызвал код ниже, чтобы получить ответ за минимальное время, но результат был довольно разочаровывающим. Некоторые из вызовов ответили успешно, но многие из вызовов получили ошибку тайм-аута.
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://www.example.com");
HttpResponse response;
response = client.execute(httpGet);
System.out.println(response.getStatusLine().getStatusCode());
HttpEntity entity = response.getEntity();
String result = getStringFromInputStream(entity.getContent());
Я знаю, что ошибка таймаута может быть связана с сервером, но, например, сервер возвращает ответ, и все мои 1000 потоков отвечают в течение 5 минут, а затем я не смог бы достичь 300 тыс. Вызовов в час. Во-вторых, я могу оптимизировать этот код каким-то другим способом?
Я пробовал это с помощью Java, мне просто интересно узнать, даст ли он лучший результат, если я использую язык, отличный от java? т.е. javascript/python/PHP?
Мои системные характеристики для проведенных тестов
Мои спецификации сервера для проведения тестов в будущем/практических
Пожалуйста, направляйте. Спасибо.
Apache HTTPCommons 4.3 Fluent API помогло, и я смог подать гораздо больше запросов, чем указано выше.
Я только попытаюсь ответить на часть 1 вашего вопроса
Вы получаете тайм-ауты (или, возможно, отказались от отказа в соединении), потому что вы открываете новый сокет для каждого экземпляра созданного вами HttpClient, и существует ограничение на количество сокетов, создаваемых вашей ОС. Если вы работаете в Linux, вы, вероятно, заметите, что в состоянии CLOSE_WAIT будут сотни сокетов, которые будут закрыты только при запуске коллекции мусора VM.
Попробуйте создать один экземпляр httpClient, как это, и не создавайте новый экземпляр httpclient каждый раз, когда вы хотите сделать http-вызов.
ClientConnectionManager mgt = new ThreadSafeClientConnManager();
DefaultHttpClient httpClient = new DefaultHttpClient(mgt);
Для достижения 300 тыс. Запросов в час с использованием python я бы рекомендовал использовать что-то вроде Celery. Вы можете легко запустить процесс X на серверах Y + один планировщик, который добавит 300 тыс. Задач в час.
Я использовал Celery с RabbitMQ для выполнения тестов производительности сайта и с 2-3 серверами, которые я смог быстро отправить запрос 20k за несколько минут.