padrões de design para apis rest autoescaláveis sem complicação
Post on 16-Apr-2017
600 Views
Preview:
TRANSCRIPT
Apis Rest AutoescaláveisPadrões de design para
QCONSP 2016
Fernando Ultremare
SEM COMPLICAÇÃO
About me
• Full-stack developer desde 1998
• Gerente geral de projetos na Dextra Sistemas
• Criador do YAWP! Framework
@feroult
Agenda
• Introdução
• Padrões de design
• Automação de ambientes
• Na prática com o Google Cloud
• Projetos reais & referências
Introdução
APIs everywhere
• Web, mobile, microservices
• Grande número de usuários
• Grande volume de dados
• Novos requisitos de escalabilidade
Exemplos de aplicações
• Global Apps
Facebook, Twitter, Gmail
• Apps para consumidores
Pedidos on-line, banking,e-commerce
Escalabilidade vertical
• Instâncias mais caras
• Dados em memória
• Ponto único de gargalo
• Menor complexidade
Escalabilidade horizontal
• Instâncias mais baratas
• Dados distribuídos
• Gargalo distribuído
• Maior complexidade
Pode ser bem difícil
• Sistemas distribuídos
• Consistência eventual
• “Ausência” de Joins
• Automação de ambientes
Padrões de design
Aplicação de exemplo
Order City State
Item
* 1* 1
1n
Aggregationorder count
count by status
status: created
prepared delivered
Aplicação de exemplo
• Código fonte
bit.ly/qconsp2016
Roteamento
• Stateless requests ➝ No client affinity
• Baixa latência ➝
Evite grandes sequências server-side
Chamadas assíncronas (outros serviços)
Use cache intensivamente
• Evite locks ➝ 1 doc = 1 transação
Roteamento
Client Side Server Side
Security
Validation
Regras
OrderItem Item
Create
1 doc = 1 tx
Roteamento
Client Side
Add
Server Side
Security Validation RegrasOrderCreate
Item
Add Item
Security Validation Regras
Security Validation Regras
1 doc = 1 tx
Sharding
• High-throughput para escrita
• Múltiplas instâncias de persistência
• Shard Key
• Replicação
• Dificuldade para Joins
Sharding
POST /orders
Routing
Create Shard Key
replicaçãoentre shards
bye bye joins
grupo deshards
Consultas e consistência eventual
• High-throughput para leitura
• Shard Groups com menos carga
• Nós podem estar desatualizados
Eventual ➝ Possível mas incerto
Eventually ➝ At an unspecified future time
Consultas e consistência eventual
Consultas e consistência eventual
GET /orders?city=sao-paulo
nós quentes
replicação futura
Consultas e consistência forte
• Consultas por chave
• Grupos de documentos por chave pai
• Alterações até o momento ➝ Locks
• Mantenha grupos “User Sized”
• ~ 1 write / sec
Consultas e consistência forte
Consultas e consistência forte
GET /orders?city=sao-paulo
nós quentes
espera transações
Pipelines assíncronas
• “Joins” ➝ Views materializadas
• Sums, counts, avgs
• Baixo impacto na latência
• 1 write / sec ➝ Agregadores
• Consistência futura
Pipelines assíncronas
Order City State
POST /orders
status = 200
GET /cities GET /states
Fluxo Assíncrono
Pipelines assíncronas
Order City State
POST /orders GET /cities GET /states
status = 200
Fluxo Assíncrono
Pipelines assíncronas
POST /orders
acumuladoresevitam contenção
de escrita
Order
status = 200
City
GET /cities
sequenciamento 1 write / sec
Pipelines assíncronas
City
Daily Report
Monthly Report
Múltiplas pipelines em paralelo
GET /cities
GET /daily
GET /monthly
POST /orders
Order
Pipelines assíncronas
Order
Price
Stock
POST /orders
POST /prices
POST /stock
Sales Report
GET /sales
Pipelines convergentes (Joins)
Automação de ambientes
Automação
• Cloud intensive
• Todas as camadas
Front / back-end instances, BD, filas, cache
• Scale Up, Scale Down (elástico)
Scale up and down
tempo
infra
estru
tura
manhã
tarde
noite
• Evita capacidade ociosa
• Menor custo de saída
• Menor custo médio
• Picos inesperados
Soluções e ferramentas
Na prática com o Google Cloud
Aplicação de exemplo
Order City State
Item
* 1* 1
1n
Aggregationorder count
count by status
status: created
prepared delivered
Projetos reais & referências
Projetos reais
• Pense duas vezes…
• High-throughput
• Dados >> memória
• Simples o suficiente (why not?)
Projetos reais
• Vendas / CRM organização de eventos
• Delivery de comida
Referências
• Design for Scale (Appengine) https://cloud.google.com/appengine/articles/scalability
• Shard or not shardhttps://dzone.com/articles/shard-or-not-shard
• Appengine data pipelineshttps://dl.google.com/googleio/2010/app-engine-data-pipelines.pdf
Referências
• Código fontebit.ly/qconsp2016
• YAWP! Framework yawp.io
Obrigado!@feroultferoult@gmail.com
top related