SlideShare ist ein Scribd-Unternehmen logo
1 von 23
Downloaden Sie, um offline zu lesen
GAE: плюсы, минусы,
         подводные камни



● Я - Егор Назаркин
● Обычно - пишу на Python под GAE (и не только)
● Email: nimnull@gmail.com
● Twitter: @nimnull
GAE - что за неведомая фигня?
GAE это...
                       BigTable
      Cloud Platform              Go
               Webapp hosting      JAVA
       PaaS                automatic scaling
                         Python
             managed
GAE это...




       Игровая площадка Гвидо
Ограничения GAE
 ● Время выполнения запроса - 60 секунд (лучше - 30)
 ● Данные на FS - только чтение
 ● Сохранение файлов - Google Datastore
 ● Связь с внешними хостами - только AppEngine URL
   Fetch


Квоты:
 ● Безопасность
 ● Платные
 ● OverQuotaError

  http://www.google.com/enterprise/cloud/appengine/pricing.html
Алиасы модулей:
cPickle => pickle
cStringIO => StringIO
marshal, imp, ftplib, tempfile => None




Библиотеки:
    ● logging                      ● PyCrypto 2.3
    ● Django 1.2                   ● PyYAML 3.10
    ● jinja2 2.6                   ● Python Imaging Library (PIL) 1.1.7
    ● lxml 2.3                     ● setuptools 0.6c11
    ● MarkupSafe                   ● webapp2 2.3
      0.15                         ● WebOb 1.1.
    ● NumPy 1.6.1
MVC?




       view


                           model




              controller
Backends
    нет ограничений на время обработки

    ручная конфигурация памяти/CPU

    собственный поддомен

    резидентность

    приватные по умолчанию

    API доступа
Datastore
            ORM

            GQL

            Schemaless

            Транзакции

            Метаданные

            Статистика

            Асинхронность
ORM
class Rate(db.Model):
  price = db.IntegerProperty()
  user = db.UserProperty(required=True)
  uptime = db.DateTimeProperty(auto_now=True)
  trade_unit = db.ReferenceProperty(TradeUnit, required=False)

  def put(self):
    q = Rate.all().filter('trade_unit = ', self.trade_unit.key())
    q.order("-price")
    previous_rate = q.get()
    previous_price = previous_rate.price if previous_rate else 0
    price = previous_price + self.trade_unit.increase_rate

    if self.price < price:
       self.price = price

    super(Rate, self).put()
GQL
SELECT [* | __key__]
 FROM <kind>
 WHERE <condition> [AND <condition> ...]
 ORDER BY <property> [ASC | DESC ] [, <condition> [ASC | DESC]... ]
 LIMIT [<offset>, ] <count> ]
 OFFSET <offset>



              ● DATETIME
                (year, month, day, hour, minute,
                 second)
              ● DATE(year, month, day)
              ● TIME(hour, minute, second)
              ● KEY ('encoded key')
Transactions
class Rate(db.Model):
  price = db.IntegerProperty(default=0)
  user = db.UserProperty(required=True)
  uptime = db.DateTimeProperty(auto_now=True)
  trade_unit = db.ReferenceProperty(TradeUnit, required=False)


  def put_with_next_price(self, price=None):

def in_transaction(rate, next_price=None):
q = Rate.all().filter('trade_unit = ', rate.trade_unit.key())
q.order("-price")
previous_rate = q.get()
previous_price = previous_rate.price if previous_rate else next_price
price = previous_price + rate.trade_unit.increase_rate
        run_in_transaction_options(TransactionOptions(), ...)
        if rate.price < price:
        run_in_transaction_custom_retries(.., retries=x)
            rate.price = price
        rate.put()
Entities and Keys
 Key:

    Kind - объединяет по признаку (classname)
    ID - генерируется Datastore или задаётся вручную

 Key.from_path(kind, id_or_name, parent=none, namespace=None, **kwds)


 item = TradeUnit()
 item.put()
 rate = Rate(parent=item)
 # ................
 rate = Rate(parent=item.key())
Async


  get
  put         *_async()       q = Model1.filter(...).run()
  delete


           # выполняем какую-то работу ...

    <object>.get_result()              for e in q:
                                          ...
NDB
● Расширенное описание полей
● Дополнительные типы полей db.Model
● Вменяемый синтаксис запросов
● Кэширование
● Триггеры (hooks)




                 class Contact(Model):
                   name = StringProperty()
                   addresses = StructuredProperty(Address, repeated=True)

                 guido = Contact(name='Guido', addresses=[
                 Address(type='home', city='Amsterdam'),
                 Address(type='work', city='SF', street='Spear St'),
                 ])

                 qry = Article.query(Article.tags.IN(['python', 'GAE', 'ndb']))
Google Cloud SQL

  from google.appengine.api import rdbms


  Google SQL Service поддерживает DB-API 2.0




                                           etc...
Батарейки в комплекте:

   Mail              Task queues

      Memcached
  Images            Message channels
  Cloud storage
                      OAuth
                              URL fetch

                  Blobstore
                               MapReduce
MapReduce:
Cloud storage:

   Сервис общего назначения (используется в google)

   AppEngine - RESTful API

   Может использоваться разными приложениями

   Trial-only для бесплатной подписки

   file-like доступ
Channel API:
 JS View (coffee-script sample)
  _sock = new goog.appengine.
Channel @token
  @socket = _sock.open()
  # bind socket events
  @socket.onopen = =>
     @subscribe options
  @socket.onmessage = (evt) =>
     console.log "realtime: ", evt
Python back-end:
  @socket.onerror = (evt) =>
    key = str(uuid.uuid4())
     @socket = null
  @socket.onclose = (evt) =>
    def subscribe(request):
     [@clients, channel.create_channel(request.user.
       token = @socket, @token] = [{},
null, null]
    id + key)
       return {
         'token': token,
       }
На этом всё
Вопросы?

Weitere ähnliche Inhalte

Was ist angesagt?

Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееdelimitry
 
Нейронные сети и Keras. Часть 2
Нейронные сети и Keras. Часть 2Нейронные сети и Keras. Часть 2
Нейронные сети и Keras. Часть 2PyNSK
 
Нейронные сети и Keras. Часть 1
Нейронные сети и Keras. Часть 1Нейронные сети и Keras. Часть 1
Нейронные сети и Keras. Часть 1PyNSK
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupMail.ru Group
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_schoolITmozg
 
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart GammaMongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart GammaEvgeniy Kuzmin
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...solit
 
12 - Web-технологии. Django модели
12 - Web-технологии. Django модели12 - Web-технологии. Django модели
12 - Web-технологии. Django моделиRoman Brovko
 
Web internship java script
Web internship   java scriptWeb internship   java script
Web internship java scriptNoveo
 
Михаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьМихаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьYandex
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка DjangoVladimir Rudnyh
 
Михаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. АсинхронностьМихаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. АсинхронностьYandex
 
Оптимизация производительности ActionScript
Оптимизация производительности ActionScriptОптимизация производительности ActionScript
Оптимизация производительности ActionScriptValery
 

Was ist angesagt? (20)

Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
Нейронные сети и Keras. Часть 2
Нейронные сети и Keras. Часть 2Нейронные сети и Keras. Часть 2
Нейронные сети и Keras. Часть 2
 
Нейронные сети и Keras. Часть 1
Нейронные сети и Keras. Часть 1Нейронные сети и Keras. Часть 1
Нейронные сети и Keras. Часть 1
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
What's in a metrics? Ruby Russia 2018
What's in a metrics? Ruby Russia 2018What's in a metrics? Ruby Russia 2018
What's in a metrics? Ruby Russia 2018
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
 
Decorators' recipes
Decorators' recipesDecorators' recipes
Decorators' recipes
 
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart GammaMongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
 
Javascript
JavascriptJavascript
Javascript
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
 
12 - Web-технологии. Django модели
12 - Web-технологии. Django модели12 - Web-технологии. Django модели
12 - Web-технологии. Django модели
 
Web internship java script
Web internship   java scriptWeb internship   java script
Web internship java script
 
Михаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьМихаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: Асинхронность
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
Михаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. АсинхронностьМихаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. Асинхронность
 
Оптимизация производительности ActionScript
Оптимизация производительности ActionScriptОптимизация производительности ActionScript
Оптимизация производительности ActionScript
 

Ähnlich wie GAE - плюсы/минусы/подводные камни

Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4Technopark
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноKrivoy Rog IT Community
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCDevDay
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf Conference
 
iMetrics 2012. Станислав Видяев - Google Russia. Настройка, обзор системы, но...
iMetrics 2012. Станислав Видяев - Google Russia. Настройка, обзор системы, но...iMetrics 2012. Станислав Видяев - Google Russia. Настройка, обзор системы, но...
iMetrics 2012. Станислав Видяев - Google Russia. Настройка, обзор системы, но...Artyom Tsiplakov
 
Мастер-класс по Google Analytics
Мастер-класс по Google AnalyticsМастер-класс по Google Analytics
Мастер-класс по Google AnalyticsiMetrics
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...pgdayrussia
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4Technopark
 
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...Ontico
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...Ontico
 
2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb SpockBohdan Danyliuk
 
TestRail. Некоторые возможности интеграции.
TestRail. Некоторые возможности интеграции.TestRail. Некоторые возможности интеграции.
TestRail. Некоторые возможности интеграции.PyNSK
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Fwdays
 

Ähnlich wie GAE - плюсы/минусы/подводные камни (20)

Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
 
iMetrics 2012. Станислав Видяев - Google Russia. Настройка, обзор системы, но...
iMetrics 2012. Станислав Видяев - Google Russia. Настройка, обзор системы, но...iMetrics 2012. Станислав Видяев - Google Russia. Настройка, обзор системы, но...
iMetrics 2012. Станислав Видяев - Google Russia. Настройка, обзор системы, но...
 
Мастер-класс по Google Analytics
Мастер-класс по Google AnalyticsМастер-класс по Google Analytics
Мастер-класс по Google Analytics
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
 
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
 
php frameworks
php frameworksphp frameworks
php frameworks
 
2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock
 
TestRail. Некоторые возможности интеграции.
TestRail. Некоторые возможности интеграции.TestRail. Некоторые возможности интеграции.
TestRail. Некоторые возможности интеграции.
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
 

Mehr von Yehor Nazarkin

Inter-process data exchange in Python
Inter-process data exchange in PythonInter-process data exchange in Python
Inter-process data exchange in PythonYehor Nazarkin
 
Flask, гордость и предубеждение
Flask, гордость и предубеждениеFlask, гордость и предубеждение
Flask, гордость и предубеждениеYehor Nazarkin
 
Chaplin.js in real life
Chaplin.js in real lifeChaplin.js in real life
Chaplin.js in real lifeYehor Nazarkin
 

Mehr von Yehor Nazarkin (6)

Flask, rest and data
Flask, rest and dataFlask, rest and data
Flask, rest and data
 
Inter-process data exchange in Python
Inter-process data exchange in PythonInter-process data exchange in Python
Inter-process data exchange in Python
 
Flask, гордость и предубеждение
Flask, гордость и предубеждениеFlask, гордость и предубеждение
Flask, гордость и предубеждение
 
Chaplin.js in real life
Chaplin.js in real lifeChaplin.js in real life
Chaplin.js in real life
 
Rest in flask
Rest in flaskRest in flask
Rest in flask
 
обзор Python
обзор Pythonобзор Python
обзор Python
 

GAE - плюсы/минусы/подводные камни

  • 1. GAE: плюсы, минусы, подводные камни ● Я - Егор Назаркин ● Обычно - пишу на Python под GAE (и не только) ● Email: nimnull@gmail.com ● Twitter: @nimnull
  • 2. GAE - что за неведомая фигня?
  • 3. GAE это... BigTable Cloud Platform Go Webapp hosting JAVA PaaS automatic scaling Python managed
  • 4. GAE это... Игровая площадка Гвидо
  • 5. Ограничения GAE ● Время выполнения запроса - 60 секунд (лучше - 30) ● Данные на FS - только чтение ● Сохранение файлов - Google Datastore ● Связь с внешними хостами - только AppEngine URL Fetch Квоты: ● Безопасность ● Платные ● OverQuotaError http://www.google.com/enterprise/cloud/appengine/pricing.html
  • 6. Алиасы модулей: cPickle => pickle cStringIO => StringIO marshal, imp, ftplib, tempfile => None Библиотеки: ● logging ● PyCrypto 2.3 ● Django 1.2 ● PyYAML 3.10 ● jinja2 2.6 ● Python Imaging Library (PIL) 1.1.7 ● lxml 2.3 ● setuptools 0.6c11 ● MarkupSafe ● webapp2 2.3 0.15 ● WebOb 1.1. ● NumPy 1.6.1
  • 7. MVC? view model controller
  • 8. Backends нет ограничений на время обработки ручная конфигурация памяти/CPU собственный поддомен резидентность приватные по умолчанию API доступа
  • 9. Datastore ORM GQL Schemaless Транзакции Метаданные Статистика Асинхронность
  • 10. ORM class Rate(db.Model): price = db.IntegerProperty() user = db.UserProperty(required=True) uptime = db.DateTimeProperty(auto_now=True) trade_unit = db.ReferenceProperty(TradeUnit, required=False) def put(self): q = Rate.all().filter('trade_unit = ', self.trade_unit.key()) q.order("-price") previous_rate = q.get() previous_price = previous_rate.price if previous_rate else 0 price = previous_price + self.trade_unit.increase_rate if self.price < price: self.price = price super(Rate, self).put()
  • 11. GQL SELECT [* | __key__] FROM <kind> WHERE <condition> [AND <condition> ...] ORDER BY <property> [ASC | DESC ] [, <condition> [ASC | DESC]... ] LIMIT [<offset>, ] <count> ] OFFSET <offset> ● DATETIME (year, month, day, hour, minute, second) ● DATE(year, month, day) ● TIME(hour, minute, second) ● KEY ('encoded key')
  • 12. Transactions class Rate(db.Model): price = db.IntegerProperty(default=0) user = db.UserProperty(required=True) uptime = db.DateTimeProperty(auto_now=True) trade_unit = db.ReferenceProperty(TradeUnit, required=False) def put_with_next_price(self, price=None): def in_transaction(rate, next_price=None): q = Rate.all().filter('trade_unit = ', rate.trade_unit.key()) q.order("-price") previous_rate = q.get() previous_price = previous_rate.price if previous_rate else next_price price = previous_price + rate.trade_unit.increase_rate run_in_transaction_options(TransactionOptions(), ...) if rate.price < price: run_in_transaction_custom_retries(.., retries=x) rate.price = price rate.put()
  • 13. Entities and Keys Key: Kind - объединяет по признаку (classname) ID - генерируется Datastore или задаётся вручную Key.from_path(kind, id_or_name, parent=none, namespace=None, **kwds) item = TradeUnit() item.put() rate = Rate(parent=item) # ................ rate = Rate(parent=item.key())
  • 14. Async get put *_async() q = Model1.filter(...).run() delete # выполняем какую-то работу ... <object>.get_result() for e in q: ...
  • 15. NDB ● Расширенное описание полей ● Дополнительные типы полей db.Model ● Вменяемый синтаксис запросов ● Кэширование ● Триггеры (hooks) class Contact(Model): name = StringProperty() addresses = StructuredProperty(Address, repeated=True) guido = Contact(name='Guido', addresses=[ Address(type='home', city='Amsterdam'), Address(type='work', city='SF', street='Spear St'), ]) qry = Article.query(Article.tags.IN(['python', 'GAE', 'ndb']))
  • 16.
  • 17. Google Cloud SQL from google.appengine.api import rdbms Google SQL Service поддерживает DB-API 2.0 etc...
  • 18. Батарейки в комплекте: Mail Task queues Memcached Images Message channels Cloud storage OAuth URL fetch Blobstore MapReduce
  • 20. Cloud storage: Сервис общего назначения (используется в google) AppEngine - RESTful API Может использоваться разными приложениями Trial-only для бесплатной подписки file-like доступ
  • 21. Channel API: JS View (coffee-script sample) _sock = new goog.appengine. Channel @token @socket = _sock.open() # bind socket events @socket.onopen = => @subscribe options @socket.onmessage = (evt) => console.log "realtime: ", evt Python back-end: @socket.onerror = (evt) => key = str(uuid.uuid4()) @socket = null @socket.onclose = (evt) => def subscribe(request): [@clients, channel.create_channel(request.user. token = @socket, @token] = [{}, null, null] id + key) return { 'token': token, }