Как стать автором
Обновить

Комментарии 52

А почему именно conan? Ведь при написании Dockerfile уже взаимодействуешь с пакетным менеджером (apt/yum). В крайнем случае (в репозитории нет нужной версии) можно заиспользовать ExternalProject.
Возможные аргументы за Conan:
— кроссплатформенность: это будет работать в разных дистрибутивах Linux, и вообще не только в Linux
— проще фиксировать версию либы, она сама не обновится
— можно собирать либы со своими нужными флагами
— в Сonan central registry могут быть либы, которых нет в официальных репозиториях (хотя может быть и наоборот)
— Conan вполне удобен и без докера, тогда как управлять зависимости без докерфайла ручными установками нужных пакетов довольно неудобно

Именно из-за кроссплатформенности. Тк сижу на Mac OS, но хотелось чтоб работало и под Linux.

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

Интересная логика, без причин завязались на не особо популярный пакетный менеджер и выбирали инструмент по принципу — чего бы нашлось…

Из-за кроссплатформенности conan. Если есть другие идеи и решения — я только за. Если расскажете.

vcpkg очень неплох

Тоже можно везде запускать и он сам разрешает зависимости?

Именно так он и работает

Vcpkg не работает на CentOS7 из коробки.

А чем он лучше?
Это который даже версию пакета лочить не умеет, да? :) Очень неплохой пакетник, да
Это больше про критерий выбора фреймворка. Conan не настолько популярен, и многие либы там отсутствуют. Вы бы могли отбранчить poco и положить к себе в конан нужную сборку, все в общем так делают.
Я попробовал написать разработчикам) Еще посмотрел как добавить нужную мне либу в конан. Будет время запилю им пул-реквест.

Так что жюри сказало?

Жюри не смотрели на сервис на плюсах, мы тогда написали все на питоне. Сказали: ну вы и молодцы.

Я тебя слепил из того, что было.
Микросервисом и rest как-то не пахнет.

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

Хорошо, я могу ошибаться, но я не вижу здесь ни одного принципа REST, также не вижу чего-то удобного для дальнейшего использования( архитектура, роутер, взаимодействие с бд, орм).
Что я вижу: собранный на коленке из всего подряд hello world, который даже свой «hello world» отдает не правильно.
Error: Parse error on line 1:
{	hello: heh}
--^
Expecting 'STRING', '}', got 'undefined'

Если задача состоит в rest api на poco, то первых двух ответ в гугле по запросу «poco rest api» хватит, чтобы ее решить.
Это правда, пока разбирался с конаном и докером, забыл поправить hello. Спасибо, что заметили) Задача состояла в создании шаблона, с уже настроенным окружением, чтобы на хакатоне или для домашнего проекта просто сделать docker-compose up.
Conan штука хорошая, но его нужно уметь готовить и с наскоку врятли получится что-то хорошее. Как минимум часть пакетов нужно брать из репозитория bincrafters и иметь в виду, что они с некоторой небольшой вероятностью несостыкуются с пакетами из conan-index-center. Мы у себя активно используем conan, хотя, конечно, не всегда пишем универсальные пакеты, которые будут работать везде, зачастую его можно использовать просто для того, что бы распространять бинари.

А по части микросервисов на C++ — нет не выдумка, но больно и дорого, в итоге нужно и доступно далеко не всем. Какой-нибудь требовательный микросервис или, скажем какой-нибудь WebRTC relay, писать на нём вполне можно. Для чего-то более общего, как мне кажется, нет подходящих библиотек или даже вернее будет сказать фреймворков, которые бы скрывали сложность от конечного разработчика.

Я помню в конце 90-х пытался на C и C++ писать веб-серверы или CGI. Практически всё для HTTP приходилось писать с нуля или копипастить из других проектов. Из вашего комментария можно сделать вывод, что за 20+ лет ничего не изменилось :(

К сожалению, в 2000-2010 но очень медленно развивался, но сейчас пошло пободрее.

Микросервисы (как и просто сервисы), конечно, пишутся и на C++. Я пишу, например. Но нужно понимать — зачем. Я разрабатываю рекламные платформы, нагрузка — сотни тысяч запросов в секунду, поэтому C++ позволяет получать больше производительности с одной ноды.
Думаю, что если требований к нагрузке особых нет, то и разрабатывать что то на плюсах особо не интересно. Есть куча языков с готовыми библиотеками, где многие вещи делаются в пару строк.

То есть у вас такие сервисы, которые ни вовне не обращаются, ни запросы в БД не делают? Иначе все вот эти оптимизации практически сходят на нет.

К БД обращаются. Но БД нужны специальные, рассчитанные на такие нагрузки. NoSQL в основном. Aerospike например. Кластер из 8 нод легко переживает 0.5 — 1 миллион запросов в секунду. Но там уже все в сетку и ssd упирается.
Реляционные БД используются тоже, но к ним не обращаются на каждый запрос. Только к кэшированные данным. Ну а запись в них только пакетная.
И само собой, чем больше локально кэшированных данных, тем лучше.
К внешним сервисам тоже обращаюсь. Но они должны уметь отвечать за десятки миллисекунд. Иначе, делаем очередь и уже из неё вызываем медленные сервисы.

И знаете, что я узнал? Она есть в POCO! Но conan не знает, что она есть в POCO и не умеет ее билдить

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

Ох, этим всегда заканчиваются попытки заюзать пакетный менеджер из плюсов. Я уже давно перестал пытаться. Подключить либу по документации (или инструкции со стековерфлов) — это чёткие 15-20 минут и она станет, как влитая. Заюзать пакетный менеджер — от 15 секунд до 4 часов (плюс всегда захватывающий вариант «невозможно в принципе»).
Так хуже ведь не станет всё равно :) Просто теперь алгоритм немного поменялся:
1) Выбрали библиотеку
2) Проверили, есть ли в Conan
3) Если есть, то за 15 секунд подключили
4) Если за 15 секунд не справились — плюнули и подключили по старинке.

Времени дольше не заняло, а шанс того, что сэкономите время заметно увеличивается. И чем дальше, тем больше либ появляются в Conan и исправляются рецепты.

Я вот тут как раз в своём pet project пишу C++ микросервисы на основе gRPC. Увы, в штатном конане его нет.
В результате, я написал велосипед на cmake, который по минимально описанному конфигу умеет скачивать и собирать сторонние библиотеки через ExternalProject_Add. И никаких питонов.
Если дойдут руки до документации, выложу в open source. Пока там, к примеру, даже не пахнет поддержкой винды для некоторых сочетаний компиляторов / платформ. Ну и собрать OpenSSL под винду с помощью mingw без Cygwin — тот ещё квест.

Таких велосипедов много, по ощущениям раз в несколько месяцев что-то подобное появляется на реддите.

Вы намного больше бы помогли сообществу, если бы написали рецепт для gRPC в conan.

Увы, пока нет такой цели. И питон я не знаю.
Я когда-то писал сборку C++ SDK под все платформы для google agones (куда входит gRPC), намучился и по факту завелосипедили многое. Пока недостаточно энтузиазма, чтобы повторять :)

A POCO действительно хороший выбор для реально нагруженного сервера?

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

Мне показалось, что POCO не самый лаконичный в плане выразительности вариант. А какие еще альтернативы вы смотрели и почему отказались от них в пользу POCO?

Я не смотрел другие варианты. Знаю, что есть sdk от Microsoft (как по мне довольно трудночитаемый код получается), а потом нашел гайд для Poco и мне показалось, что его будет достаточно для моих задач. Код основы достаточно прост, и его легко будет модифицировать. Кроме того, я не ставил перед собой задачу найти наиболее оптимальный sdk, я хотел лишь создать шаблон, с помощью которого легко и быстро можно создать свой микросервис и подключить его. Я не работаю в кровавом ентерпрайзе и не уверен, что плюсы для него пригодны.

Жаль, я думал, что вы провели поиск и сможете рассказать о причинах, которые оттолкнули вас от других вариантов. Такая информация мне лично была бы очень полезна.

Если писать hello world, может стоило взять что нибудь header-only, чтобы не заморачиваться с зависимостями и пакетником? Типа crow?
Типа crow?

Он же мертв.

Не уследил, но никто не гарантирует, что либы, выбранные автором, не постигнет такая же судьба

Так и есть. Но экспериментировать сейчас, имхо, имеет смысл на том, что сейчас еще живо (ну или подает признаки жизни).


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

проще говоря, струсил
я бы назвал это осторожностью

Ну вот кстати кажется мне, что в случае плюсов вероятность случайно сделать UB очень уж пугает и очень маловероятно, что она стоит улучшения перфоманса, которое еще и никто не гарантирует. Ведь если задача io bound, то весь прирост от плюсов будет сьеден ожиданиями.
К тому же на плюсах сложно писать асинхронный код.

Это все понятно) Поэтому мы и пишем сервисы на питоне с его FastApi. Тут скорее был интерес: а можно ли, насколько удобно, а есть ли пакетный менеджер нормальный, а как запихнуть все это в докер.

Интересно, как живут тысячи компаний, у которых софт на плюсах?

Ну, вот я пишу сейчас под IAR и ни с какими менеджерами пакетов и с докером не сталкивался на работе.

Да нормально живут. У нас внутренний репозиторий для самособранных библиотек. Стандартный apt-get install bla-bla. Ну и немного кастомных cmake для их подключения.
Ужасы подключения библиотек сильно преувеличены. В основном, все проблемы огребает тот спец, который разбирается с новой либой (или апдейтит существующую). Остальные просто устанавливают и пользуются.
Докер — тоже не вижу сложностей. С появлением multistage сборок — докером стало очень удобно пользоваться для сборки

Пишутся сервисы на С++ нормально.
К тому же на плюсах сложно писать асинхронный код.

Если stackful — Boost.Coroutine2 и вперёд. Если stackless — то C++20 с корутинами + cppcoro и вперёд (но я бы лично сейчас так не делал).
Нужна асинхронная либа для http-сервера — restinio.
К сожалению, stackfull из буста это дикий набор низкоуровневых хаков, которые, видимо, не все компиляторы даже адекватно обрабатывают.

Например, пытался юзать в msvc — ловил прикольные эффекты с goto в catch блок без исключения.
Или цикл while (true) с вызовами async_write/async_read (из буста) выходил после первой итерации — помогала запись bool dummy = true;
while (dummy).

Вобщем, все надежды на с++20, верим и ждём. Пока писать асинхронный код действительно тяжело (или по крайней мере неудобно) по сравнению с другими языками.
НЛО прилетело и опубликовало эту надпись здесь
написать высоконагруженный сервис

Что-то не заметил ничего, что бы отражало эту высоконагруженность, если честно.
Неужели POKO настолько хорош, что сам всё сделает? ;)

Так это я писал про хакатон, где мы писали на питоне:)

Есть такой проект github.com/oatpp/oatpp для создания микросервисов на С++. Смотрится хорошо, особенно по бенчмаркам.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории