
Трекинг-сервис на Google App Engine
Введение
Эту статью можно рассматривать как продолжение темы на форуме «Бесплатный хостинг для трекинга и сохранений». Хочу сразу предупредить, что на самом деле, реализация трекинг-сервиса на движке Google App Engine это пока просто эксперимент. Сервис не был обкатан в боевых условиях и поэтому никаких гарантий по его использованию в условиях высокой загрузки я дать не могу. Статья будет больше полезна, если рассматиривать её как некий туториал по использованию Google App Engine в связке с платформой Flash.Для чего это нужно?
Самое главное — существующие системы трекинга не совершенны. Вкратце о недостатках:
1. MochiAnalytics:
? В момент обращения к серверу игра подтормаживает.
? Не позволяет просматривать логи в режиме real-time.
? При просмотре своих событий через сайт данные загружаются медленно.
2. GoogleAnalytics:
? Не позволяет просматривать логи в режиме real-time.
? Неудобное представление логов на сайте.
3. Playtomic: говорят, что нестабилен, поэтому даже не трогал.
Трекинг в моем представлении должен:
1. Быть стабильным и быстрым.
2. Предоставлять возможность просмотра логов в real-time.
3. Предоставлять возможность экспорта логов.
И все это позволяет сделать Google App Engine. При этом он бесплатен, а существующие ограничения дают достаточно простора для подобного рода задач.
О Google App Engine
О нем предостаточно информации в сети, в частности очень подробная документация на русском. Но если кому лень читать, вкратце, небольшая сводка по нему:
• Это бесплатный хостинг Google.
• Код пишется на Python, Java или Go. Предпочтительным является Python, т.к. поддерживается давно.
• Все работает в песочнице: например, нельзя писать в файловую систему, вместо этого нужно писать в базу данных.
• База данных особенная: данные не нормализованы, таблицы с колонками создаются автоматически, язык запросов (GQL), хотя и похож на SQL, но имеет свои особенности. Основные недостатки: выборка (select) ограничена 1000 записями, нет понятия JOIN, нет count(*)
• Код может работать только в ответ на запрос, никакого бэкграунда.
• Квоты на трафик — 1Gb в день и 6.5 машинных часов в день.
• Квота на размер БД — 1Gb.
Подготовка
1. Регистрируем Google App Engine (попросят подтверждения номера телефона через СМС).
2. Создаем приложение (кнопка «Create Application»), задаем униальное имя. Потом ваше приложение будет доступно по адресу: http://<имя приложения>.appspot.com/.
3. Устанавливаем Python 2.5 (10Мб)
4. Устанавливаем Google App Engine SDK (3Мб)
5. Скачиваем сам архив с приложением Google App Engine и распаковываем в удобное место.
6. Теперь нужно подставить свои данные в файлы приложения:
? В файле app.yaml заменяем «myappname» на имя созданного приложения.
? В файле kernel.py заменяем «somekey» на что-нибудь своё — это будет ключ доступа к данным логов (см. ниже)
? В файле update.bat подставляем аккаунт Google.
Собственно, все. Запустив update.bat (Windows only) вас попросят ввести пароль к аккаунту Google, после чего приложение загрузится на хостинг и сразу же станет доступным по адресу http://<имя приложения>.appspot.com/.
API трекинг-сервиса
Сервис подерживает два вида запросов:
• http://<имя приложения>.appspot.com/trace: команда на запись события. Понимает как GET, так и POST запросы. В случае GET-запроса, URL имеет формат http://<имя приложения>.appspot.com/trace?act=<категория события>&lbl=<дополнительная информация>. В случае POST запроса в содержимое запроса следует передавать в полях act (категория события) и lbl (дополнительная информация).
• http://<имя приложения>.appspot.com/query?q=<GQL запрос>&key=<ключ доступа к данным>: команда запроса данных из базы данных. Результат запроса является текстовым файлом со списком всех записей, удовлетворяющим GQL запросу. Ключ доступа к данным (см. п.6 предыдущего раздела) введен из соображений безопасности. Пример: http://<имя приложения>.appspot.com/query
?q=SELECT%20*%20FROM%20Trace%20order%20by%20date%20desc%20limit%2030
&key=somekey Вернет последние 30 событий.
Состав приложения
Приложение состоит из следующих файлов:
• app.yaml: файл с описанием приложения для сервиса Google App Engine. Он содержит наименование и версию приложения, а также список веб-обработчиков и статических файлов.
• crossdomain.xml: файл политики безопасности Flash, без него доступ flash-приложения к сайту будет запрещен.
• index.html: Главная страница приложения. Опциональна и существует лишь для того, чтобы убедиться, что сервис работает.
• index.yaml: Сгенерированный файл с индексами базы данных.
• kernel.py: Обработчик веб-запросов на языке Python.
• test.bat: Скрипт, запускающий локальный веб-сервер теста приложения. Правдопободно эмулирует среду Google App Engine. После запуска приложение будет доступно по адресу http://127.0.0.1:8080/.
• test.html: Шаблон для теста записи логов в базу. Содержит два текстовых поля и кнопку Send.
• update.bat: Скрипт, для заливки приложения в сервис Google App Engine.
Описание обработчика kernel.py
Обработчик распознает 3 вида запросов:
• http://<имя приложения>.appspot.com/trace: трассировка событий.
• http://<имя приложения>.appspot.com/query: запрос списка событий.
• http://<имя приложения>.appspot.com/test: возращает веб-форму, позволяющую протестировать функционал внесения данных в таблицу.
Эти запросы определяются в методе main():
def main():
application = webapp.WSGIApplication(
[('/test', TestPage), ('/trace', TracePage), ('/query', QueryPage)],
debug=True)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == "__main__":
main()
Трассировка событий определяется обработчиком TracePage:
class TracePage(webapp.RequestHandler):
def get(self):
self.processRequest();
def post(self):
self.processRequest();
def processRequest(self):
trace = Trace()
trace.pIP = self.request.remote_addr
trace.action = self.request.get('act')
trace.label = self.request.get('lbl')
trace.date = datetime.now()
trace.put()
self.response.out.write("OK");
Как видно, в этом методе создается экземпляр объекта типа Trace, который представляет из себя запись в таблицу Trace. Само определение класса Trace выглядит так:
class Trace(db.Model):
pIP = db.StringProperty()
action = db.StringProperty()
label = db.StringProperty(multiline=True)
date = db.DateTimeProperty()
Ну и наконец, обработчик запроса перечня событий выглядит так:
class QueryPage(webapp.RequestHandler):
def get(self):
key = self.request.get('key')
if key != 'somekey':
return;
q = self.request.get('q')
if q == '':
return;
self.response.contentType = "text/plain"
self.response.out.write(q + '\r\n\r\n')
list = db.GqlQuery(q)
for t in list:
s = t.date.strftime("%d %m %Y %H:%M:%S") + '\t' + t.pIP + '\t' + t.action + '\t' + t.label
self.response.out.write(s + '\r\n')
Поясню: в нем сначала идет анализ ключа доступа к данным, затем мы вычитываем из базы данных все записи, удовлетворяющие заданному условию и выводим их как текст через разделитель TAB.
Использование в AS3
Мы все тут флешеры, поэтому просто оставлю это здесь.
Post Scriptum
В целом работа с Google App Engine оставила почти исключительно положительные впечатления. Язык Python, о котором я до этого момента только лишь слышал, тоже очень понравился, и всем, кто не работал с ним, советую познакомиться поближе, чтобы понять каким в идеале должен был быть в свое время BASIC :).
- +17
- xewelus
Комментарии (17)
Если желание пользоваться гуглопродуктами осталось, то я тоже немного писал про совмещение GAE и Flash: gamedevblogs.ru/blog/actionscript/150.html
Но дело-то не в нем, а в подходе гугла: работает — хорошо, не работает — не мои проблемы. Тех.поддержки нет вообще, как класса.
Но думаю при обычном использовании должно быть ок. Я вобще полагаю, что на каждую игру нужно создавать свой email — это логично, практично и позволит создавать по одному приложению GAE на каждую.
А в целом, да, согласен: google — отстой, и hanuman пострадал ни за что.
Что значит создавать свой e-mail: отдельный аккаунт в GAE? GAE регистрируется на мобилку, два аккаунта на мобилку нельзя. Т.е. тебе надо много мобилок тогда. И что-то мне подсказывает, что это нарушает terms of use, и тебя найдут и забанят, т.к. бесплатный-то он только в ограниченных объемах.
4.4. You may not develop multiple Applications to simulate or act as a single Application or otherwise access the Service in a manner intended to avoid incurring fees.
И вот что здесь:
Attempts to subvert or abuse quotas, such as by operating applications on multiple accounts that work in tandem, are a violation of the Terms of Service, and could result in apps being disabled or accounts being closed.
Во-первых, есть ограничение на бесплатный аккаунт — 10 приложений, и на каждое приложение определенные квоты. Использование нескольких аккаунтов дает тебе возможность сделать больше 10 бесплатных приложений. Это уже нарушение «or otherwise access the Service in a manner intended to avoid incurring fees».
Кроме того, если приложения будут одинаковые или очень похожие, то, даже если это не так, будут основание полагать, что они на деле являются одним большим приложением, распределенным для того, чтобы вписаться в бесплатные квоты. А это нарушение прямо прописанного: «multiple Applications to simulate or act as a single Application».
Я бы так делать не стал. Учитывая, что например Google Adsense тоже могут заодно забанить, просто так, без объяснения причин. И ищи правды.
Но мне неясно, зачем здесь вообще облака. Обычный хостинг и проще и дешевле (если не считать «бесплатного» GAE).
Аптайма в любом случае не будет.
Если брать только для трекинга, то на одну за одну игровую сессию будет уходить где-то 5Кб трафика — т.е. 200 тыщ сессий в месяц будут бесплатны по квоте 1Гб трафика в месяц. Процессору эти 200 тыщ сессий наверняка на 1 час, если не меньше.
Вобщем копейки получаются.
Про EC2. Micro как и small тоже on demand. Но что они имеют в виду под on demand, я не понял. Насколько я понял, чтобы сервис был доступен, надо все же машину (и micro, и small) включенной все время держать, и платить соответственно за 720 часов в месяц. Практически ec2 instance — это VPS в специфической инфраструктуре.
Вот что гуглится навскидку: forums.aws.amazon.com/thread.jspa?threadID=17239
И даже там, где вы их тратите напрямую (например adwords), на вас будут смотреть одним глазом при суммах до $50к в месяц,
вот если будете тратить больше, тогда вам скорее всего выделят персонального индуса-попку :)
В этом плане без проживания в штатах, сложно что-то делать быстро. Многие срочные вопросы решают все так же по старинке,
только при личной встрече со средним руководящим звеном.