Быстрое выполнение вызовов

1

Этот вопрос состоит из двух частей

Часть 1

Мне нужно сделать массовые вызовы 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 тыс. Вызовов в час. Во-вторых, я могу оптимизировать этот код каким-то другим способом?

Часть 2

Я пробовал это с помощью Java, мне просто интересно узнать, даст ли он лучший результат, если я использую язык, отличный от java? т.е. javascript/python/PHP?

Обновление 1

Мои системные характеристики для проведенных тестов

  • Ubuntu 14.04 64 бит
  • ОЗУ 4 ГБ
  • 500 ГБ жесткий диск
  • Intel Core i5-2430M CPU @2,40 ГГц × 4
  • Подключение к Интернету = 1 МБ :(

Обновление 2

Мои спецификации сервера для проведения тестов в будущем/практических

  • Cent OS 6.5
  • 1 ГБ ОЗУ
  • 1 процессор Core Core
  • 40 Gbit Network In
  • 125 Мбит сети Out :)

Пожалуйста, направляйте. Спасибо.

  • 0
    Проблема в том, что ограничивающим фактором является не скорость вашей системы, а скорость соединения. Таким образом, выполнение большего количества потоков в paralel замедлит выполнение каждого http-запроса, и в итоге это займет столько же времени.
  • 0
    Проблема очень не в вашем коде вызова, но может быть в сервере. Используя классы Jetty и Java NIO, мы смогли обслуживать гораздо больше запросов в час, чем то, о чем вы говорите. Я думаю, что нам нужно немного больше информации о том, какую систему вы вызываете, а также о размере запроса и ответа.
Теги:
performance
rest
web-services
bulk

3 ответа

0
Лучший ответ

Apache HTTPCommons 4.3 Fluent API помогло, и я смог подать гораздо больше запросов, чем указано выше.

1

Я только попытаюсь ответить на часть 1 вашего вопроса

Вы получаете тайм-ауты (или, возможно, отказались от отказа в соединении), потому что вы открываете новый сокет для каждого экземпляра созданного вами HttpClient, и существует ограничение на количество сокетов, создаваемых вашей ОС. Если вы работаете в Linux, вы, вероятно, заметите, что в состоянии CLOSE_WAIT будут сотни сокетов, которые будут закрыты только при запуске коллекции мусора VM.

Попробуйте создать один экземпляр httpClient, как это, и не создавайте новый экземпляр httpclient каждый раз, когда вы хотите сделать http-вызов.

    ClientConnectionManager mgt = new ThreadSafeClientConnManager();
    DefaultHttpClient httpClient = new DefaultHttpClient(mgt);
  • 0
    Насколько я понимаю, мы можем увеличить количество сокетов до 65 Кб и изменить дескрипторы файлов, и да, создание нового экземпляра каждый раз занимает много времени, но, создавая один экземпляр, я не думаю, что это все равно решит мою проблему. ,
0

Для достижения 300 тыс. Запросов в час с использованием python я бы рекомендовал использовать что-то вроде Celery. Вы можете легко запустить процесс X на серверах Y + один планировщик, который добавит 300 тыс. Задач в час.

Я использовал Celery с RabbitMQ для выполнения тестов производительности сайта и с 2-3 серверами, которые я смог быстро отправить запрос 20k за несколько минут.

  • 0
    Celery - это что-то вроде кварцевого планировщика ? если да то что лучше?
  • 0
    Я никогда не использовал Quartz Scheduler, но он выглядит как cron, тогда как Celery гораздо больше. Планировщик сельдерея - только одна часть целого пакета.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню