Este documento discute o Google App Engine e o banco de dados NoSQL do Google Cloud Datastore. Ele descreve as principais características do Datastore como alta disponibilidade, modelagem de dados flexível e buscas assíncronas escaláveis. O documento também aborda problemas comuns e suas resoluções, como eventual consistência e paralelização de buscas.
9. 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
12. 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
13. Entidades e Atributos - exemplo
from google.appengine.ext import ndb
class Person(ndb.Model):
name = ndb.StringProperty()
age = ndb.IntegerProperty()
15. Modelagem - exemplo
from google.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
18. 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
19. Query - exemplo busca simples
from models import Person
pessoas = Person.query().fetch()
# ou
for p in Person.query():
print p
20. Query - exemplo condicional
from models import Person
p = Person.query(Person.age > 5).fetch()
p = Person.query(Person.name == “Giovane”) .
fetch()
21. 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)
22. 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...
23. Query - API de buscas assíncronas
Async
Serial
24. 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
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
35. 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.
36. Problemas da vida real
Problema: Fazer backup/dump do banco de dados
Resolução: Bulkloader e remote_api_shell
37. 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
38. 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
39. Problemas da vida real
Problema: É possível paralelizar buscas?
Resolução: Através das tasklets é possível paralelizar o
acesso ao banco
40. 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