Плюшки BaaS’а?

Стоит наверное начать с небольшого введения, что же такое BaaS и зачем вот это вота все. BaaS (Backend as a Service, как гласит Википедия) отчасти можно назвать очередным баззвордом, но тем не менее небольшая ниша у таких сервисов все же есть. Довольно тяжело сходу въехать, как можно написать полноценное мобильное приложение с аккаунтами, регистрацией, профилями и прочими плюшками, не пользуясь при этом услугами разработчиков серверных приложений (будь то PHP, Python, Ruby, Node.js и так далее и тому подобное). На самом деле BaaS именно для этого и был придуман. То есть, имея свое мобильное приложение, вы можете управлять различными данными с клиентской стороны, все производится через API и (как правило) готовые SDK.

Одним из наиболее популярных (и к тому же, допускающим неплохие лимиты на API-запросы при бесплатном аккаунте) BaaS является Parse.com. Именно об интеграции с ним я буду сегодня говорить.

Динамика в статике, опять?!

Да, мне кажется я о подобном уже говорил. Что-то подобное вы уже слышали, но тем не менее, факт остается фактом. Добавить динамичности статическому контенту можно, благодаря именно BaaS. Что же тут хорошего, почему бы не взять в таком случае нормальный язык и не написать на нем адекватный бэкенд, спросите вы. Ответ у меня будет довольно простой: скорость работы статического сайта даже на сервере за $5 в месяц (в том же DigitalOcean) будет очень и очень хорошей. Иными словами, это все обусловлено развитием облачных сервисов, предоставляющих VPS буквально за копейки. В итоге BaaS дает нам возможность иметь неплохой информационный сайт с минимальными денежными затратами на содержание. По-моему, это довольно круто и стоит того, чтобы повозиться и разобраться с этим.

Особо пытливые умы в этом месте уже смекнут, что если в этом подходе все задачи ложатся на плечи клиентской стороны, то это будет не так уж и безопасно. Ну то есть, никто не помешает злоумышленнику стащить у вас API-ключ и подпортить вам жизнь. Это вполне реально, если данные не привязаны к аккаунту, будь то количество просмотров или лайки. Против такого Parse.com может противопоставить хранимые на их сервере функции (хотя это уже попахивает тем же полноценным бэкендом), испортить данные с помощью которых будет несколько сложнее. В общем, все это не супер-надежно при некоторых сценариях взаимодействия, это правда. И если вам нужно действительно что-то серьезное, BaaS я бы вам рекомендовать не стал. По крайней мере тот, который существует на нынешнем этапе развития технологий.

Пробуем, интегрируемся, ловим грабли

В роли подопытного кролика я выбрал проект Space is Mine, который не так давно перешел на статику. В качестве динамики я реализовал там счетчик просмотров на страницах статей. Вообще, с Parse.com все оказалось довольно просто и сложно одновременно. Я добавил себе инициализационную строчку в проект, написал сохранение объекта и встрял. Дело в том, что само собой мне хотелось бы иметь upsert, как это сделано, например, в MongoDB, с атомарным инкрементом. Проблема была в том, что в Parse.com не предусмотрена поддержка upsert. Это нонсенс! Бэкенд-сервис, который по сути-то должен экономить количество запросов, насколько это возможно (так как расположен довольно далеко от клиента), не позволяет делать upsert. Ну что ж, ладно, терпим.

На самом деле, в этот момент я задумался, поглядел вокруг повнимательнее, но так понял, что Parse.com – пожалуй, лучшее, что можно найти в этом сегменте (вспоминаем особую лояльность к бесплатным аккаунтам). Делать было нечего, пришлось немного разветвить и написать немного больше кода:

var ArticleObject = Parse.Object.extend("Article");
var path = '{{ this.path }}';
var query = new Parse.Query(ArticleObject);
query.equalTo('code', path).first().then(function(object) {
    if (!object) {
        var articleObject = new ArticleObject();
        articleObject.save({code: path, viewsAmount: 1});
    } else {
        object.increment('viewsAmount', 1);
        object.save();
    }
});

Здесь path – полный путь до страницы, то есть что-то вроде своеобразного id. Тем не менее, согласитесь, кода было добавлено совсем не много, и это здорово!

На деле браузеру потребуется сделать два запроса, один на получение записи, второй – на добавление/обновление. Ах да, передать свой собственный id в Parse.com для сохранения новой записи нельзя. Поэтому даже такой хак не прошел. Тем не менее, как показала практика, эти два запроса выполняются довольно быстро и на клиентской стороне все выглядит довольно таки неплохо.

Итак, что мы имеем. Сайт, способный выдавать порядка 120 rps на железе за $10, подсчет просмотров и вообще все очень вкусно. При этом не стоит забывать, что подсчет просмотров – это самый банальный сценарий применения, само собой, можно сделать что-то и посложнее.

Ссылки

Пожалуй, доброй традицией будет приложить несколько ссылок для читателей, которые хотели бы посмотреть на эту тему поподробнее.

  1. Быстрый старт на Parse.com
  2. Подробная JavaScript API документация Parse.com
  3. Довольно свежая статья о выборе правильного BaaS