PoolingHttpClientConnectionManager - больше потоков, чем соединение - PullRequest
0 голосов
/ 02 августа 2020

На машине выполняется несколько заданий. Для каждой работы я должен звонить во внешнюю службу (плюс выполнять другую работу). Количество вызовов внешней службы для задания заранее неизвестно, или даже когда задание начинается, поскольку обработка задания включает потоковую передачу входных данных.

Перед запуском задания , Мне нужно создать определенное количество потоков для обработки - как часть обработки он вызывает внешнюю службу.

Скажем, служба поддерживает только 100 TPS (транзакций в секунду) и максимум 10 задания могут выполняться на машине, и я не хочу бомбардировать службу.

Проблема состоит в том, чтобы определить количество рабочих потоков, выделяемых для каждого задания . Поскольку в худшем случае одновременно могло выполняться 10 заданий, я мог выделить 10 потоков для каждого задания. Но если бы выполнялось только одно задание с 10 потоками, я бы недостаточно использовал службу.

Думаю, я мог бы использовать PoolingHttpClientConnectionManager для объединения потоков и использования их для доступа к службе. Я мог бы использовать DefaultMaxPerRoute и MaxTotal как 100.

Преимущество: Когда выполняется только одно задание, я могу полностью использовать внешнюю службу.

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

ОБНОВЛЕНИЕ:

Узнал, что клиент, который я буду использовать, не должен иметь таймаут запроса на соединение для проверки / аренды соединения из пула, иначе он выдаст ConnectionPoolTimeoutException.

1 Ответ

0 голосов
/ 24 августа 2020

Я думаю, что PoolingHttpClientConnectionManager только как пул содержит соединения, потому что это только один поток. И поток для подключения к URL-адресу в вашем элементе управления кодом, например:

public String doPost(HttpPost postMethod, ProfilerLog profilerLog, LogBuilder logBuilder)
            throws Exception {
        try {
            // execute thread
            ConnectorThread thread = new ConnectorThread(postMethod, httpClient, "Connector Thread",
                    profilerLog, logBuilder);
            thread.setDaemon(true);
            thread.start();

            // tunnel response
            thread.join();
            return thread.getRespData();
        } catch (Exception ex) {
            LOGGER.error(ex.getMessage(), ex);
            return null;
        } finally {
            shutdown();
        }
    }

ConnectorThread, выполняет целевой URL-адрес.

С уважением.

...