ReCoder (recoder) wrote,
ReCoder
recoder

  • Mood:

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

Tags: coding
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 11 comments