Как я могу контролировать количество параллельных подключений к серверу, используя boost :: asio? - PullRequest
0 голосов
/ 30 января 2020

Я довольно новичок в boost:asio и хочу выполнить большое количество "параллельных" boost::beast::http запросов (веб-сервис), распределяя работу между пулами потоков. Я проверил документацию и выполнил первый тест с использованием асинхронных вызовов.

Я набросал только то, что я делаю, потому что проблема скорее концептуальная, а не кодирование:

    boost::thread_group worker_threads;
    for (int x = 0; x < 1; ++x)
    {
        worker_threads.create_thread(boost::bind(&WorkerThread, io_context_p));
    }

    ...
    ...
    ...

    std::shared_ptr<restservices::RestAsyncSession> session_sp(new restservices::RestAsyncSession(*io_context_p, "127.0.0.1", "8090"));

    auto x = std::bind(&restservices::RestAsyncSession::doRequestAsync,...)
    io_context_p->post(x);
    ...
    ...
    ...

Я думаю, boost::asio - это правильный выбор, и в принципе он работает, как и ожидалось. Но недостатком является то, что адресная служба отдыха может принимать только ограниченное количество соединений (скажем, 200). Поэтому через некоторое время в соединениях отказывают. Поэтому мне нужен какой-то механизм, чтобы отслеживать фактическое количество соединений и разрешать новые запросы только при наличии ресурсов. Использование семафора не кажется хорошей идеей, потому что оно блокирует и, следовательно, противодействует идее boost::asio. Есть ли поддержка пула подключений? Должен ли я использовать keepalive? В настоящий момент я создаю новый сокет и http::request каждый раз - я думаю, что это не правильный путь ...

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

...