93
como um verdadeiro sistema REST funciona Luís Cipriani @lfcipriani (twitter, linkedin, github, ...) QConSP (2012-08-04)

Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Embed Size (px)

DESCRIPTION

A palestra irá compartilhar a experiência e lições aprendidas no desenvolvimento da plataforma de publicação da Abril, um sistema distribuído com vários nós independentes que se comunicam usando REST e hypermidia. Também introduziremos alguns conceitos avançados de HTTP que podem fazer com que sistemas REST executem com melhor performance, evitando os problemas comuns de se manter uma plataforma em larga escala, com uma grande diversidade de usuários.

Citation preview

Page 1: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

como um verdadeiro sistema REST funciona

Luís Cipriani @lfcipriani (twitter, linkedin, github, ...)QConSP (2012-08-04)

Page 2: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

mai/2009 nov/2009

mestrado?

Page 4: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

engineering.abril.com.br

talleye.com

Page 5: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

hoje nós vamos falar sobre...

Page 6: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

REST

Page 7: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

de novo...

Page 8: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

só que diferente...

Page 9: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Someone published a new REST API

Let’s check it out!! \o/

Page 10: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

mmm...

just another HTTP-based RPC...http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

Page 11: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

às vezes as pessoas simplesmente não

entendem um conceito...

Page 12: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

às vezes as pessoas escrevem posts de blog

explicando o conceito de forma diferente...

Page 13: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

às vezes as pessoas escrevem livros, fazem

palestras...

Page 14: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

mas isso quer dizer que elas estão erradas ou

agindo de má fé?

Page 15: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

jamais

Page 16: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

boaarquitetura

necessidadesatendidas

custoaceitável

= + * ß

ß quão bem o seu cliente sabe pedir o que quer :-P

MTRH

MTRH mean time to recovery happiness

Page 17: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

hoje nós vamos falar sobre...

Page 18: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

a nossa implementação do estilo arquitetural para

sistemas baseados em rede proposto pelo Roy Fielding, mais conhecida

como...

Page 19: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

REST

Page 20: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

RAIO X

Page 21: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

“organizações que projetam sistemas são restritas a produzir projetos que são cópias das estruturas de

comunicação dessas organizações”

Lei de Conway

http://www.melconway.com/Home/Conways_Law.html

Page 22: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

gráfica

distribuidora

educação

Page 23: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Playboy Veja

Viaje Aqui

Recreio

Bravo!

Page 24: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

diretoria digitalPlayboy

Bravo!

Recreio

Page 25: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

10 sites em produção(em ago/2012)

Page 26: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

• MongoDB• MySQL• Hbase• HDFS• PostgreSQL• memcached• redis

• ruby• java

• rails• sinatra• goliath• play• jetty• tokamak• cachebag• browsah

linguagens storage frameworks outros

• Solr• Hadoop• RabbitMQ• Varnish• New Relic

https://github.com/abril

Page 27: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

infraestrutura Alexandria + sites

• 91 VMs para ambientes dev, qa, stage• AMC (Abril Mídia Cloud): private cloud (Xen/Open Stack)• ou VMWare

• 81 VMs + 16 físicas para produção

• Total aproximado: 188 máquinas (jun/2012)

Page 28: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

HTTP

Page 29: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

domínio

• acesso e manipulação de recursos• implementa regras de negócio• servidor HTTP + base de dados• infra “isolada”• ~ 8 domínios• ex: editorial (matérias, galerias, etc), anotações (comentários), estabelecimentos, mídia, pessoas

Page 30: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

serviço

• consumo e manipulação de recursos• servidor HTTP + (opcional base de dados)• infra “isolada”• ~ 12 serviços• ex: console, socialcore, search, Abril ID, abr.io, etc

Page 31: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

data-entry• entrada da Redação• aplicação web• ~ 1 para cada domínio• “API explorer”

Page 32: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

sitetools• admin do site• manipulação das áreas e templates• agiliza criação de produtos• a fronteira com o usuário• opcional

Page 33: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

HTTP

domínio

serviço

data-entry sitetools

Page 34: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

system of systems

Page 35: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

REST

Page 36: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Por que escolhemos REST?

image from Roy Fielding dissertation (pag. 85)

Page 37: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

REST= +LCODC$SS

Porque...

U

o_O

Page 38: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

REST= +LCODC$SS UClient-Server

• Separação de responsabilidades• Escalabilidade (simplificação)• Evolução independente

http://byterot.blogspot.co.uk/2012/06/what-i-think-coupling-is.html

Page 39: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

REST= +LCODC$SS UClient-Server no Alexandria• Separação de responsabilidades • entre domínios e sites• entre domínios e data entries• entre domínios e serviços

• Escalabilidade• funcionalidade implementada nos clients• domínios só lidam com recursos (simplicidade)

• Evolução independente• em certos pontos da arquitetura não há• falta retro-compatibilidade

Page 40: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

REST= +LCODC$SS U

• Visibilidade• Escalabilidade (recursos alocados)• Confiabilidade

• Performance de rede

Stateless

Page 41: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Stateless no Alexandria

• HATEOAS implementado nas APIs• cookies nas operações destrutivas

REST= +LCODC$SS U

Page 42: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

REST= +LCODC$SS U

• Eficiência• Escalabilidade• Performance percebida pelo usuário

• Confiabilidade

Cache

Page 43: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Cache no Alexandria

• Built-in no protocolo HTTP• shared-caches instanciados entre alguns nós• pesquisa sobre caches locais• nem todos os nós implementam estratégia de cache• purge de recursos diretamente no cache

REST= +ULCODC$SS

Page 44: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

REST= +LCODC$SS U

• Encapsula complexidade• Evolvabilidade• Simplicidade

• Performance percebida pelo usuário

Layered System

Page 45: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

• shared-caches• gateways para expor API para a Web• balanceadores de carga• encapsulamento de autenticação corporativa• encapsulamento de legado• permite evolução incremental do legado

REST= +ULCODC$SSLayered System no Alexandria

Page 46: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

REST= +LCODC$SS U

• Extensibilidade• Simplificação do client

• Visibilidade

Code-on-demand

Page 47: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

• widgets dos data-entries• no futuro, o console também será instanciado assim• é um elemento importante do REST que foi esquecido por um tempo pela nossa arquitetura

REST= +ULCODC$SSCode-on-demand no Alexandria

Page 48: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

REST= +LCODC$SS U

• Simplificação pela generalidade• Visibilidade• Desacoplamento• Evolvabilidade

• Performance percebida pelo usuário• Restrita a dados com granularidade larga

Uniform interface

Page 49: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

REST=

niform interface no Alexandria

+LCODC$SS

U

Page 50: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uresource identification

URIuniversal resource identifier

Page 51: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uresource identification

/:tipo_recurso/:id

Page 53: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uresources

Page 54: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uresources

{ "tipo_recurso" : "materia", "link" : [ { "href" : "http://editorial.api.abril.com.br/materia/4f0dea5a1e13694", "rel" : "self", "type" : "application/json" }, { "href" : "http://editorial.api.abril.com.br/materias", "rel" : "materias", "type" : "application/json" } ], "id" : "http://editorial.api.abril.com.br/materia/4f0dea5a1e13694", "slug" : "o-quintal-da-realeza", "marca" : "viajeaqui", "status" : "disponivel", "descricao_conteudo" : "O quintal da realeza", "fonte" : "viajeaqui",

(continua)

Page 55: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uresources "criacao" : { "usuario" : "Miguel Icassatti", "data" : "2012-01-11T18:00:26-02:00" }, "ultima_atualizacao" : { "usuario" : "Miguel Icassatti", "data" : "2012-01-19T16:47:18-02:00" }, "disponibilizacao" : { "usuario" : "Miguel Icassatti", "data" : "2012-01-11T18:05:44-02:00" }, "conteudos_relacionados" : [ { "slug" : "4f0deb759d0a73284d00001e", "link" : { "href" : "http://editorial.api.abril.com.br/galerias_multimidia/4f0deb759d0a73284", "rel" : "galeria_multimidia", "type" : "application/json" }, "preview" : "http://imgms.alexandria.abril.com.br/10/thumbnail-240x240-a1.jpeg", "tipo_recurso" : "galeria_multimidia", "fonte" : "viajeaqui", "credito" : "(não especificado)", "descricao" : "Fotos das atrações e estabelecimentos de Windsor, cidade da Inglaterra", "id" : "http://editorial.api.abril.com.br/galerias_multimidia/4f0deb759d0a73284d00001e", "titulo" : "Especial viajeaqui em Londres" } ],

(continua)

Page 56: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uresources

"rotulos_controlados" : [ "Londres2012" ], "tags" : [ "Londres", "restaurantes", "atrações" ], "editorias" : [ "Matérias" ], "categorias" : [ "Turismo e Lazer", "Turismo e Lazer::Cidade", "Turismo e Lazer::País" ], "autor" : "Miguel Icassatti", "titulo" : "O quintal da realeza", "chapeu" : "Windsor", "subtitulo" : "Nossa viagem pela Inglaterra tem a primeira parada na histórica Windsor.", "corpo" : "<p>Localizada às margens do rio Tâmisa, que corta também Londres, a cidade de Windsor já foi sede da monarquia britânica.</p>"}

Page 57: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Urepresentations

JSON

Page 58: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Urepresentations

e um tiquinho assim de XML

ou melhor,de application/opensearchdescription+xml

Page 59: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Urepresentations

<?xml version="1.0" encoding="UTF-8"?><OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" xmlns:grafo="http://socialcore.api.abril.com.br/grafo/busca">

<ShortName>Buscar relacionamentos</ShortName> <Description>Busca de relacionamentos no grafo</Description>

<Url type="application/json" template="http://socialcore.api.abril.com.br/grafo/busca?usuario={grafo:usuario?}&amp;tipo={grafo:tipo}"/>

<Query role="example" title="Exemplo de valores dos parâmetros" grafo:usuario="id do usuario" grafo:tipo="segue |seguido_por " />

</OpenSearchDescription>

Page 60: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uhypermedia

image from the book Rest in Practice (by Jim Webber) (pag. 14)

Page 61: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uhypermedia

Exercício: criar uma atividade de um usuário no site.

Você só sabe o entrypoint:

http://socialcore.api.abril.com.br

Page 62: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uhypermedia

POST  http://socialcore.api.abril.com.br/Accept:  application/json

Page 63: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uhypermedia

POST???

Page 64: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uhypermedia

HTTP/1.1 405 Method Not AllowedAllow: GET

Page 65: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uhypermedia

GET  http://socialcore.api.abril.com.br/Accept:  application/json

Page 66: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

UhypermediaHTTP/1.1 200 OKContent-Type: application/json; charset=utf-8{ "titulo": "socialcore", "link": [ { "href": "http://socialcore.api.abril.com.br/", "rel": "self", "type": "application/json" }, { "href": "http://socialcore.api.abril.com.br/atividade", "rel": "atividade", "type": "application/json" }, { "href": "http://socialcore.api.abril.com.br/grafo", "rel": "grafo", "type": "application/json" } ]}

Page 67: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uhypermedia

GET  http://socialcore.api.abril.com.br/atividadeAccept:  application/json

Page 68: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uhypermedia

HTTP/1.1 200 OKContent-Type: application/json; charset=utf-8{ "titulo": "Entry Point de Atividades", "link": [ { "href": "http://socialcore.api.abril.com.br/atividade/template", "rel": "template", "type": "application/json" }, { "href": "http://socialcore.api.abril.com.br/atividade/busca/descritor", "rel": "search", "type": "application/opensearchdescription+xml" }, { "href": "http://socialcore.api.abril.com.br/atividade/stat/descritor", "rel": "stat", "type": "application/opensearchdescription+xml" } ]}

Page 69: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uhypermedia

GET  http://socialcore.api.abril.com.br/atividade/templateAccept:  application/json

Page 70: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uhypermedia

HTTP/1.1 200 OKContent-Type: application/json; charset=utf-8{ "atividade": { "app": "", "created_at": "", "usuario": "", "tipo": "", "objeto": { "tipo": "" }, "resultado": { "tipo": "" } },

(continua)

Page 71: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uhypermedia

"link": [ { "href": "http://socialcore.api.abril.com.br/atividade", "rel": "atividade", "type": "application/json" }, { "href": "http://socialcore.api.abril.com.br/atividade/busca/descritor", "rel": "search", "type": "application/opensearchdescription+xml" }, { "href": "http://socialcore.api.abril.com.br/atividade/stat/descritor", "rel": "stat", "type": "application/opensearchdescription+xml" } ]}

Page 72: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

UhypermediaPOST  http://socialcore.api.abril.com.br/atividadeAccept:  application/jsonContent-­‐Type:  application/json;  charset=utf-­‐8Authentication:  Basic  37rnx9w87rjdw87gri

{ "atividade": { "app": "http://aapg.api.abril.com.br/produtos/1", "created_at": 1325086429, "tipo": "comentar", "objeto": { "descricao": "Titulo da materia", "id": "http://veja.abril.com.br/noticia/economia/confianca-da", "tipo": "materia" }, "resultado": { "corpo": "otima materia", "id": "http://veja.abril.com.br/noticia/economia/confianca-da/comments/1", "tipo": "comentario" } }}

Page 73: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uhypermedia

HTTP/1.1 422 Unprocessable EntityContent-Type: application/json; charset=utf-8{ "tipo_recurso":"erro", "atividade":{ "usuario":"", }, "erros":[ {"atributo":"usuario","mensagem":["é obrigatório"]} ]}

Page 74: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

UhypermediaPOST  http://socialcore.api.abril.com.br/atividadeAccept:  application/jsonContent-­‐Type:  application/json;  charset=utf-­‐8Authentication:  Basic  37rnx9w87rjdw87gri

{ "atividade": { "app": "http://aapg.api.abril.com.br/produtos/1", "created_at": 1325086429, "usuario": "http://aapg.api.abril.com.br/usuarios/2", "tipo": "comentar", "objeto": { "descricao": "Titulo da materia", "id": "http://veja.abril.com.br/noticia/economia/confianca-da", "tipo": "materia" }, "resultado": { "corpo": "otima materia", "id": "http://veja.abril.com.br/noticia/economia/confianca-da/comments/1", "tipo": "comentario" } }}

Page 75: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uhypermedia

HTTP/1.1 201 CreatedContent-Type: application/json; charset=utf-8Location: http://socialcore.api.abril.com.br/atividade/0922307

\o/

Page 76: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Uapplication protocol

HTTPstatus codes

representation metadataresource metadata

control data

Page 77: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

e a performance disso tudo aí?

Page 78: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

a requisição mais rápida que o servidor executa é aquela que ele não executa

Page 79: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Page 80: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

bit.ly/fearlessHTTP

estratégia de cache HTTP é imprescindível

Page 81: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

melhorando cache local

Page 82: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

pontos importantes

clientorigin server

• performance dos connectors• non-blocking HTTP clients

• cache local• middleware architecture• libs padronizadas

• short stacks• evented servers• libs padronizadas

• good TTL strategy• middleware architecture

Page 83: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

HTTP plumbing

http://en.wikipedia.org/wiki/HTTP_persistent_connection

Connection:  Keep-­‐Alive

Page 84: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

HTTP plumbing

http://en.wikipedia.org/wiki/HTTP_pipelining

Page 85: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

HTTP plumbing

http://berb.github.com/diploma-thesis/original/091_archtrends.html

• Extensões ao protocolo HTTP/1.1• Full-Duplex HTTP• HTTP MPLEX• waka (Roy Fielding)• SPDY• HTTP Speed + Mobility• HTTP 2.0• HTTPbis Working Group

Page 86: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

e quando REST não for suficiente?

Page 87: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

não use REST

Page 88: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Lições aprendidas

Page 89: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

• Lei de Postel• Seja conservador no que faz, seja liberal no que você aceita dos outros

• REST é uma arquitetura de longo prazo

• Defenda com todas as suas forças:• seus metadados (recursos)• sua interface

• Documentação é essencial

• Independência de desenvolvimento dos nós tem suas desvantagens

• medir/monitorar o desempenho é importantíssimo

Page 90: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Assumimos que nossa arquitetura está válida.

Page 91: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

necessidadesatendidas

custoaceitável + * ß

MTRH

mas...

Page 92: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

Os responsáveis

Page 93: Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

• bit.ly/abril_qcon_refs

• engineering.abril.com.br

• talleye.com

• digital.abril.com.br

Obrigado!