время ожидания запросов async-http-client с NettyAsyncHttpProvider

Я использую async-http-client, но у меня проблемы с NettyAsyncHttpProvider.

Это дает это предупреждение:

Oct 28, 2014 12:50:16 PM org.jboss.netty.channel.socket.nio.AbstractNioWorkerPool
WARNING: Failed to get all worker threads ready within 10 second(s). Make sure to specify the executor which has more threads than the requested workerCount. If unsure, use Executors.newCachedThreadPool().

Моя проблема здесь в том, что даже если я использую Executors.newCachedThreadPool(), следующая проблема сохранится.

Как только количество потоков достигает corePoolSize, запросы отбрасываются. Какие бы requestTimeoutInMs или другие варианты я ни пробовал, возвращается только часть ответов, а потоки в пуле останавливаются.

ExecutorService executor = new CustomThreadPoolExecutor(2, 2, 60,
            TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new ThreadFactory() {
        @Override
        public Thread newThread(Runnable r) {
            int number = threadCreationCount.incrementAndGet();
            LOG.info("newThread - {} ", number);

            Thread th = new Thread(r);
            th.setName("AsyncHttpClient-" + number);
            LOG.info("thread ={}", th);
            return th;
        }
    });

    AsyncHttpClientConfig.Builder builder = new AsyncHttpClientConfig.Builder();
    builder.setMaximumConnectionsTotal(-1)
            .setMaximumConnectionsPerHost(-1)
            .setConnectionTimeoutInMs(1000)
            .setIdleConnectionInPoolTimeoutInMs(60000)
            .setIdleConnectionTimeoutInMs(60000)
            .setRequestTimeoutInMs(3000)
            .setFollowRedirects(true)
            .setMaximumNumberOfRedirects(5)
            .setAllowPoolingConnection(true)
            .setIOThreadMultiplier(4)
            .build();

    builder.setExecutorService(executor);

    AsyncHttpClientConfig config = builder.build();
    AsyncHttpClient client = new AsyncHttpClient(new NettyAsyncHttpProvider(config), config);

    //Spin up 500 async requests to google.com
    for (int i = 1; i <= 500; i++) {
        LOG.info("i = {}", i);
        ListenableFuture<Response> future = client.prepareGet("http://www.google.com").execute(
                new AsyncCompletionHandler<Response>() {
                    @Override public Response onCompleted(Response response) throws Exception {
                        LOG.info("Response = {}, count = {}", response.getStatusCode(),
                                responseCount.incrementAndGet());
                        return response;
                    }

                    @Override
                    public void onThrowable(Throwable t) {
                        LOG.error("on throwable ={}", t);
                    }

                });
    }

Теперь, если я перейду с NettyAsyncHttpProvider на ApacheAsyncHttpProvider, все запросы будут выполнены.

Я создал пример проекта на github, чтобы продемонстрировать проблему. https://github.com/tinnou/async-http-client-debugging.git


person Tinou    schedule 28.10.2014    source источник


Ответы (2)


У меня возникла такая же проблема при использовании службы исполнителя по умолчанию. Я не отлаживал, почему, но используя эту конфигурацию ниже, я не получил 10-секундную задержку и предупреждающее сообщение.

AsyncHttpClientConfig.Builder builder = new AsyncHttpClientConfig.Builder();
    builder.setConnectTimeout(3000)
            .setExecutorService(new ThreadPoolExecutor(0, 20,
                    60L, TimeUnit.SECONDS,
                    new SynchronousQueue<>()))
            .setRequestTimeout(3000)
            .setReadTimeout(3000)
            .build();
person Alper Akture    schedule 16.12.2015

Это не проблема с потоками. Здесь есть 2 вещи:

  • вы отправляете огромное количество запросов одновременно, без какого-либо обратного давления, поэтому вы пытаетесь открыть 500 одновременных подключений одновременно. Вам лучше иметь очередь и выделенного исполнителя перед AHC, чтобы вы могли ограничивать и контролировать количество одновременных летающих запросов.
  • вы забиваете google.com. Конечно, они не позволяют вам это сделать и блокируют ваши попытки подключения.

PS: вы бы получили ответ быстрее, если бы вместо этого спросили в группе AHC google.

person Stephane Landelle    schedule 06.01.2016