LINUX.ORG.RU

Web-разработка на C

 , , , ,


1

5

99% веб-сервисов я пишу на Go, поскольку для этого он очень удобен, особенно вместе с https://www.gorillatoolkit.org/. Сейчас с целью эксперимента и повышения навыка в C хочу сделать небольшой сервис (выйдет около 500-1000 строк). Изучил как люди делают и, кажется, все делают совершенно по-разному. Кто-то использует socket’ы напрямую, кто-то работает через либы с http, кто-то через fastCGI, кто-то вообще делает приложение как модуль для nginx’а.

Поделитесь опытом и библиотеками, которые используете в работе. В идеале хотелось бы получить список либ для http сервера, роутинга, темплейтов

C почти не используется для написания серьёзных уеб-приложений, но по-моему самым логичным тут будет интегрировать fastcgi/nginx чтобы не встраивать сервер - там вся эта инфраструктура уже продумана. Реально C исторически используется с классическим cgi, но это неэффективно т.к требует создавать по процессу на запрос.

mittorn ★★★★★ ()
Ответ на: комментарий от beastie

Мой аргумент «за» сводится только к одному пункту: mux с его приятным роутингом. Можно за несколько строк получить нужную информацию о пути запроса и направить его в обработку в соответствии функции. Какие твои аргументы против? Может есть что-то лучше. Что используешь сам для таких целей?

brualan ()
Последнее исправление: brualan (всего исправлений: 1)

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

Iron_Bug ★★★★ ()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

Про скилы обидно( Уже несколько лет пишу на C утилиты для обработки данных (50+ GB). Тащу C в backend, во многом что бы можно было удобно работать с данными приходящими из сети

brualan ()
Ответ на: комментарий от brualan

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

AUX ★★★ ()
Ответ на: комментарий от gedisdone

Я тяну C в веб, что бы можно использовать инструменты анализа данных, которые написаны на C (по большей частью мною же). Изначально выбор в пользу C был сделан из-за тонкого контроля, который он даёт над машиной, по сравнению с другими высокоуровневыми языками. Отсюда мы получаем: высокую скорость работы (10с на С вместо 46 на Go), минимальное потребление памяти (12Гб С против 16 у Go). Если коротко, то ничего быстрее С нету (если знать, что делаешь)

brualan ()
Ответ на: комментарий от brualan

зачем тогда го и разговоры про 500-1000 строк. со скиллами го не нужен, а понимание того, что на 1000 строк только хэлловорлд можно накатать должно уже прийти.

Iron_Bug ★★★★ ()
Ответ на: комментарий от Iron_Bug

со скиллами го не нужен

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

PerfectReactor ()
Ответ на: комментарий от Harald

Столько сайтов и веб-приложений на Си. И всем так нужны 4ГБ, что готовы оплачивать гораздо более длительную и дорогую разработку, что аж Го не нужен.

anonymous ()
Ответ на: комментарий от Harald

кстати, да. копроративная поделка гугла же. только у них где-то и используется. но не на основных сервисах, а для скриптятины. а основные тяжёлые приложения они на С/C++ пилят.

Iron_Bug ★★★★ ()
Ответ на: комментарий от PerfectReactor

Похоже, что ты плохо себе представляешь, что у Гугла является основными тяжелыми приложениями.

Я просто фантазит называю фантазиями. Тебе нравиться витать в облаках, а мне спускать тебя на землю. Взаимная выгода.

anonymous ()
Ответ на: комментарий от anonymous

нет. не в моих фантазиях. они работу предлагают. вообще, крупные компании часто ищут программистов на C/C++. там есть где применить и оптимизацию, и скорость. а все эти поделия домашние - это фигня. как мелкософт свой софт не пишет на шарпе, предоставляя это сомнительное удовольствие юзерам, так и гуглу на рабочих серверах го никуда не упёрся.

Iron_Bug ★★★★ ()
Ответ на: комментарий от AUX

Бро, вот я не понимаю, почему тебе всю ресурсозатратную хрень не написать на си и дёргать из Go или пистона?

Или использовать сишный код как CGI-приложение на каком-то отдельном запросе. В таком случае вся вебня из сишной части уйдет, останется всего-лишь прочитать параметры запроса из переменных окружения и в конце распечатать ответ в виде, например, JSON

annulen ★★★★★ ()
Ответ на: комментарий от Iron_Bug

С был и есть компилятор компиляторов - при этом оказалось часто люди пишущие напрямую на вход компилятору компиляторов дешевле чем посредством языка транслируемого компилятором компиляторов

гошкой в гугле вполне пользуются при этом осознают когда есть польза и интерес переписывать ручками горячие го-куски в ацкую сишку.

qulinxao3 ()
Ответ на: комментарий от brualan

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

Это веб-сервис для интернета или внутреннего пользования? [*] Если первое, то преполагается ли частое обращение к сишному коду в нормальных условиях эксплуатации (т.е. настроено кэширование на веб-серевере, нет ддоса, и т.д.)

[*] Если это какая-то админка интернет-сервиса, количество пользователей которой не измеряется тысячами, то это скорее второе, чем первое

annulen ★★★★★ ()
Последнее исправление: annulen (всего исправлений: 1)

кто-то вообще делает приложение как модуль для nginx’а

Про это сразу забудь

темплейтов

Из сишки надо вернуть структурированные данные (в большинстве случаев уместен JSON), а шаблонизированием пусть занимается js-фронетенд, или на худой конец скриптовый или гошный бэкэнд

Сишная шаблонизация уместна только в условиях жестокого хайлоуда, или ради понтов на миллисекундах

annulen ★★★★★ ()

Прогнали тесты Nginx+c(fastcgi) vs nginx+go(http)

Потребление памяти в пике получалось командой grep VmPeak /proc/$PID/status Потребление CPU в пике получалось обработкой вывода top -n 5000 -b

Простой ответ в text/plain «Hello world!» при 10 000 rps в течении 10 минут. Обе программы стоять за nginx’ом. Nginx везде потреблял в пределах погрешности, поэтому его не привожу

Go:
CPU в пике: 2.1%
Память в пике 547324 kB

С:
CPU в пике: 0.1%
Память в пике: 8784 kB

Обработка двух тестовых файлов с данными на 10GB и 12GB.

  • Текущая конфигурация: данные -> nginx -> go (приём http, предварительная обработка и вызов C’ших функций) -> C

  • Новая конфигурация: данные -> nginx -> C (fastcgi)

Текущая:
CPU в пике: 83.1%
Память в пике 36GB
Время обработки: 3:21
IO утилизация: 81.3%

Новая:
CPU в пике: 61.2%
Память в пике: 31GB
Время обработки: 2:49
IO утилизация: 94.6%

И приятная мелочь

du -sh hello/c.bin hello/go.bin real/c.bin real/go.bin real/c-go-helper.bin
12K      hello/c.bin
7,1M     hello/go.bin
41K      real/c.bin
25,1M    real/go.bin
35K      real/c-go-helper.bin
brualan ()