C++ Web Service - Progress Report
Mar. 4th, 2013 07:33 amКоллеги интересуются, что в конце концов случилось с идеей написания веб-сервиса на плюсах. Спрашивали - отвечаем!
© recoder
Мараться об 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".
Резюмируя, скажу что для человека с интеллектом ничего невозможного нет. И своим результатом я вполне могу гордиться. Однако всё это время где-то глубоко в душе было ощущение бега по таёжной чаще параллельно широкой автотрассе...