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

15,232 views
15,323 views

Published on

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.

Published in: Technology

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

  1. 1. como um verdadeiro sistema REST funcionaLuís Cipriani@lfcipriani (twitter, linkedin, github, ...)QConSP (2012-08-04)
  2. 2. ? mestradomai/2009 nov/2009
  3. 3. bit.ly/lesterforaday
  4. 4. engineering.abril.com.brtalleye.com
  5. 5. hoje nós vamos falar sobre...
  6. 6. REST
  7. 7. de novo...
  8. 8. só que diferente...
  9. 9. Someone published a new REST API Let’s check it out!! o/
  10. 10. mmm...just another HTTP-based RPC... http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
  11. 11. às vezes as pessoas simplesmente nãoentendem um conceito...
  12. 12. às vezes as pessoas escrevem posts de blogexplicando o conceito de forma diferente...
  13. 13. às vezes as pessoasescrevem livros, fazem palestras...
  14. 14. mas isso quer dizer que elas estão erradas ou agindo de má fé?
  15. 15. jamais
  16. 16. 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
  17. 17. hoje nós vamos falar sobre...
  18. 18. a nossa implementaçãodo estilo arquitetural para sistemas baseados em rede proposto pelo Roy Fielding, mais conhecida como...
  19. 19. REST
  20. 20. RAIO X
  21. 21. “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
  22. 22. gráfica distribuidora educação
  23. 23. Viaje Aqui Recreio Bravo! Playboy Veja
  24. 24. Recreio Bravo!Playboy diretoria digital
  25. 25. 10 sites em produção (em ago/2012)
  26. 26. 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
  27. 27. 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)
  28. 28. HTTP
  29. 29. 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
  30. 30. • 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
  31. 31. data-entry • entrada da Redação • aplicação web • ~ 1 para cada domínio • “API explorer”
  32. 32. • admin do site sitetools• manipulação das áreas e templates• agiliza criação de produtos• a fronteira com o usuário• opcional
  33. 33. domínio HTTPdata-entry sitetools serviço
  34. 34. system of systems
  35. 35. REST
  36. 36. Por que escolhemos REST? image from Roy Fielding dissertation (pag. 85)
  37. 37. Porque...REST = LCODC$SS + U o_O
  38. 38. 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
  39. 39. 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
  40. 40. REST = LCODC$SS + UStateless • Visibilidade • Escalabilidade • Performance de rede (recursos alocados) • Confiabilidade
  41. 41. REST = LCODC$SS + UStateless no Alexandria • HATEOAS implementado nas APIs • cookies nas operações destrutivas
  42. 42. REST = LCODC$SS + UCache • Eficiência • Confiabilidade • Escalabilidade • Performance percebida pelo usuário
  43. 43. 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
  44. 44. REST = LCODC$SS + ULayered System • Encapsula complexidade • Performance • Evolvabilidade percebida pelo usuário • Simplicidade
  45. 45. 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
  46. 46. REST = LCODC$SS + UCode-on-demand • Extensibilidade • Visibilidade • Simplificação do client
  47. 47. 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
  48. 48. REST = LCODC$SS + UUniform interface• Simplificação pela generalidade • Performance• Visibilidade percebida pelo usuário• Desacoplamento • Restrita a dados com• Evolvabilidade granularidade larga
  49. 49. REST = LCODC$SS +Uniform interface no Alexandria
  50. 50. U resource identification URI universal resource identifier
  51. 51. U resource identification /:tipo_recurso/:id
  52. 52. U resource identificationhttp://editorial.api.abril.com.br/materia/dicashttp://editorial.api.abril.com.br/materia/ac23657fghttp://bebe.abril.com.br/materia/ac23657fg
  53. 53. U resources
  54. 54. 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)
  55. 55. 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)
  56. 56. 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>"}
  57. 57. U representations JSON
  58. 58. U representationse um tiquinho assim de XMLou melhor,de application/opensearchdescription+xml
  59. 59. 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>
  60. 60. U hypermedia image from the book Rest in Practice (by Jim Webber) (pag. 14)
  61. 61. U hypermedia Exercício: criar uma atividade de um usuário no site. Você só sabe o entrypoint: http://socialcore.api.abril.com.br
  62. 62. U hypermedia POST  http://socialcore.api.abril.com.br/ Accept:  application/json
  63. 63. U hypermedia POST???
  64. 64. U hypermedia HTTP/1.1 405 Method Not Allowed Allow: GET
  65. 65. U hypermedia GET  http://socialcore.api.abril.com.br/ Accept:  application/json
  66. 66. 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" } ]}
  67. 67. U hypermediaGET  http://socialcore.api.abril.com.br/atividadeAccept:  application/json
  68. 68. 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" } ]}
  69. 69. U hypermediaGET  http://socialcore.api.abril.com.br/atividade/templateAccept:  application/json
  70. 70. U hypermediaHTTP/1.1 200 OKContent-Type: application/json; charset=utf-8{ "atividade": { "app": "", "created_at": "", "usuario": "", "tipo": "", "objeto": { "tipo": "" }, "resultado": { "tipo": "" } }, (continua)
  71. 71. 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" } ]}
  72. 72. 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" } }}
  73. 73. U hypermediaHTTP/1.1 422 Unprocessable EntityContent-Type: application/json; charset=utf-8{ "tipo_recurso":"erro", "atividade":{ "usuario":"", }, "erros":[ {"atributo":"usuario","mensagem":["é obrigatório"]} ]}
  74. 74. 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" } }}
  75. 75. U hypermediaHTTP/1.1 201 CreatedContent-Type: application/json; charset=utf-8Location: http://socialcore.api.abril.com.br/atividade/0922307 o/
  76. 76. U application protocol representation metadata resource metadata HTTP status codes control data
  77. 77. e a performance disso tudo aí?
  78. 78. a requisição mais rápida que o servidor executa é aquela que ele não executa
  79. 79. estratégia de cache HTTP é imprescindível bit.ly/fearlessHTTP
  80. 80. melhorando cache local
  81. 81. 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
  82. 82. HTTP plumbing Connection:  Keep-­‐Alivehttp://en.wikipedia.org/wiki/HTTP_persistent_connection
  83. 83. HTTP plumbing http://en.wikipedia.org/wiki/HTTP_pipelining
  84. 84. 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
  85. 85. e quando REST não for suficiente?
  86. 86. não use REST
  87. 87. Lições aprendidas
  88. 88. • 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
  89. 89. Assumimos que nossa arquitetura está válida.
  90. 90. mas... custo aceitável + necessidades atendidas * ß MTRH
  91. 91. Os responsáveis
  92. 92. • bit.ly/abril_qcon_refs• engineering.abril.com.br Obrigado!• talleye.com• digital.abril.com.br

×