LINUX.ORG.RU

C REST Server

 , ,


0

4

На чем сейчас модно делать высокопроизводительные REST сервера для C? раньше делал в виде модуля для NGINX.

UPD: Для слепеньких - язык програмиирования уже выбран - и это С.

Но зачем ? Есть же Golang на батарейках :)

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

Голанг это по хипстерски. нет в нем апи к нужной базе - TimesTen

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

Вроде бы были хорошие отзывы от Mongoose и civetweb (это ответвление от Mongoose, сделанное до того, как Mongoose полностью перешел на коммерческие рельсы). Но, правда, это не столько про высокую производительность, сколько про простое встраивание в свое приложение без лишних накладных расходов.

Можно посмотреть на TechEmpower benchmark, там были какие-то plain C-шные библиотеки в ТОП-ах.

eao197 ★★★★★ ()

Есть же каноничный gnu-шный libmicrohttpd. Двойная лицензия позволяет не открывать исходники

makoven ★★★★★ ()

Напиши уже свои сниппеты, да пользуйся.

Я когда-то писал сишные CGI-обработчики, сейчас как-то отошел от CGI в сторону вебсокетов. Но веб-морду таки через nginx или апач отдаю, потому как все равно какой-нибудь веб-сервер везде запущен, и запустить на 80-м порту что-то еще не выйдет.

anonymous ()

Чтобы весело работало желательно чтобы epoll был под капотом, отсюда можно натравить много thread-ов на какой-нибудь асинхронный event-loop с поддержкой epoll (e.g. libuv, libev, libevent) и использовать парсер/композитор HTTP-сообщений (e.g. http-parser).

illy ()

Спрашивает, что сейчас модно

Клеймит все модное словом «хипстерство»

vromanov

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

На С писать веб - это не кошерно. Кошерно на D и Go, скоро ещё Swift подтянется с веб-фреймверками, но они там че-то много рамы жрут; на крайняк Java, она ваще раму выжирает только в путь. На си имеет смысл тракаться только с libuv/libevent и аналогами, но это то ещё байто..любовь.

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

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

На си имеет смысл тракаться только с libuv/libevent и аналогами

Нет, черезжопно. Удобней с потоками работать и обычным select'ом.

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

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

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

Я говорю о полезных вещах, а не никчемных игрушках вроде пейсбука, фконтактега или прочих твиттеров. Да и то, при желании даже для них можно было бы на С разработать серверную часть. Но смысл?

Есть интересные и полезные вещи: обертки для баз данных, веб-морды для железяк, что-нибудь вроде ЖЖшки (где можно заметки для себя и других оставлять). И они таких бешеных мощей не требуют.

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

Отлично пиштется в виде модулей к NGINX. Производительность итд на высоте

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

Понять, что в топике написано про язык С могут не все.

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

Чтобы весело работало желательно чтобы epoll был под капотом, отсюда можно натравить много thread-ов на какой-нибудь асинхронный event-loop с поддержкой epoll (e.g. libuv, libev, libevent) и использовать парсер/композитор HTTP-сообщений (e.g. http-parser).

Тут ещё надо понимать, что вследствие особенностей передающей среды, например, за одну операцию чтения из TCP сокета можно получить как целое HTTP-сообщение, так и произвольный кусок HTTP-сообщения (несколько сообщений могут возникнуть при асинхронном HTTP, но, ведь, могут быть ошибки на «сопряжённой стороне», посему такое тоже может случиться) - надо запилить авто-тесты под все эти кейсы. Ну и при записи не забывать доталкивать «недопереданный» остаток.

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

Это ты так обрадовался новым знаниям, что суешь их в нерелевантный тред?

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

Есть же каноничный gnu-шный libmicrohttpd

каноничное г-но

я еще недавно прошелся по сырцам gnu utils, такой говнокодище.. либо я от си отвык, либо одно из двух

MyTrooName ★★★★★ ()

В целом странный ход мысли «делать рест на Си». Если ссылаться про скорость Си, то сам по себе REST - это тормоз в отношениях клиент-сервер. Сложность для CPU в этих отношениях - парсинг JSON и сам процессинг логики. Процессинг JSON давно в виде биндингов к сишным либам прикручен. Реализовывать логику на Си - отливать в граните логику, которая не должна меняться, иначе можно сдохнуть это поддерживать.

Просто любопытно - зачем такие сложности?

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

Гнушники не умеют писать нормально код, это уже давно известно.

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

Свою реализацию HTTP писать бы не хотелось. Хотя, я ее далал 20 лет назад. Как и FTP.

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

Требование высокой производительности. 20к и больше запросов в секунду. Основная часть приложения а С и соответвенно DAO все равно будет написано на C и покрыто тестами

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

Vibe.d держит «5к и больше запросов в секунду.» на самой дохлой виртуалке с одним ядром. На железе будет тебе под 100к, возьми сам протестируй, если не веришь. Даже на vert.x без проблем можно под 20k выжать на каком-нить мак мини.

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

обычным select'ом

Эх, сейчас бы в 2017 году на select-е затянуть больше 1024 дескрипторов. Откуда только мамонты вроде тебя берутся?

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

Свою реализацию HTTP писать бы не хотелось

Если ты про парсер, то есть два варианта: http_parser, уже упомянутый в треде, и picohttpparser. Оба стабильны и проверены временем.

Можешь попробовать взять libh2o — возможно подойдет для твоих нужд.

kawaii_neko ★★★ ()

высокопроизводительные REST сервера
D и Go

Тогда уж лучше Rust, право.

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

На кой черт? select'у только 1 дескриптор передается — открытого сокета, ждущего подключения. Как только подключился клиент, все это уходит в свой поток.

Что за ересь ты несешь про 1024 дескриптора?

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

В свой поток? Поток на подключение? Запахло джавой

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

На кой черт? select'у только 1 дескриптор передается

Какой нонче безграмотный анонимус пошел. man select

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

Какое, нафиг, подключение? Сразу поток отключенным создаешь, ясен пень!!!

Для десятка клиентов работает. Почему бы и для сотни тысяч не взлетело?

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

Ты сначала подумай, а потом пиши!

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

Голанг это по хипстерски. нет в нем апи к нужной базе - TimesTen
vromanov

Ты так хорошо прикидываешься дебилом, что даже и дебил! :-) Зачем задавать вопрос ответ на который - «на том, что умеет TimesTen» ????

Сжалюсь над ущербным, ткну в оффдоку: 5. What languages can be used to develop Oracle TimesTen applications? Applications can be developed using Java, .NET, C, C++, Pro*C and PL/SQL. ...

Ещё есть вопросы, толстячок? :-D

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

Читать надо уметь. Вопрос был не на каком языке, а на какой либе, сервере итд. Т.к. язык упоминается прямо в вопросе и в тэгах (ты не заметил этого?), то он уже выбран.

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

Опс! Ну значит это _я_ так хорошо прикинулся дебилом, что даже и дебил :-) Извиняй!

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

Лови, болезный:

/* Number of descriptors that can fit in an `fd_set'.  */
#define __FD_SETSIZE		1024
/* The fd_set member is required to be an array of longs.  */
typedef long int __fd_mask;
#define __NFDBITS	(8 * (int) sizeof (__fd_mask))

/* fd_set for select and pselect.  */
typedef struct
  {
    /* XPG4.2 requires this member name.  Otherwise avoid the name
       from the global namespace.  */
#ifdef __USE_XOPEN
    __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS];
# define __FDS_BITS(set) ((set)->fds_bits)
#else
    __fd_mask __fds_bits[__FD_SETSIZE / __NFDBITS];
# define __FDS_BITS(set) ((set)->__fds_bits)
#endif
  } fd_set;

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

С чего ты решил, что я селекту буду 100500 дескрипторов передавать, если у меня только один сокет открыт?

Вдумчиво читай, кода немного.

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

С чего ты решил, что я селекту буду 100500 дескрипторов передавать, если у меня только один сокет открыт?

Боже мой, какой ты необучаемый. FD_SET устанавливает в маске бит с номером, соответствующим значению переданного файлового дескриптора. Если и после этого до тебя не доходит, иди в грузчики или дворники — интеллектуальный труд просто не твое.

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

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

Сфига ли гости понаехали? Откуда там большая цифра возьмется, если этот дескриптор так и останется сам собой после того, как я очередной поток запульну на работу с подключившимся клиентом?

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.