SlideShare uma empresa Scribd logo
1 de 42
Baixar para ler offline
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

Mais conteúdo relacionado

Semelhante a GAE Datastore: Alta disponibilidade com NoSQL

Desenvolvendo para WEB com JAVA
Desenvolvendo para WEB com JAVADesenvolvendo para WEB com JAVA
Desenvolvendo para WEB com JAVAWillian Magalhães
 
uma história sobre testes de API
uma história sobre testes de APIuma história sobre testes de API
uma história sobre testes de APISamuel Lourenço
 
Novidades do Django 1.2 e o que vem por ai
Novidades do Django 1.2 e o que vem por aiNovidades do Django 1.2 e o que vem por ai
Novidades do Django 1.2 e o que vem por aiMarcos Petry
 
Aula 5 PHP - Criação de sites II
Aula 5 PHP - Criação de sites IIAula 5 PHP - Criação de sites II
Aula 5 PHP - Criação de sites IIinfo_cimol
 
De a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de APIDe a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de APIElias Nogueira
 
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
Dsi   015 - poo e php - conexão com bancos de dados usando pdoDsi   015 - poo e php - conexão com bancos de dados usando pdo
Dsi 015 - poo e php - conexão com bancos de dados usando pdoJorge Luís Gregório
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSMatheus Donizete
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOWesley Lemos
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Automação de testes de API utilizando Postman
Automação de testes de API utilizando PostmanAutomação de testes de API utilizando Postman
Automação de testes de API utilizando PostmanLucas Amaral
 
Bancos de Dados Orientados a Objeto
Bancos de Dados Orientados a ObjetoBancos de Dados Orientados a Objeto
Bancos de Dados Orientados a Objetoelliando dias
 
Além do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completaAlém do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completaCharles Kilesse
 

Semelhante a GAE Datastore: Alta disponibilidade com NoSQL (20)

Desenvolvendo para WEB com JAVA
Desenvolvendo para WEB com JAVADesenvolvendo para WEB com JAVA
Desenvolvendo para WEB com JAVA
 
uma história sobre testes de API
uma história sobre testes de APIuma história sobre testes de API
uma história sobre testes de API
 
Novidades do Django 1.2 e o que vem por ai
Novidades do Django 1.2 e o que vem por aiNovidades do Django 1.2 e o que vem por ai
Novidades do Django 1.2 e o que vem por ai
 
Aula 5 PHP - Criação de sites II
Aula 5 PHP - Criação de sites IIAula 5 PHP - Criação de sites II
Aula 5 PHP - Criação de sites II
 
De a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de APIDe a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de API
 
Elasticsearch
ElasticsearchElasticsearch
Elasticsearch
 
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
Dsi   015 - poo e php - conexão com bancos de dados usando pdoDsi   015 - poo e php - conexão com bancos de dados usando pdo
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
 
PHP FrameWARks - FISL
PHP FrameWARks - FISLPHP FrameWARks - FISL
PHP FrameWARks - FISL
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JS
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
 
Asp.net.data
Asp.net.dataAsp.net.data
Asp.net.data
 
Node.js: serious business
Node.js: serious businessNode.js: serious business
Node.js: serious business
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Cloud search avancado
Cloud search avancadoCloud search avancado
Cloud search avancado
 
Automação de testes de API utilizando Postman
Automação de testes de API utilizando PostmanAutomação de testes de API utilizando Postman
Automação de testes de API utilizando Postman
 
Bancos de Dados Orientados a Objeto
Bancos de Dados Orientados a ObjetoBancos de Dados Orientados a Objeto
Bancos de Dados Orientados a Objeto
 
Web App Flaws - SQL Injection
Web App Flaws - SQL InjectionWeb App Flaws - SQL Injection
Web App Flaws - SQL Injection
 
Além do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completaAlém do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completa
 
Web app flaws
Web app flawsWeb app flaws
Web app flaws
 

Mais de Giovane Liberato

Refatorando com a API funcional do Java
Refatorando com a API funcional do JavaRefatorando com a API funcional do Java
Refatorando com a API funcional do JavaGiovane Liberato
 
Front end para back enders: Dicas de como se virar no universo paralelo
Front end para back enders: Dicas de como se virar no universo paraleloFront end para back enders: Dicas de como se virar no universo paralelo
Front end para back enders: Dicas de como se virar no universo paraleloGiovane Liberato
 
Front end pra back enders: dicas pra se virar no universo paralelo
Front end pra back enders: dicas pra se virar no universo paraleloFront end pra back enders: dicas pra se virar no universo paralelo
Front end pra back enders: dicas pra se virar no universo paraleloGiovane Liberato
 
Sistemas de recomendação na educação
Sistemas de recomendação na educaçãoSistemas de recomendação na educação
Sistemas de recomendação na educaçãoGiovane Liberato
 
A cobra vai fumar(e tomar um golinho de café) - Jython
A cobra vai fumar(e tomar um golinho de café) - JythonA cobra vai fumar(e tomar um golinho de café) - Jython
A cobra vai fumar(e tomar um golinho de café) - JythonGiovane Liberato
 
Jython - "A cobra vai fumar (e tomar um golinho de café)"
Jython - "A cobra vai fumar (e tomar um golinho de café)"Jython - "A cobra vai fumar (e tomar um golinho de café)"
Jython - "A cobra vai fumar (e tomar um golinho de café)"Giovane Liberato
 
Um site em 5 minutos com bottle.py
Um site em 5 minutos com bottle.pyUm site em 5 minutos com bottle.py
Um site em 5 minutos com bottle.pyGiovane Liberato
 
OWASP Top 10 - A web security cookbook
OWASP Top 10 - A web security cookbookOWASP Top 10 - A web security cookbook
OWASP Top 10 - A web security cookbookGiovane Liberato
 

Mais de Giovane Liberato (9)

Refatorando com a API funcional do Java
Refatorando com a API funcional do JavaRefatorando com a API funcional do Java
Refatorando com a API funcional do Java
 
Functional Python
Functional PythonFunctional Python
Functional Python
 
Front end para back enders: Dicas de como se virar no universo paralelo
Front end para back enders: Dicas de como se virar no universo paraleloFront end para back enders: Dicas de como se virar no universo paralelo
Front end para back enders: Dicas de como se virar no universo paralelo
 
Front end pra back enders: dicas pra se virar no universo paralelo
Front end pra back enders: dicas pra se virar no universo paraleloFront end pra back enders: dicas pra se virar no universo paralelo
Front end pra back enders: dicas pra se virar no universo paralelo
 
Sistemas de recomendação na educação
Sistemas de recomendação na educaçãoSistemas de recomendação na educação
Sistemas de recomendação na educação
 
A cobra vai fumar(e tomar um golinho de café) - Jython
A cobra vai fumar(e tomar um golinho de café) - JythonA cobra vai fumar(e tomar um golinho de café) - Jython
A cobra vai fumar(e tomar um golinho de café) - Jython
 
Jython - "A cobra vai fumar (e tomar um golinho de café)"
Jython - "A cobra vai fumar (e tomar um golinho de café)"Jython - "A cobra vai fumar (e tomar um golinho de café)"
Jython - "A cobra vai fumar (e tomar um golinho de café)"
 
Um site em 5 minutos com bottle.py
Um site em 5 minutos com bottle.pyUm site em 5 minutos com bottle.py
Um site em 5 minutos com bottle.py
 
OWASP Top 10 - A web security cookbook
OWASP Top 10 - A web security cookbookOWASP Top 10 - A web security cookbook
OWASP Top 10 - A web security cookbook
 

GAE Datastore: Alta disponibilidade com NoSQL

  • 1. Google App Engine e NoSQL: Alta disponibilidade Giovane Liberato @ TDC 2014
  • 3. Giovane Liberato Fatec São José dos Campos, Python web developer, Comunidade,
  • 4. Google App Engine - overview
  • 5.
  • 6. Quem usa o Google App Engine? cloud.google.com/customers
  • 7. 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
  • 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
  • 10. Banco de dados colunar Row Column
  • 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()
  • 14. Modelagem de dados Schemaless Redundância de dados facilita o acesso Relações podem ser feitas, porem sem integridade referencial
  • 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
  • 27. 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
  • 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. ORM - Datastore Viewer
  • 31.
  • 32.
  • 33.
  • 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
  • 41.