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

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

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

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]