Использование асинхронного HTTP-клиента netty client не работает с высокой нагрузкой?

У меня возникли проблемы с некоторым кодом, который я тестирую с помощью AsyncHTTPClient. Вот общий конфиг

    this.config = (new AsyncHttpClientConfig.Builder())
            .setAllowPoolingConnection(true)
            .setAllowSslConnectionPool(true)
            .addRequestFilter(new ThrottleRequestFilter(10))
            .setMaximumConnectionsPerHost(20)
            //.setMaximumConnectionsTotal(20)
            .setRequestTimeoutInMs(100000)
            .build();
    this.client = new AsyncHttpClient(new NettyAsyncHttpProvider(config));

(Обратите внимание, что максимальное количество подключений закомментировано из-за какой-то странной ошибки при использовании ThrottleRequestFilter, см. здесь https://groups.google.com/forum/?fromgroups=#!topic/asynchttpclient/nEnQnPtCP2g)

Теперь вот некоторый тестовый код,

FileInputStream fstream = new FileInputStream("import.txt");
DataInputStream dstream = new DataInputStream(fstream);
BufferedReader reader = new BufferedReader(new InputStreamReader(dstream));
while ((line = reader.readLine()) != null) {
//Some code to build and create a request using the build function and then perform a GET operation. Request is built using Java's Future object from java.concurrent
}

Если файл import.txt содержит менее 100 строк простого текста, такого как этот

 196    242 3   881250949

Все работает нормально, все запросы проходят и при проверке ответов все нормально. Все, что больше 100, и я начинаю получать тайм-ауты, а в случаях, например, 1000+, я фактически начинаю сталкиваться с ошибками памяти permGen.

Я думал, что ThrottleRequestFilter должен ограничивать максимальное количество потоков до 10 и обрабатывать только 10 за раз. Почему он вылетает, когда текстовый файл содержит более 100 строк?

Я также пытался переключиться на использование реализации Grizzly, но это также не работает. Я начинаю подозревать, что это либо то, как я написал тестовый код, либо асинхронный HTTP-клиент действительно имеет некоторые проблемы при создании большого количества запросов. Если да, то есть ли другие хорошие асинхронные http-клиенты для java?


person Community    schedule 07.11.2012    source источник


Ответы (1)


Ваша проблема в том, что вы не установили размер буфера перед началом чтения файла. посмотрите на этот пример

private static final int EXT_DEFAULT_BUFFER_SIZE = 1024 * 8;
InputStream   inputStream=this.getClass().getClassLoader().getResourceAsStream("Resource_Name");
public static String copyLargeExt(InputStream input) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[EXT_DEFAULT_BUFFER_SIZE];
        int n = 0;
        while(-1 != (n = input.read(buffer))) {
            baos.write(buffer, 0, n);
        }
        return baos.toString();
    }
person Festus Tamakloe    schedule 07.11.2012
comment
Я думал, что размер буфера инициализируется некоторым значением по умолчанию? Или это не так? - person ; 08.11.2012