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

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

December 2024

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

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 26th, 2026 07:42 am
Powered by Dreamwidth Studios