recoder: (Default)
recoder ([personal profile] recoder) wrote2013-03-04 07:33 am
Entry tags:

C++ Web Service - Progress Report

Коллеги интересуются, что в конце концов случилось с идеей написания веб-сервиса на плюсах. Спрашивали - отвечаем!

Those who don't understand Ruby-on-Rails are condemned to reinvent it, poorly.
© recoder
Как примерно говорил один авторитетный художник, сделать при желании можно всё что угодно, главное - понимать зачем. Передо мной стояла конкретная задача - сделать Web API к сложной существующей системе, написанной на C++. Также исходными условиями были поддержка XML и JSON в качестве интерфейсных форматов и использование только языков уже используемых в системе: C/С++, PHP, Perl.

Мараться об PHP не хотелось совсем. Было очень соблазнительно попробовать в деле возрождающийся Perl, но при всей своей юношеской любви к нему, сильной уверенности в его перспективах у меня не нашлось. Оставался старый добрый C++, которого я не брал в руки с конца 90-х годов.

Первичный анализ показал, что нету хорошей С++ библиотеки, которую бы можно было легко вписать между старой C++ системой и Apache (и тов. Стауструп подтвердил мои опасения). То что я находил было или полными серверами или фреймворками для посторения веб-UI, или просто поделками на коленке. Пришлось садиться за свой дизайнерский блокнот.

Оказалось, что с достаточным опытом написать такую систему - несложно. Освежив в памяти воспоминания о Java и Ruby системах, быстро набросал первый вариант. Получились: middleware для привязки к серверу, routing для обработки URLов, controllers для обработки собственно запросов, и models для собственно интеграции с большой системой. Для эксперимента были написаны несколько middleware адаптеров: для работы из-под существующего PHP UI, и как модуль к Apache. Всё заработало практически сразу.

Следующей задачей была одновременная поддержка XML и JSON. Поддерживать одновременно два API очень не хотелось, да и написание нескольких парсеров на каждый контроллер тоже не радовало. Изучение гугловского опыта навело нас на мысль адаптировать идею Protocol Buffers вместе с их XML/JSON расширениями. Разработали свой вариант языка описания сообщений, который транслируется в C++ реализацию форматов сообщений вместе с функциями сериализации-десериализации. Может быть, стоило взять и допилить гугловский проект, но побоялись проблем интеграции. Главное что всё заработало!

Что же это за C++ проект без темплейтов и исключений? Так подумали мы и решили использовать C++ на полную катушку, на сколько позволит текущий компилятор GCC. И совершенно неожиданно уткнулись в баг компилятора (кажется с раскручиванием стека при пролёте исключения между модулями). Я уже было собрался смахнуть слезу и выкинуть эксепшны на свалку истории, как коллеги-волшебники изобрели способ обхитрить linker и loader и шоу продолжилось!

Ещё сильно удивило печальное положение с ORM в области C++. Я уже не мечтаю о магии ActiveRecord, мне просто хотелось бы чего-то, что можно было бы ввернуть между существующей прослойкой над Postgres и своим уровнем models. Честно говоря, меня бы даже устроил просто удобный конструктор SQL-запросов, а разобрать result set на объекты - уже не так сложно. Увы, ничего подходящего не нашёл, так и гоняю SELECTы вручную...

В итоге, все грабли были обойдены или растоптаны, проект был доведён до релиза, продаётся и даже местами используется. Активно пишется следующая версия API на той же базе. Так что можно сказать достигнут "happy end", а точнее "happy milestone".

Резюмируя, скажу что для человека с интеллектом ничего невозможного нет. И своим результатом я вполне могу гордиться. Однако всё это время где-то глубоко в душе было ощущение бега по таёжной чаще параллельно широкой автотрассе...

coding

[personal profile] alll 2013-03-04 01:45 pm (UTC)(link)
> глубоко в душе было ощущение бега по таёжной чаще параллельно широкой автотрассе...

Так может выкатить наработки в опенсорс? :)
Edited 2013-03-04 13:45 (UTC)

[identity profile] mpak666.livejournal.com 2013-03-04 03:33 pm (UTC)(link)
п.3 решил сразу возникший у меня вопрос: "а зачем"? :)

[personal profile] alll 2013-03-04 06:07 pm (UTC)(link)
- Зачем цыплёнок переходит через дорогу? - Чтобы оказаться на той стороне. ;)

[identity profile] mpak666.livejournal.com 2013-03-04 06:45 pm (UTC)(link)
:)) тонко

[personal profile] alll 2013-03-04 06:05 pm (UTC)(link)
1-2. Настоящих буйных мало - вот и нету вожаков. ;)
3. Вот так и сидят все по своим углам. :) В мире миллиарды людей, что понадобилось одному - с заметной вероятностью понадобится ещё кому-то. Впрочем, изобретение велосипедов - любимое занятие cpp-программеров, так что возможно они не очень страдают. :)
(deleted comment)

[identity profile] larubin.livejournal.com 2013-03-05 04:58 pm (UTC)(link)
Ну что, молодец(-цы). Взял(-и) и запилил(-и), не бросил(-и) на полпути. Респект!

[identity profile] akssi.livejournal.com 2013-03-06 02:46 pm (UTC)(link)
C#, ASP.NET 4.0+, js, jQuery, extJS, SignalR, WCF... Каждый рабочий день.