43
Apis Rest Autoescaláveis Padrões de design para QCONSP 2016 Fernando Ultremare SEM COMPLICAÇÃO

Padrões de design para APIs REST autoescaláveis sem complicação

Embed Size (px)

Citation preview

Page 1: Padrões de design para APIs REST autoescaláveis sem complicação

Apis Rest AutoescaláveisPadrões de design para

QCONSP 2016

Fernando Ultremare

SEM COMPLICAÇÃO

Page 2: Padrões de design para APIs REST autoescaláveis sem complicação

About me

• Full-stack developer desde 1998

• Gerente geral de projetos na Dextra Sistemas

• Criador do YAWP! Framework

@feroult

Page 3: Padrões de design para APIs REST autoescaláveis sem complicação
Page 4: Padrões de design para APIs REST autoescaláveis sem complicação

Agenda

• Introdução

• Padrões de design

• Automação de ambientes

• Na prática com o Google Cloud

• Projetos reais & referências

Page 5: Padrões de design para APIs REST autoescaláveis sem complicação

Introdução

Page 6: Padrões de design para APIs REST autoescaláveis sem complicação

APIs everywhere

• Web, mobile, microservices

• Grande número de usuários

• Grande volume de dados

• Novos requisitos de escalabilidade

Page 7: Padrões de design para APIs REST autoescaláveis sem complicação

Exemplos de aplicações

• Global Apps

Facebook, Twitter, Gmail

• Apps para consumidores

Pedidos on-line, banking,e-commerce

Page 8: Padrões de design para APIs REST autoescaláveis sem complicação

Escalabilidade vertical

• Instâncias mais caras

• Dados em memória

• Ponto único de gargalo

• Menor complexidade

Page 9: Padrões de design para APIs REST autoescaláveis sem complicação

Escalabilidade horizontal

• Instâncias mais baratas

• Dados distribuídos

• Gargalo distribuído

• Maior complexidade

Page 10: Padrões de design para APIs REST autoescaláveis sem complicação

Pode ser bem difícil

• Sistemas distribuídos

• Consistência eventual

• “Ausência” de Joins

• Automação de ambientes

Page 11: Padrões de design para APIs REST autoescaláveis sem complicação

Padrões de design

Page 12: Padrões de design para APIs REST autoescaláveis sem complicação

Aplicação de exemplo

Order City State

Item

* 1* 1

1n

Aggregationorder count

count by status

status: created

prepared delivered

Page 13: Padrões de design para APIs REST autoescaláveis sem complicação

Aplicação de exemplo

• Código fonte

bit.ly/qconsp2016

Page 14: Padrões de design para APIs REST autoescaláveis sem complicação

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

Page 15: Padrões de design para APIs REST autoescaláveis sem complicação

Roteamento

Client Side Server Side

Security

Validation

Regras

OrderItem Item

Create

1 doc = 1 tx

Page 16: Padrões de design para APIs REST autoescaláveis sem complicação

Roteamento

Client Side

Add

Server Side

Security Validation RegrasOrderCreate

Item

Add Item

Security Validation Regras

Security Validation Regras

1 doc = 1 tx

Page 17: Padrões de design para APIs REST autoescaláveis sem complicação

Sharding

• High-throughput para escrita

• Múltiplas instâncias de persistência

• Shard Key

• Replicação

• Dificuldade para Joins

Page 18: Padrões de design para APIs REST autoescaláveis sem complicação

Sharding

POST /orders

Routing

Create Shard Key

replicaçãoentre shards

bye bye joins

grupo deshards

Page 19: Padrões de design para APIs REST autoescaláveis sem complicação

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

Page 20: Padrões de design para APIs REST autoescaláveis sem complicação

Consultas e consistência eventual

Page 21: Padrões de design para APIs REST autoescaláveis sem complicação

Consultas e consistência eventual

GET /orders?city=sao-paulo

nós quentes

replicação futura

Page 22: Padrões de design para APIs REST autoescaláveis sem complicação

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

Page 23: Padrões de design para APIs REST autoescaláveis sem complicação

Consultas e consistência forte

Page 24: Padrões de design para APIs REST autoescaláveis sem complicação

Consultas e consistência forte

GET /orders?city=sao-paulo

nós quentes

espera transações

Page 25: Padrões de design para APIs REST autoescaláveis sem complicação

Pipelines assíncronas

• “Joins” ➝ Views materializadas

• Sums, counts, avgs

• Baixo impacto na latência

• 1 write / sec ➝ Agregadores

• Consistência futura

Page 26: Padrões de design para APIs REST autoescaláveis sem complicação

Pipelines assíncronas

Order City State

POST /orders

status = 200

GET /cities GET /states

Fluxo Assíncrono

Page 27: Padrões de design para APIs REST autoescaláveis sem complicação

Pipelines assíncronas

Order City State

POST /orders GET /cities GET /states

status = 200

Fluxo Assíncrono

Page 28: Padrões de design para APIs REST autoescaláveis sem complicação

Pipelines assíncronas

POST /orders

acumuladoresevitam contenção

de escrita

Order

status = 200

City

GET /cities

sequenciamento 1 write / sec

Page 29: Padrões de design para APIs REST autoescaláveis sem complicação

Pipelines assíncronas

City

Daily Report

Monthly Report

Múltiplas pipelines em paralelo

GET /cities

GET /daily

GET /monthly

POST /orders

Order

Page 30: Padrões de design para APIs REST autoescaláveis sem complicação

Pipelines assíncronas

Order

Price

Stock

POST /orders

POST /prices

POST /stock

Sales Report

GET /sales

Pipelines convergentes (Joins)

Page 31: Padrões de design para APIs REST autoescaláveis sem complicação

Automação de ambientes

Page 32: Padrões de design para APIs REST autoescaláveis sem complicação

Automação

• Cloud intensive

• Todas as camadas

Front / back-end instances, BD, filas, cache

• Scale Up, Scale Down (elástico)

Page 33: Padrões de design para APIs REST autoescaláveis sem complicação

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

Page 34: Padrões de design para APIs REST autoescaláveis sem complicação

Soluções e ferramentas

Page 35: Padrões de design para APIs REST autoescaláveis sem complicação

Na prática com o Google Cloud

Page 36: Padrões de design para APIs REST autoescaláveis sem complicação

Aplicação de exemplo

Order City State

Item

* 1* 1

1n

Aggregationorder count

count by status

status: created

prepared delivered

Page 37: Padrões de design para APIs REST autoescaláveis sem complicação
Page 38: Padrões de design para APIs REST autoescaláveis sem complicação

Projetos reais & referências

Page 39: Padrões de design para APIs REST autoescaláveis sem complicação

Projetos reais

• Pense duas vezes…

• High-throughput

• Dados >> memória

• Simples o suficiente (why not?)

Page 40: Padrões de design para APIs REST autoescaláveis sem complicação

Projetos reais

• Vendas / CRM organização de eventos

• Delivery de comida

Page 41: Padrões de design para APIs REST autoescaláveis sem complicação

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

Page 42: Padrões de design para APIs REST autoescaláveis sem complicação

Referências

• Código fontebit.ly/qconsp2016

• YAWP! Framework yawp.io

Page 43: Padrões de design para APIs REST autoescaláveis sem complicação

Obrigado!@[email protected]