Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 9,592 views

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 ...

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.

Statistics

Views

Total Views
9,592
Views on SlideShare
5,576
Embed Views
4,016

Actions

Likes
8
Downloads
54
Comments
0

17 Embeds 4,016

http://talleye.com 2420
http://engineering.abril.com.br 1547
http://www.linkedin.com 12
https://www.linkedin.com 8
http://coderwall.com 6
http://feeds.feedburner.com 6
http://translate.googleusercontent.com 4
http://webcache.googleusercontent.com 3
http://us-w1.rockmelt.com 2
http://talleye.com.netzcheck.com 1
http://news.google.com 1
http://engineering.abril.com.br. 1
http://digg.com 1
https://si0.twimg.com 1
http://cloud.feedly.com 1
http://www.twylah.com 1
http://placar.abril.com.br&_=1361903675734 HTTP 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

  • como um verdadeiro sistema REST funcionaLuís Cipriani@lfcipriani (twitter, linkedin, github, ...)QConSP (2012-08-04)
  • ? mestradomai/2009 nov/2009
  • bit.ly/lesterforaday
  • engineering.abril.com.brtalleye.com
  • hoje nós vamos falar sobre...
  • REST
  • de novo...
  • só que diferente...
  • Someone published a new REST API Let’s check it out!! o/
  • mmm...just another HTTP-based RPC... http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
  • às vezes as pessoas simplesmente nãoentendem um conceito...
  • às vezes as pessoas escrevem posts de blogexplicando o conceito de forma diferente...
  • às vezes as pessoasescrevem livros, fazem palestras...
  • mas isso quer dizer que elas estão erradas ou agindo de má fé?
  • jamais
  • boaarquitetura = custo aceitável + necessidades atendidas * ß MTRHß quão bem o seu cliente sabe pedir o que quer :-P MTRH mean time to recovery happiness
  • hoje nós vamos falar sobre...
  • a nossa implementaçãodo estilo arquitetural para sistemas baseados em rede proposto pelo Roy Fielding, mais conhecida como...
  • REST
  • RAIO X
  • “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 Conwayhttp://www.melconway.com/Home/Conways_Law.html
  • gráfica distribuidora educação
  • Viaje Aqui Recreio Bravo! Playboy Veja
  • Recreio Bravo!Playboy diretoria digital
  • 10 sites em produção (em ago/2012)
  • linguagens storage frameworks outros• ruby • MongoDB • rails • Solr• java • MySQL • sinatra • Hadoop • Hbase • goliath • RabbitMQ • HDFS • play • Varnish • PostgreSQL • jetty • New Relic • memcached • tokamak • redis • cachebag • browsah https://github.com/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)
  • HTTP
  • 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
  • • 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 serviço
  • data-entry • entrada da Redação • aplicação web • ~ 1 para cada domínio • “API explorer”
  • • admin do site sitetools• manipulação das áreas e templates• agiliza criação de produtos• a fronteira com o usuário• opcional
  • domínio HTTPdata-entry sitetools serviço
  • system of systems
  • REST
  • Por que escolhemos REST? image from Roy Fielding dissertation (pag. 85)
  • Porque...REST = LCODC$SS + U o_O
  • 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
  • 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
  • REST = LCODC$SS + UStateless • Visibilidade • Escalabilidade • Performance de rede (recursos alocados) • Confiabilidade
  • REST = LCODC$SS + UStateless no Alexandria • HATEOAS implementado nas APIs • cookies nas operações destrutivas
  • REST = LCODC$SS + UCache • Eficiência • Confiabilidade • Escalabilidade • Performance percebida pelo usuário
  • REST = LCODC$SS + UCache 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 = LCODC$SS + ULayered System • Encapsula complexidade • Performance • Evolvabilidade percebida pelo usuário • Simplicidade
  • REST = LCODC$SS + ULayered System no Alexandria • 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 = LCODC$SS + UCode-on-demand • Extensibilidade • Visibilidade • Simplificação do client
  • REST = LCODC$SS + UCode-on-demand no Alexandria • 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 = LCODC$SS + UUniform interface• Simplificação pela generalidade • Performance• Visibilidade percebida pelo usuário• Desacoplamento • Restrita a dados com• Evolvabilidade granularidade larga
  • REST = LCODC$SS +Uniform interface no Alexandria
  • U resource identification URI universal resource identifier
  • U resource identification /:tipo_recurso/:id
  • U resource identificationhttp://editorial.api.abril.com.br/materia/dicashttp://editorial.api.abril.com.br/materia/ac23657fghttp://bebe.abril.com.br/materia/ac23657fg
  • U resources
  • U resources{ "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)
  • U resources "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 daInglaterra", "id" : "http://editorial.api.abril.com.br/galerias_multimidia/4f0deb759d0a73284d00001e", "titulo" : "Especial viajeaqui em Londres" (continua)
  • U resources "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 deWindsor já foi sede da monarquia britânica.</p>"}
  • U representations JSON
  • U representationse um tiquinho assim de XMLou melhor,de application/opensearchdescription+xml
  • U representations<?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>
  • U hypermedia image from the book Rest in Practice (by Jim Webber) (pag. 14)
  • U hypermedia Exercício: criar uma atividade de um usuário no site. Você só sabe o entrypoint: http://socialcore.api.abril.com.br
  • U hypermedia POST  http://socialcore.api.abril.com.br/ Accept:  application/json
  • U hypermedia POST???
  • U hypermedia HTTP/1.1 405 Method Not Allowed Allow: GET
  • U hypermedia GET  http://socialcore.api.abril.com.br/ Accept:  application/json
  • U hypermediaHTTP/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" } ]}
  • U hypermediaGET  http://socialcore.api.abril.com.br/atividadeAccept:  application/json
  • U hypermediaHTTP/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" } ]}
  • U hypermediaGET  http://socialcore.api.abril.com.br/atividade/templateAccept:  application/json
  • U hypermediaHTTP/1.1 200 OKContent-Type: application/json; charset=utf-8{ "atividade": { "app": "", "created_at": "", "usuario": "", "tipo": "", "objeto": { "tipo": "" }, "resultado": { "tipo": "" } }, (continua)
  • U hypermedia "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" } ]}
  • U hypermediaPOST  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" } }}
  • U hypermediaHTTP/1.1 422 Unprocessable EntityContent-Type: application/json; charset=utf-8{ "tipo_recurso":"erro", "atividade":{ "usuario":"", }, "erros":[ {"atributo":"usuario","mensagem":["é obrigatório"]} ]}
  • U hypermediaPOST  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" } }}
  • U hypermediaHTTP/1.1 201 CreatedContent-Type: application/json; charset=utf-8Location: http://socialcore.api.abril.com.br/atividade/0922307 o/
  • U application protocol representation metadata resource metadata HTTP status codes control data
  • e a performance disso tudo aí?
  • a requisição mais rápida que o servidor executa é aquela que ele não executa
  • estratégia de cache HTTP é imprescindível bit.ly/fearlessHTTP
  • melhorando cache local
  • pontos importantes• performance dos • short stacksconnectors • evented servers• non-blocking • libs padronizadasHTTP clients client origin server• cache local• middleware • good TTL strategyarchitecture • middleware• libs padronizadas architecture
  • HTTP plumbing Connection:  Keep-­‐Alivehttp://en.wikipedia.org/wiki/HTTP_persistent_connection
  • HTTP plumbing http://en.wikipedia.org/wiki/HTTP_pipelining
  • HTTP plumbing • Extensões ao protocolo HTTP/1.1 • Full-Duplex HTTP • HTTP MPLEX • waka (Roy Fielding) • SPDY • HTTP Speed + Mobility • HTTP 2.0 • HTTPbis Working Grouphttp://berb.github.com/diploma-thesis/original/091_archtrends.html
  • e quando REST não for suficiente?
  • não use REST
  • Lições aprendidas
  • • 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 temsuas desvantagens• medir/monitorar o desempenho é importantíssimo
  • Assumimos que nossa arquitetura está válida.
  • mas... custo aceitável + necessidades atendidas * ß MTRH
  • Os responsáveis
  • • bit.ly/abril_qcon_refs• engineering.abril.com.br Obrigado!• talleye.com• digital.abril.com.br