Padrões de design para Apis Rest Autoescaláveis SEM COMPLICAÇÃO QCONSP 2016 Fernando Ultremare
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 Item Aggregation order count count by status n 1 * 1 * 1 Order City State 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 1 doc = 1 tx Create Order Security Validation Regras Item Item Client Side Server Side
Roteamento 1 doc = 1 tx Create Order Security Validation Regras Add Item Security Validation Regras Add Item Security Validation Regras Client Side Server Side
Sharding High-throughput para escrita Múltiplas instâncias de persistência Shard Key Replicação Dificuldade para Joins
Sharding Create POST /orders Shard Key replicação entre shards Routing grupo de shards bye bye joins
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 espera transações nós quentes
Pipelines assíncronas Joins Views materializadas Sums, counts, avgs Baixo impacto na latência 1 write / sec Agregadores Consistência futura
Pipelines assíncronas POST /orders GET /cities GET /states status = 200 Order City State Fluxo Assíncrono
Pipelines assíncronas POST /orders GET /cities GET /states status = 200 Order City State Fluxo Assíncrono
Pipelines assíncronas POST /orders GET /cities status = 200 Order City acumuladores evitam contenção sequenciamento 1 write / sec de escrita
Pipelines assíncronas POST /orders City GET /cities Order Daily Report GET /daily Múltiplas pipelines em paralelo Monthly Report GET /monthly
Pipelines assíncronas GET /sales POST /orders Order POST /prices Price Sales Report POST /stock Stock 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 Evita capacidade ociosa Menor custo de saída infraestrutura manhã tarde noite Menor custo médio Picos inesperados tempo
Soluções e ferramentas
Na prática com o Google Cloud
Aplicação de exemplo Item Aggregation order count count by status n 1 * 1 * 1 Order City State 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 shard https://dzone.com/articles/shard-or-not-shard Appengine data pipelines https://dl.google.com/googleio/2010/app-engine-datapipelines.pdf
Referências Código fonte bit.ly/qconsp2016 YAWP! Framework yawp.io
feroult@gmail.com @feroult Obrigado!