Я создал серверный серверный сервер, следуя примерам 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
.
Вот архитектура моей системы.
Основной поток запускает цикл 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
?