Top Banner
Como um grande sistema REST funciona
85

Como um grande sistema REST funciona

Jul 01, 2015

Download

Technology

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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