google app engine e nosql: alta disponibilidade

Post on 12-Jan-2015

312 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

O datastore é sem dúvidas um dos protagonistas da plataforma de aplicativos do google, o Google App Engine, quando falamos em disponibilidade. O objetivo desta palestra é mostrar todos os detalhes do BigTable, desde sua estrutura interna, operadores e tipos de queries, custo e modelagem de dados.

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