Динамика в статике, Parse.com и актуальность BaaS
Плюшки 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, подсчет просмотров и вообще все очень вкусно. При этом не стоит забывать, что подсчет просмотров – это самый банальный сценарий применения, само собой, можно сделать что-то и посложнее.
Ссылки
Пожалуй, доброй традицией будет приложить несколько ссылок для читателей, которые хотели бы посмотреть на эту тему поподробнее.