Transcript Document
Современные методы разработки вебприложений, платформа Google AppEngine
Михаил Дайчик
Май 2010
План доклада
- Один запрос из жизни LAMP сервера.
- WSGI, Zope, Django, Webapp.
- Требования надежности и масштабируемости.
- Концепция облачных вычислений.
- Google App Engine. Общие принципы.
- Google App Engine. DataStore.
- Google App Engine. Cron jobs.
- Google App Engine. Task queues.
- Пример приложения на Google App Engine.
LAMP стек
WSGI
- Интерфейс между веб-сервером и фреймворком.
- Стандарт для python.
Приложение определяет функцию, принимающую словарь с переменными
окружения и callback.
Эта функция вызывает callback, передав ему код возврата и заголовки ответа.
После чего возвращает текст ответа.
def app(environ, start_response):
start_response("200 OK", [])
s = "<html>You requested <strong>%s</strong></html>"
s %= environ['PATH_INFO']
return [s]
Zope
- Объектно ориентированный python
- Хранение данных в Zope Object DB
class Counter(Persistent):
self.count = 0
def hit(self):
self.count = self.count + 1
def _p_resolveConflict(self, oldState, savedState, newState):
# Figure out how each state is different:
savedDiff= savedState['count'] - oldState['count']
newDiff= newState['count']- oldState['count']
# Apply both sets of changes to old state:
oldState['count'] = oldState['count'] + savedDiff + newDiff
return oldState
- Темплейты ZPT и DHTML (кроме HTML страниц)
<div tal:repeat="item python:range(10)">
<p tal:condition="repeat/item/even">Even</p>
<p tal:condition="repeat/item/odd">Odd</p>
</div>
Django
- Объектная реляционная база данных.
class Poll(models.Model):
question = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
poll = models.ForeignKey(Poll)
choice = models.CharField(max_length=200)
votes = models.IntegerField()
- Схемы URL, основанные на регулярных выражениях.
urlpatterns = patterns('',
(r'^articles/(\d{4})/$', 'mysite.views.year_archive'),
)
- Система темплейтов.
{% block content %}
{% for article in article_list %}
<p>{{ article.headline }}</p>
{% endfor %}
WebApp
Классы обработчики наследуются от класса
RequestHandler.
В них переопределяются методы get(self) и post(self).
Параметры запроса и заголовки передаются через
поля класса.
class MainPage(webapp.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, webapp World!')
application = webapp.WSGIApplication([('/', MainPage)],
debug=True)
def main():
run_wsgi_app(application)
Простые факты
• Для стабильной работы приложения оно должно быть
запущено минимум в 2-х DC на 3х физических машинах в
каждом.
• Раундтрип через Атлантику – 150ms+, веб приложения
делают минимум 2-3 последовательных запроса.
• LB должен учитывать сетевую погоду, проводить
мониторинг приложения на машинах, поддерживать
hotswap, иметь интегрированный DoS фильтр и т.д.
• Нужен мониторинг задержек, квот, загрузки машин,
общей нагрузки – и персонал 24/7 следящий за этими
показателями.
Cloud Computing
Cloud computing – технологический тренд, суть
которого состоит в переносе программного
обеспечения для личного и корпоративного
пользования в интернет. Он объединяет такие
концепции как software as a service, infrastructure as
a service и platform as a service.
Cloud Computing
App Engine
Cloud Computing платформа от Google
- Отвечает за автоматическую масштабируемость и балансировку
нагрузки
- Предоставляет динамический веб-сервер с поддержкой многих
распространенных веб-технологий
- Хранилище данных на основе Big Table
- Множество API, предоставляющих доступ к сервисам Google:
аккаунты Google
OAuth
быстрый кеш
краулер
почта
XMPP
обработка изображений
очереди заданий
Как работает App Engine
Node 2
Node 1
HTTP Request
Google
Cluster1
Datastore
Node 1 Cluster1
Node 3
Node N
Node 3
Node 2
Node N
HTTP Response
Node 2
Node 1
Google
Cluster N
Datastore
Node 1 Cluster M
Node 3
Node 2
Node N
Node 3
Python web server
Node N
Persistent Layer
Обеспечение безопасности: Sandbox
Разработка приложений с помощью AppEngine
Разработка приложений с помощью App
Engine
App Engine SDK
•Веб-сервер
odev_appserver.py
•Локальная реализация
DataStore
•App Engine APIs
•Утилита для загрузки приложений
oappcfg.py
Конфигурация приложения - app.yaml
application: helloworld
version: 1
runtime: python
api_version: 1
handlers:
- url: /.*
script: helloworld.py
yaml (yet another markup
language) - Deployment
Descriptor for the
Application
Maps URLs to the
handlers
Request Handler - helloworld.py
App Engine DataStore
•Не реляционное объектное распределенное хранилище
данных
•DataStore API
•Поддержка SQL-образного языка GQL
Объекты и их свойства
Entity
has
Properties
•В хранилище данных хранятся сущности (Entities)
•У каждой сущности есть набор свойств, заданного
типа (например User, IM, Link, Rating, GeoPt,
PhoneNumber и тд)
•Сущности имеют возможность ссылаться на другие
сущности (many to one relationships)
•Сущности идентифицируются по ключу, состоящему
из трех частей: типа, пути, определяющего его
положение относительно предка, и уникального
имени.
App Engine DataStore
Entity
from db.Model
Persisting
An
Entity
GQL
GQL
Группы сущностей
Root Entity
• Группы сущностей
хрянятся в одном
узле
распределенного
хранилища
• Группа сущностей
определяет рамки
одной транзакции
Периодические задания (сron)
- Представляют из себя обычные обработчики URL
- Вызываются с заданным периодом
- Используют обычную квоту
- Имеют те же ограничения, что и остальные обработчики,
в том числе на время исполнения
cron:
- description: hourly fetch job
url: /fetch_cron
schedule: every 10 minutes
Очереди заданий
- Представляют из себя обычные обработчики URL
- Имеют настраиваюмую пропускную способность
- Перезапускаются в случае неудачи
- Используют обычную квоту
- Имеют те же ограничения, что и остальные обработчики,
в том числе на время исполнения
queue:
- name: default
rate: 1/s
- name: fetcher
rate: 1/s
- name: article-placer
rate: 10/s
bucket_size: 20
Демонстрация
Полезные ресурсы
•Документация и SDK:
http://code.google.com/appengine/
•Список рассылки:
http://groups.google.com/group/google-appengine/
Спасибо за внимание!
Михаил Дайчик,
Менеджер Технических Программ Google
[email protected]
Backup
Тестирование и развертывание
сервиса на App Engine
•Локальное тестирование
odev_appserver.py helloworld/
•Развертывание
oappcfg.py update helloworld/
•Приложение «в облаке»
o http://<application-id>.appspot.com
WebApp
Framework
(Google’s Web
framework)
Django
Framework
(Third Party)
WebOb
Framework
(Third Party)
Python Runtime
Runtime-компоненты
приложения, развернутого
на App Engine
app.yaml (deployment descriptor)
URL
Python
Handlers
/*.html
HtmlHandler
/*.form
FormHandler
Mail
APIs
Users MemCache
API
APIs
Data
Store
APIs
DataStore - Runtime компоненты