recoder: (Default)
[personal profile] recoder

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

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

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

December 2024

S M T W T F S
1234567
891011121314
15161718192021
22232425 262728
293031    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 25th, 2026 02:49 am
Powered by Dreamwidth Studios