Google App Engine e NoSQL:
Alta disponibilidade
Giovane Liberato @ TDC 2014
$whoami
Giovane Liberato
Fatec São José dos Campos, Python web
developer, Comunidade,
Google App Engine - overview
Quem usa o Google App Engine?
cloud.google.com/customers
Características
Sistemas multi-tenentes com API de namespaces
APIs de memcache, Cron Jobs e Task Queues
Limitações “Libertadoras”
Vendor Lock In
Precificação camarada
GAE Datastore
Características
Banco de dados colunar
Distribuido com alta replicação
Usado por mais de 60 projetos no Google*[1]
Cache automático
APIs assíncronas para acesso ao banco
Banco de dados colunar
Row Column
Escalabilidade do banco
Entidades e Atributos
Objetos da linguagem que herdam da classe Model
Campo Key é definido pelo sistema
Classes são como tabelas, atributos são como linhas
É possível criar subclasses de modelo
Entidades e Atributos - exemplo
from google.appengine.ext import ndb
class Person(ndb.Model):
name = ndb.StringProperty()
age = ndb.IntegerProperty()
Modelagem de dados
Schemaless
Redundância de dados facilita o acesso
Relações podem ser feitas, porem sem integridade
referencial
Modelagem - exemplo
from google.appengine.ext import ndb
class Person(ndb.Model):
name = ndb.StringProperty()
age = ndb.IntegerProperty()
friends = ndb.StructuredProperty(Person,
repated=True)
Relações de dados - sugestões
One-to-one
Feito com referências por keys
One-to-many
Feito com listas ou tabela de relacionamento
Many-to-many
Feito com tabela de relacionamentos
Datastore Query
Query - API de buscas
Toda subclasse de ndb.Model sabe fazer query
Métodos filter, count, order, get, fetch, etc…
Buscas paginadas, buscas com offset e limite
Funções de map nos resultados da query
Query - exemplo busca simples
from models import Person
pessoas = Person.query().fetch()
# ou
for p in Person.query():
print p
Query - exemplo condicional
from models import Person
p = Person.query(Person.age > 5).fetch()
p = Person.query(Person.name == “Giovane”) .
fetch()
Query - exemplo paginação
from models import Person
p, cursor, more = Person.query().fetch_page(20)
if more:
p2 = Person.query().fetch_page(20,
start_cursor=cursor)
Query - API de buscas assíncronas
Reduz o tempo de resposta da requisição
Todo método tem um correspondente _async
get_async, fetch_async, map_async, count_async...
Query - API de buscas assíncronas
Async
Serial
Query - Índices
Para toda busca, o datastore cria um índice usando as
condições e ordenação da query
Subsets indexados e ordenados = buscas mais rápidas
Geradas automaticamente pelo GAE
Google Query Language
SELECT * FROM Person WHERE age >= 18
SELECT * FROM Person WHERE name IN ('Betty', 'Charlie')
SELECT name FROM Person
SELECT __key__ FROM Person WHERE age = NULL
Datastore ORM
ORM - Métodos
Atributos estáticos: query, get_by_id(),
get_or_insert()
Atributos de instância: populate, put, delete, to_dict
Pre Hooks e Post Hooks
ORM - exemplos
p = Person(name='Arthur Dent', age=42)
p_key = p.put()
p2 = p_key.get()
p2 == p #Retorna True
p_key.delete()
ORM - exemplos
p = Person()
p.populate(name='Arthur Dent', age=42)
p.put()
ORM - Datastore Viewer
Problemas da vida real
Problemas da vida real
Problema: Dados indisponíveis imediatamente após a
inserção
Causa: Eventual Consistency do Datastore
Resolução: Algoritmo do avestruz
Isso acontece porque o datastore precisa de até 1 segundo para replicar o dado em todas as
instâncias do datastore. Paradigma BASE.
Problemas da vida real
Problema: Fazer backup/dump do banco de dados
Resolução: Bulkloader e remote_api_shell
Problemas da vida real
Problema: Erros em querys logo após o deploy
Causa: GAE Gerando novos índices
Resolução: esperar e trocar a versão default para uma
estável
Problemas da vida real
Problema: Qual tipo de busca/inserção realizar?
Resolução: Utilize a forma que menos fizer chamadas ao
banco de dados
Problemas da vida real
Problema: É possível paralelizar buscas?
Resolução: Através das tasklets é possível paralelizar o
acesso ao banco
Referências
[1] Bigtable: A Distributed Storage System for Structured Data
[2] Documentação Google App Engine para Python
[3] App Engine e Python: Você Programa e o Google Escala
[4] Programming Google App Engine 2nd Edition
Obrigado!
giovaneliberato@gmail.com
about.me/giovaneliberato

Google App Engine e NoSQL: Alta disponibilidade

  • 1.
    Google App Enginee NoSQL: Alta disponibilidade Giovane Liberato @ TDC 2014
  • 2.
  • 3.
    Giovane Liberato Fatec SãoJosé dos Campos, Python web developer, Comunidade,
  • 4.
  • 6.
    Quem usa oGoogle App Engine? cloud.google.com/customers
  • 7.
    Características Sistemas multi-tenentes comAPI de namespaces APIs de memcache, Cron Jobs e Task Queues Limitações “Libertadoras” Vendor Lock In Precificação camarada
  • 8.
  • 9.
    Características Banco de dadoscolunar Distribuido com alta replicação Usado por mais de 60 projetos no Google*[1] Cache automático APIs assíncronas para acesso ao banco
  • 10.
    Banco de dadoscolunar Row Column
  • 11.
  • 12.
    Entidades e Atributos Objetosda linguagem que herdam da classe Model Campo Key é definido pelo sistema Classes são como tabelas, atributos são como linhas É possível criar subclasses de modelo
  • 13.
    Entidades e Atributos- exemplo from google.appengine.ext import ndb class Person(ndb.Model): name = ndb.StringProperty() age = ndb.IntegerProperty()
  • 14.
    Modelagem de dados Schemaless Redundânciade dados facilita o acesso Relações podem ser feitas, porem sem integridade referencial
  • 15.
    Modelagem - exemplo fromgoogle.appengine.ext import ndb class Person(ndb.Model): name = ndb.StringProperty() age = ndb.IntegerProperty() friends = ndb.StructuredProperty(Person, repated=True)
  • 16.
    Relações de dados- sugestões One-to-one Feito com referências por keys One-to-many Feito com listas ou tabela de relacionamento Many-to-many Feito com tabela de relacionamentos
  • 17.
  • 18.
    Query - APIde buscas Toda subclasse de ndb.Model sabe fazer query Métodos filter, count, order, get, fetch, etc… Buscas paginadas, buscas com offset e limite Funções de map nos resultados da query
  • 19.
    Query - exemplobusca simples from models import Person pessoas = Person.query().fetch() # ou for p in Person.query(): print p
  • 20.
    Query - exemplocondicional from models import Person p = Person.query(Person.age > 5).fetch() p = Person.query(Person.name == “Giovane”) . fetch()
  • 21.
    Query - exemplopaginação from models import Person p, cursor, more = Person.query().fetch_page(20) if more: p2 = Person.query().fetch_page(20, start_cursor=cursor)
  • 22.
    Query - APIde buscas assíncronas Reduz o tempo de resposta da requisição Todo método tem um correspondente _async get_async, fetch_async, map_async, count_async...
  • 23.
    Query - APIde buscas assíncronas Async Serial
  • 24.
    Query - Índices Paratoda busca, o datastore cria um índice usando as condições e ordenação da query Subsets indexados e ordenados = buscas mais rápidas Geradas automaticamente pelo GAE
  • 25.
    Google Query Language SELECT* FROM Person WHERE age >= 18 SELECT * FROM Person WHERE name IN ('Betty', 'Charlie') SELECT name FROM Person SELECT __key__ FROM Person WHERE age = NULL
  • 26.
  • 27.
    ORM - Métodos Atributosestáticos: query, get_by_id(), get_or_insert() Atributos de instância: populate, put, delete, to_dict Pre Hooks e Post Hooks
  • 28.
    ORM - exemplos p= Person(name='Arthur Dent', age=42) p_key = p.put() p2 = p_key.get() p2 == p #Retorna True p_key.delete()
  • 29.
    ORM - exemplos p= Person() p.populate(name='Arthur Dent', age=42) p.put()
  • 30.
  • 34.
  • 35.
    Problemas da vidareal Problema: Dados indisponíveis imediatamente após a inserção Causa: Eventual Consistency do Datastore Resolução: Algoritmo do avestruz Isso acontece porque o datastore precisa de até 1 segundo para replicar o dado em todas as instâncias do datastore. Paradigma BASE.
  • 36.
    Problemas da vidareal Problema: Fazer backup/dump do banco de dados Resolução: Bulkloader e remote_api_shell
  • 37.
    Problemas da vidareal Problema: Erros em querys logo após o deploy Causa: GAE Gerando novos índices Resolução: esperar e trocar a versão default para uma estável
  • 38.
    Problemas da vidareal Problema: Qual tipo de busca/inserção realizar? Resolução: Utilize a forma que menos fizer chamadas ao banco de dados
  • 39.
    Problemas da vidareal Problema: É possível paralelizar buscas? Resolução: Através das tasklets é possível paralelizar o acesso ao banco
  • 40.
    Referências [1] Bigtable: ADistributed Storage System for Structured Data [2] Documentação Google App Engine para Python [3] App Engine e Python: Você Programa e o Google Escala [4] Programming Google App Engine 2nd Edition
  • 42.