como um grande sistema rest funciona

85
Como um grande sistema REST funciona

Upload: david-robert-camargo-campos

Post on 01-Jul-2015

650 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Como um grande sistema REST funciona

Como um grande sistema REST

funciona

Page 2: Como um grande sistema REST funciona

David [email protected]

twitter: while42github: davidrobert

Page 3: Como um grande sistema REST funciona
Page 4: Como um grande sistema REST funciona

AMBIENTE

Page 5: Como um grande sistema REST funciona
Page 6: Como um grande sistema REST funciona

gráfica

distribuidora

educação

Page 7: Como um grande sistema REST funciona

Playboy Veja

Quatro Rodas

Super Interessante

Placar

Page 8: Como um grande sistema REST funciona

“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 9: Como um grande sistema REST funciona

CMS’s existem desde os anos 90.

Por que reiventamos a roda?

Page 10: Como um grande sistema REST funciona

Porque temos alta

diversidade de

requisitosnegóciospessoas

orçamentosprioridades

culturas{

Page 11: Como um grande sistema REST funciona

boaarquitetu

ra

necessidadesatendidas

custoaceitável

= + *ß

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

MTRH

MTRHmean time to recovery happiness

Page 12: Como um grande sistema REST funciona
Page 13: Como um grande sistema REST funciona

diretoria digitalPlayboy

Veja

Quatro Rodas

Page 14: Como um grande sistema REST funciona

RAIO X

Page 15: Como um grande sistema REST funciona

16 sites em produção

Page 16: Como um grande sistema REST funciona

+/- 60 desenvolvedores13 arquitetos de software

6 Gerentes de Projeto4 Gerentes de Produto

1 Advocate da Plataforma

Page 17: Como um grande sistema REST funciona

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

• ruby• java• javascript

• rails• sinatra• goliath• node.js• play• jetty• tokamak• cachebag• HTTPMonkey

linguagens storage frameworks outros

• Solr• Hadoop• RabbitMQ• Varnish• New Relic

https://github.com/abril

Page 18: Como um grande sistema REST funciona

infraestrutura Alexandria + sites

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

• ~100 VMs + 20 físicas para produção• Data center próprio, AWS, Heroku

• Total aproximado: 220 máquinas

Page 19: Como um grande sistema REST funciona

+15 milhões de pageviews(de jan até fev de 2013)

Page 20: Como um grande sistema REST funciona

HTTP

Page 21: Como um grande sistema REST funciona

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 22: Como um grande sistema REST funciona

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 23: Como um grande sistema REST funciona

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

Page 24: Como um grande sistema REST funciona
Page 25: Como um grande sistema REST funciona

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

Page 26: Como um grande sistema REST funciona
Page 27: Como um grande sistema REST funciona

HTTP

domínio

serviço

data-entry sitetools

Page 28: Como um grande sistema REST funciona

system of systems

Page 29: Como um grande sistema REST funciona

REST

Page 30: Como um grande sistema REST funciona

Por que escolhemos REST?

• Protocolo de transferência amplamente utilizado

• Escalabilidade• Performance alta• Alta disponibilidade• Permitir evolução sem parar o sistema• Permitir evolução sem quebrar os

clientes• Segurança

Page 31: Como um grande sistema REST funciona

Por que escolhemos REST?

• HTTP• Escalabilidade• Performance alta• Alta disponibilidade• Permitir evolução sem parar o sistema• Permitir evolução sem quebrar os

clientes• Segurança

Page 32: Como um grande sistema REST funciona

Por que escolhemos REST?

• HTTP• Web Caches• Performance alta• Alta disponibilidade• Permitir evolução sem parar o sistema• Permitir evolução sem quebrar os

clientes• Segurança

Page 33: Como um grande sistema REST funciona

Por que escolhemos REST?

• HTTP• Web Caches• Web Proxies (localização geografica)• Alta disponibilidade• Permitir evolução sem parar o sistema• Permitir evolução sem quebrar os

clientes• Segurança

Page 34: Como um grande sistema REST funciona

Por que escolhemos REST?

• HTTP• Web Caches• Web Proxies (localização geografica)• Load Balancers “comoditizados”• Permitir evolução sem parar o sistema• Permitir evolução sem quebrar os

clientes• Segurança

Page 35: Como um grande sistema REST funciona

Por que escolhemos REST?

• HTTP• Web Caches• Web Proxies (localização geografica)• Load Balancers “comoditizados”• Load Balancers• Permitir evolução sem quebrar os

clientes• Segurança

Page 36: Como um grande sistema REST funciona

Por que escolhemos REST?

• HTTP• Web Caches• Web Proxies (localização geografica)• Load Balancers “comoditizados”• Load Balancers• HTML, JSON, XML• Segurança

Page 37: Como um grande sistema REST funciona

Por que escolhemos REST?

• HTTP• Web Caches• Web Proxies (localização geografica)• Load Balancers “comoditizados”• Load Balancers• HTML, JSON, XML• HTTPS / TLS

Page 38: Como um grande sistema REST funciona

REST = +LCODC$SS

Porque...

U

o_O

Page 39: Como um grande sistema REST funciona

REST = +LCODC$SS

Porque...

ULayered-Code on Demand-Client-Cache-Stateless-Server

Page 40: Como um grande sistema REST funciona

REST = +LCODC$SS U

Client-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 41: Como um grande sistema REST funciona

REST = +LCODC$SS U

Client-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 42: Como um grande sistema REST funciona

REST = +LCODC$SS U

• Visibilidade• Escalabilidade (recursos alocados)• Confiabilidade

• Performance de rede

Stateless

Page 43: Como um grande sistema REST funciona

Stateless no Alexandria

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

REST = +LCODC$SS U

Page 44: Como um grande sistema REST funciona

REST = +LCODC$SS U

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

• Confiabilidade

Cache

Page 45: Como um grande sistema REST funciona

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 46: Como um grande sistema REST funciona

REST = +LCODC$SS U

• Encapsula complexidade• Evolvabilidade• Simplicidade

• Performance percebida pelo usuário

Layered System

Page 47: Como um grande sistema REST funciona

• 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$SS

Layered System no Alexandria

Page 48: Como um grande sistema REST funciona

REST = +LCODC$SS U

• Extensibilidade• Simplificação do client

• Visibilidade

Code-on-demand

Page 49: Como um grande sistema REST funciona

• 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$SS

Code-on-demand no Alexandria

Page 50: Como um grande sistema REST funciona

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 51: Como um grande sistema REST funciona

REST =

niform interface no Alexandria

+LCODC$SS

U

Page 52: Como um grande sistema REST funciona

Uresource identification

URIuniversal resource identifier

Page 53: Como um grande sistema REST funciona

Uresource identification

/:tipo_recurso/:id

Page 54: Como um grande sistema REST funciona

Uresource identification

http://editorial.api.abril.com.br/materia/dicas

http://editorial.api.abril.com.br/materia/ac23657fg

http://bebe.abril.com.br/materia/ac23657fg

Page 55: Como um grande sistema REST funciona

Uresources

Page 56: Como um grande sistema REST funciona

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 57: Como um grande sistema REST funciona

Urepresentations

JSON

Page 58: Como um grande sistema REST funciona

Urepresentations

e um tiquinho assim de XML

ou melhor,de application/opensearchdescription+xml

Page 59: Como um grande sistema REST funciona

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 grande sistema REST funciona

Uhypermedia

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

Você só sabe o entrypoint:

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

Page 61: Como um grande sistema REST funciona

Uhypermedia

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

Page 62: Como um grande sistema REST funciona

Uhypermedia

POST???

Page 63: Como um grande sistema REST funciona

Uhypermedia

HTTP/1.1 405 Method Not AllowedAllow: GET

Page 64: Como um grande sistema REST funciona

Uhypermedia

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

Page 65: Como um grande sistema REST funciona

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 66: Como um grande sistema REST funciona

Uhypermedia

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

Page 67: Como um grande sistema REST funciona

UhypermediaHTTP/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 68: Como um grande sistema REST funciona

Uhypermedia

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

Page 69: Como um grande sistema REST funciona

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

Page 70: Como um grande sistema REST funciona

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 71: Como um grande sistema REST funciona

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 72: Como um grande sistema REST funciona

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 73: Como um grande sistema REST funciona

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 74: Como um grande sistema REST funciona

Uhypermedia

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

\o/

Page 75: Como um grande sistema REST funciona

Uapplication protocol

HTTPstatus codes

representation metadataresource metadata

control data

Page 76: Como um grande sistema REST funciona

Lições aprendidas

Page 77: Como um grande sistema REST funciona

pontos importantes em performance

client origin 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

• caches• HTTP plumbing

Page 78: Como um grande sistema REST funciona

• 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 79: Como um grande sistema REST funciona

Assumimos que nossa arquitetura está válida.

Page 80: Como um grande sistema REST funciona

necessidadesatendidas

custoaceitável+ * ß

MTRH

mas...

Page 81: Como um grande sistema REST funciona

e quando REST não for

suficiente?

Page 82: Como um grande sistema REST funciona

não use REST

Page 83: Como um grande sistema REST funciona

Os responsáveis

Page 84: Como um grande sistema REST funciona

PERGUNTAS ?

Page 85: Como um grande sistema REST funciona

engineering.abril.com.brdigital.abril.com.br

Obrigado!

David Robert