Запрос cpprestsdk заблокирован и ответ «Не удалось прочитать строку состояния HTTP» в многопоточной ситуации - PullRequest
1 голос
/ 19 марта 2019

Я создал серверный серверный сервер, следуя примерам CppRestSdk.

Вот пример кода для моей реализации (только раздел отправки запросов).

nf.request(methods::POST, U("/"), requestBody)
    .then([=] (pplx::task<http_response> task)
    {
        LOG_ENTRY;
        // some other work ..
        resp = task.get(); // fails
        http_response resp;
        do {
            try {

                resp = task.get();
            } catch (std::exception& e) {
                higLog("EXCEPTION CAUGHT: %s", e.what());

            }

            // some other checks ..

        }while(0);

       // process resp later ..

    }

где nf - это http_client.

Вот архитектура моей системы.

architecture

thread_pool_call_flow

Основной поток запускает цикл epoll на сервере front-end.Это также создает явное thread-pool.Цикл epoll принимает входящие сообщения со стороны клиента и сохраняет эти сообщения в work_queue (реализовано мной).Один из потоков (размер пула 500) в пуле потоков просыпается и выбирает job из рабочей очереди.Этот поток выполняет обработку сообщения и обращается к back-end серверу, используя объект cpprestsdk http_client.

Для небольшого числа (10 или 15) параллельных потоков на стороне клиента, системаработает отлично.Но когда я увеличиваю количество потоков (например, 50 потоков) на стороне клиента, сервер front-end начинает показывать непредсказуемые ошибки.В основном это долго блокируется в функции task.get ().Иногда он также показывает «Не удалось прочитать строку состояния HTTP» в блоке перехвата.

Я новичок в cpprestsdk.Я не уверен, что происходит на самом деле.Но, по-моему, backlog queue size на сервере back-end мало.Я нашел set_backlog() функцию, но я не могу использовать ее из-за константной ссылки. строка 307 .

В чем может быть причина вышеуказанных ошибок?Это обычное поведение?Это из-за 40 потоков внутри cpprestsdk thread pool?

...