google app engine e nosql: alta disponibilidade
Post on 12-Jan-2015
312 Views
Preview:
DESCRIPTION
TRANSCRIPT
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 - exemplofrom 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çãofrom 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.comabout.me/giovaneliberato
top related