Successfully reported this slideshow.

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

21

Share

1 of 93
1 of 93

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

21

Share

Download to read offline

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.

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.

More Related Content

Related Books

Free with a 14 day trial from Scribd

See all

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

  1. 1. como um verdadeiro sistema REST funciona Luís Cipriani @lfcipriani (twitter, linkedin, github, ...) QConSP (2012-08-04)
  2. 2. ? mestrado mai/2009 nov/2009
  3. 3. bit.ly/lesterforaday
  4. 4. engineering.abril.com.br talleye.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ão entendem um conceito...
  12. 12. às vezes as pessoas escrevem posts de blog explicando o conceito de forma diferente...
  13. 13. às vezes as pessoas escrevem livros, fazem palestras...
  14. 14. mas isso quer dizer que elas estão erradas ou agindo de má fé?
  15. 15. jamais
  16. 16. boa arquitetura = 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ção do 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 Conway http://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 HTTP data-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 + 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
  39. 39. 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
  40. 40. REST = LCODC$SS + U Stateless • Visibilidade • Escalabilidade • Performance de rede (recursos alocados) • Confiabilidade
  41. 41. REST = LCODC$SS + U Stateless no Alexandria • HATEOAS implementado nas APIs • cookies nas operações destrutivas
  42. 42. REST = LCODC$SS + U Cache • Eficiência • Confiabilidade • Escalabilidade • Performance percebida pelo usuário
  43. 43. REST = LCODC$SS + U 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
  44. 44. REST = LCODC$SS + U Layered System • Encapsula complexidade • Performance • Evolvabilidade percebida pelo usuário • Simplicidade
  45. 45. REST = LCODC$SS + U Layered 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 + U Code-on-demand • Extensibilidade • Visibilidade • Simplificação do client
  47. 47. REST = LCODC$SS + U Code-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 + U Uniform 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 identification http://editorial.api.abril.com.br/materia/dicas http://editorial.api.abril.com.br/materia/ac23657fg http://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 da Inglaterra", "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 de Windsor já foi sede da monarquia britânica.</p>" }
  57. 57. U representations JSON
  58. 58. U representations e um tiquinho assim de XML ou 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 hypermedia HTTP/1.1 200 OK Content-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 hypermedia GET  http://socialcore.api.abril.com.br/atividade Accept:  application/json
  68. 68. U hypermedia HTTP/1.1 200 OK Content-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 hypermedia GET  http://socialcore.api.abril.com.br/atividade/template Accept:  application/json
  70. 70. U hypermedia HTTP/1.1 200 OK Content-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 hypermedia POST  http://socialcore.api.abril.com.br/atividade Accept:  application/json Content-­‐Type:  application/json;  charset=utf-­‐8 Authentication:  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 hypermedia HTTP/1.1 422 Unprocessable Entity Content-Type: application/json; charset=utf-8 { "tipo_recurso":"erro", "atividade":{ "usuario":"", }, "erros":[ {"atributo":"usuario","mensagem":["é obrigatório"]} ] }
  74. 74. U hypermedia POST  http://socialcore.api.abril.com.br/atividade Accept:  application/json Content-­‐Type:  application/json;  charset=utf-­‐8 Authentication:  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 hypermedia HTTP/1.1 201 Created Content-Type: application/json; charset=utf-8 Location: 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 stacks connectors • evented servers • non-blocking • libs padronizadas HTTP clients client origin server • cache local • middleware • good TTL strategy architecture • middleware • libs padronizadas architecture
  82. 82. HTTP plumbing Connection:  Keep-­‐Alive http://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 Group http://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 tem suas 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

×