Pull to refresh

Comments 24

Wt всё же больше full-stack фреймворк. А так за последние лет 5 появилось много фреймворков для web на C++, что не может не радовать

К сожалению, большинство этих фреймворков требуют boost.asio, из-за чего элегантно встроить http-бэкэнд в уже имеющееся приложение мне не удалось.

Тема корутин не раскрыта. Какую библиотеку используете? Или stackless из C++?

Фреймворк поддерживает встроенные корутины из C++20: -std=c++20 -fcoroutines

А они вообще юзабельные?
Например, если нужно сделать запрос к базе данных, в wiki используется future.get() - блокирующая операция. Она весь сервер подвесит, или там под капотом какая-то магия есть, чтобы остальные запросы продолжили обрабатываться? Плохо представляю, как такое сделать на stackless корутинах.

Если очень простой пример привести:

Task<HttpResponsePtr> getUsersAsync(const HttpRequestPtr &request) {
    auto sql = app().getDbClient();
    auto result = co_await sql->execSqlCoro(
      "SELECT COUNT(*) FROM users;"
    );

    Json::Value jsonBody;
    jsonBody["users_count"] = result[0][0].as<size_t>();
    
    auto response = HttpResponse::newHttpJsonResponse(jsonBody);
    
    co_return response;
}

Под капотом там EventLoop с менеджером пулла потоков. Во внутреннем обработчике запроса используется co_await, но при этом этот обработчик вызывается без каких-либо блокировок

UPD: насчёт использования - вроде работает. Как я писал, фреймворк в продакшн я не видел, а с экспериментальными корутинами тем более

OK, а POCO из pocoproject.org подходит под критерии поиска фремворка в статье? Я вот на нём делаю...

Подходит. Цель статьи была всё же показать, что и на C++ можно легко писать бэкенд. Как я писал выше, сейчас действительно много разных фреймворков есть. Я просто показал один из них

Была у меня мечта - писать backend на C++. А вот разбираться в unix socket'ах, TCP, многопоточной/асинхронной обработке запросов и во многом другом совсем не хотелось.

Простите, а в чем прикол мечты писать бэк на плюсах и не разбираться в сокетах, сетях и прочем?

В том, чтобы не писать очередной велосипед. Я, конечно, не отрицаю, что знание сокетов, протоколов и тд нужны, но делать реализацию стоит только в том случае, когда есть в этом необходимость, например, разного рода оптимизаций, написание своего протокола поверх TCP и тп. А когда стоит вопрос, что нужно просто написать бэкенд, а разработчики в команде знают только плюсы, то почему бы не взять фреймворк, который скрывает всю реализацию, оставляя бизнес-логику на разработчиках

Разбираться =\= реализовывать. Удачи с протекающими абстракциями в дальнейшем

А где применяется бекэнд на C++ ? Мне думается, что это должен быть не самый тривиальный сценарий.

Или просто just4fun ?

Любая сколь нибудь популярная игра

Например, онлайн игры. А вообще в крупных компаниях бывают пишут бэкенд на плюсах. А ответ на вопрос - зачем? Не смогу ответить, наверное, или что-то кастомное (протокол, например), или увеличение перформанса

Главная причина -- интерфейс к развесистым C/C++ библиотекам.

Очень простой и легковесный фреймворк https://github.com/yhirose/cpp-httplib/. Header only.

Но он всё же с block I/O. Drogon предоставляет Thread Pull Manager и в каждом потоке Event Loop для non-block I/O

Зависит от потребностей. Конечно, не выдержит тысячи параллельных запросов, но зато очень просто, например для встроенного REST сервера. И не нужно никаких дополнительных библиотек и головной боли при сборке

Sign up to leave a comment.

Articles