0
Alexandria: um Sistema de  Sistemas para Publicação de  Conteúdo Digital utilizando       REST e HipermídiaLuís Cipriani@l...
engineering.abril.com.brtalleye.com
hoje nós vamos falar sobre...
REST
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
por que há tanto mal entendimento em  relação ao REST?
quem entende errado, está    fazendo errado?
boaarquitetura   =                       custo                      aceitável   +   necessidades                          ...
hoje nós vamos falar sobre...
a nossa implementaçãodo estilo arquitetural para   sistemas baseados em rede proposto pelo Roy Fielding, mais conhecida   ...
REST
RAIO X
“organizações que projetam sistemas são restritas a        produzir projetos que são cópias das estruturas de             ...
gráfica         distribuidora                     educação
Viaje Aqui             Recreio                              Bravo! Playboy               Veja
CMS’s existem desde os anos 90. Por que reiventamos a roda?
{                       requisitos                        negócios Porque temos            pessoasalta diversidade       o...
Recreio          Bravo!Playboy                             diretoria digital
14 sites em produção       (em abr/2013)
50 desenvolvedores12 arquitetos de software  6 Gerentes de Projeto 4 Gerentes de Produto1 Advocate da Plataforma         (...
linguagens      storage      frameworks       outros• ruby         • MongoDB      • rails        • Solr• java         • My...
infraestrutura Alexandria + sites• 91 VMs para ambientes dev, qa, stage  • AMC (Abril Mídia Cloud): private cloud (Xen/Ope...
12,5 milhões de pageviews       (de 15/jan até 14/fev de 2013)
HTTP
domínio• acesso e manipulação de recursos• implementa regras de negócio• servidor HTTP + base de dados• infra “isolada”• ~...
• consumo e manipulação de recursos• servidor HTTP + (opcional base de dados)• infra “isolada”• ~ 12 serviços• ex: console...
data-entry             • entrada da Redação             • aplicação web             • ~ 1 para cada domínio             • ...
• admin do site                       sitetools• manipulação das áreas e templates• agiliza criação de produtos• a frontei...
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    ...
REST = LCODC$SS + UClient-Server no Alexandria • Separação de responsabilidades     • entre domínios e sites     • entre d...
REST = LCODC$SS + UStateless    • Visibilidade    • Escalabilidade      • Performance de rede    (recursos alocados)    • ...
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 • pesqui...
REST = LCODC$SS + ULayered System • Encapsula complexidade   • Performance • Evolvabilidade           percebida pelo usuár...
REST = LCODC$SS + ULayered System no Alexandria • shared-caches • gateways para expor API para a Web • balanceadores de ca...
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 ...
REST = LCODC$SS + UUniform interface• Simplificação pela generalidade   • Performance• Visibilidade                     per...
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/ac23657fg...
U resources
U resources{    "tipo_recurso" : "materia",    "link" : [        {            "href" : "http://editorial.api.abril.com.br/...
U resources  "criacao" : {       "usuario" : "Miguel Icassatti",       "data" : "2012-01-11T18:00:26-02:00"  },  "ultima_a...
U resources  "rotulos_controlados" : [      "Londres2012"  ],  "tags" : [      "Londres",      "restaurantes",      "atraÃ...
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/"...
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....
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": [        {...
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",    "li...
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": "",        "crea...
U hypermedia    "link": [        {            "href": "http://socialcore.api.abril.com.br/atividade",            "rel": "a...
U hypermediaPOST	  http://socialcore.api.abril.com.br/atividadeAccept:	  application/jsonContent-­‐Type:	  application/jso...
U hypermediaHTTP/1.1 422 Unprocessable EntityContent-Type: application/json; charset=utf-8{   "tipo_recurso":"erro",   "at...
U hypermediaPOST	  http://socialcore.api.abril.com.br/atividadeAccept:	  application/jsonContent-­‐Type:	  application/jso...
U hypermediaHTTP/1.1 201 CreatedContent-Type: application/json; charset=utf-8Location: http://socialcore.api.abril.com.br/...
U application protocol                      representation metadata resource metadata     HTTP       status codes         ...
Lições aprendidas
pontos importantes em performance• performance dos                      • short stacksconnectors                          ...
• Lei de Postel   • Seja conservador no que faz, seja liberal no que você aceita dos outros• REST é uma arquitetura de lon...
Assumimos que nossa arquitetura está válida.
mas...          custo         aceitável   +   necessidades                          atendidas                             ...
e quando REST não   for suficiente?
não use REST
Os responsáveis
• bit.ly/abril_qcon_refs• engineering.abril.com.br   Obrigado!• talleye.com• digital.abril.com.br
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utilizando REST e Hípermídia.
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utilizando REST e Hípermídia.
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utilizando REST e Hípermídia.
Upcoming SlideShare
Loading in...5
×

Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utilizando REST e Hípermídia.

1,059

Published on

A palestra irá apresentar os desafios e as lições aprendidas em 3 anos de desenvolvimento de uma plataforma para gerência e publicação de conteúdo digital na Abril Mídia que aplica os conceitos de arquiteturas REST e APIs Hipermídia para conseguir entregar um grande volume de informação em diversos tipos de dispositivos. A plataforma é constituída de inúmeros domínios de informação, modulares e independentes, que se integram para permitir a criação de produtos digitais de forma mais ágil. Atualmente a plataforma suporta 14 sites e mais de 12 milhões de pageviews/mês e possui uma arquitetura poliglota, ou seja, com uma grande variedade de linguagens e tecnologias utilizadas.

Published in: Technology
2 Comments
5 Likes
Statistics
Notes
No Downloads
Views
Total Views
1,059
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
8
Comments
2
Likes
5
Embeds 0
No embeds

No notes for slide

Transcript of "Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utilizando REST e Hípermídia."

  1. 1. Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utilizando REST e HipermídiaLuís Cipriani@lfcipriani (twitter, linkedin, github, ...)Seminário de Sistemas - IME (2013-04-08)
  2. 2. engineering.abril.com.brtalleye.com
  3. 3. hoje nós vamos falar sobre...
  4. 4. REST
  5. 5. Someone published a new REST API Let’s check it out!! o/
  6. 6. mmm...just another HTTP-based RPC... http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
  7. 7. por que há tanto mal entendimento em relação ao REST?
  8. 8. quem entende errado, está fazendo errado?
  9. 9. 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
  10. 10. hoje nós vamos falar sobre...
  11. 11. a nossa implementaçãodo estilo arquitetural para sistemas baseados em rede proposto pelo Roy Fielding, mais conhecida como...
  12. 12. REST
  13. 13. RAIO X
  14. 14. “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
  15. 15. gráfica distribuidora educação
  16. 16. Viaje Aqui Recreio Bravo! Playboy Veja
  17. 17. CMS’s existem desde os anos 90. Por que reiventamos a roda?
  18. 18. { requisitos negócios Porque temos pessoasalta diversidade orçamentos de prioridades culturas
  19. 19. Recreio Bravo!Playboy diretoria digital
  20. 20. 14 sites em produção (em abr/2013)
  21. 21. 50 desenvolvedores12 arquitetos de software 6 Gerentes de Projeto 4 Gerentes de Produto1 Advocate da Plataforma (em abr/2013)
  22. 22. linguagens storage frameworks outros• ruby • MongoDB • rails • Solr• java • MySQL • sinatra • Hadoop• javascript • Hbase • goliath • RabbitMQ • HDFS • node.js • Varnish • PostgreSQL • play • New Relic • memcached • jetty • redis • tokamak • cachebag • HTTPMonkey https://github.com/abril
  23. 23. infraestrutura Alexandria + sites• 91 VMs para ambientes dev, qa, stage • AMC (Abril Mídia Cloud): private cloud (Xen/Open Stack) • ou VMWare• ~100 VMs + 16 físicas para produção • Data center próprio, AWS, Heroku• Total aproximado: 207 máquinas (abr/2013)
  24. 24. 12,5 milhões de pageviews (de 15/jan até 14/fev de 2013)
  25. 25. HTTP
  26. 26. 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
  27. 27. • 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
  28. 28. data-entry • entrada da Redação • aplicação web • ~ 1 para cada domínio • “API explorer”
  29. 29. • admin do site sitetools• manipulação das áreas e templates• agiliza criação de produtos• a fronteira com o usuário• opcional
  30. 30. domínio HTTPdata-entry sitetools serviço
  31. 31. system of systems
  32. 32. REST
  33. 33. Por que escolhemos REST? image from Roy Fielding dissertation (pag. 85)
  34. 34. Porque...REST = LCODC$SS + U o_O
  35. 35. 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
  36. 36. 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
  37. 37. REST = LCODC$SS + UStateless • Visibilidade • Escalabilidade • Performance de rede (recursos alocados) • Confiabilidade
  38. 38. REST = LCODC$SS + UStateless no Alexandria • HATEOAS implementado nas APIs • cookies nas operações destrutivas
  39. 39. REST = LCODC$SS + UCache • Eficiência • Confiabilidade • Escalabilidade • Performance percebida pelo usuário
  40. 40. 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
  41. 41. REST = LCODC$SS + ULayered System • Encapsula complexidade • Performance • Evolvabilidade percebida pelo usuário • Simplicidade
  42. 42. 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
  43. 43. REST = LCODC$SS + UCode-on-demand • Extensibilidade • Visibilidade • Simplificação do client
  44. 44. 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
  45. 45. REST = LCODC$SS + UUniform interface• Simplificação pela generalidade • Performance• Visibilidade percebida pelo usuário• Desacoplamento • Restrita a dados com• Evolvabilidade granularidade larga
  46. 46. REST = LCODC$SS +Uniform interface no Alexandria
  47. 47. U resource identification URI universal resource identifier
  48. 48. U resource identification /:tipo_recurso/:id
  49. 49. U resource identificationhttp://editorial.api.abril.com.br/materia/dicashttp://editorial.api.abril.com.br/materia/ac23657fghttp://bebe.abril.com.br/materia/ac23657fg
  50. 50. U resources
  51. 51. 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)
  52. 52. 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)
  53. 53. 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>"}
  54. 54. U representations JSON
  55. 55. U representationse um tiquinho assim de XMLou melhor,de application/opensearchdescription+xml
  56. 56. 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>
  57. 57. U hypermedia image from the book Rest in Practice (by Jim Webber) (pag. 14)
  58. 58. U hypermedia Exercício: criar uma atividade de um usuário no site. Você só sabe o entrypoint: http://socialcore.api.abril.com.br
  59. 59. U hypermedia POST  http://socialcore.api.abril.com.br/ Accept:  application/json
  60. 60. U hypermedia POST???
  61. 61. U hypermedia HTTP/1.1 405 Method Not Allowed Allow: GET
  62. 62. U hypermedia GET  http://socialcore.api.abril.com.br/ Accept:  application/json
  63. 63. 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" } ]}
  64. 64. U hypermediaGET  http://socialcore.api.abril.com.br/atividadeAccept:  application/json
  65. 65. 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" } ]}
  66. 66. U hypermediaGET  http://socialcore.api.abril.com.br/atividade/templateAccept:  application/json
  67. 67. U hypermediaHTTP/1.1 200 OKContent-Type: application/json; charset=utf-8{ "atividade": { "app": "", "created_at": "", "usuario": "", "tipo": "", "objeto": { "tipo": "" }, "resultado": { "tipo": "" } }, (continua)
  68. 68. 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" } ]}
  69. 69. 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" } }}
  70. 70. U hypermediaHTTP/1.1 422 Unprocessable EntityContent-Type: application/json; charset=utf-8{ "tipo_recurso":"erro", "atividade":{ "usuario":"", }, "erros":[ {"atributo":"usuario","mensagem":["é obrigatório"]} ]}
  71. 71. 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" } }}
  72. 72. U hypermediaHTTP/1.1 201 CreatedContent-Type: application/json; charset=utf-8Location: http://socialcore.api.abril.com.br/atividade/0922307 o/
  73. 73. U application protocol representation metadata resource metadata HTTP status codes control data
  74. 74. Lições aprendidas
  75. 75. pontos importantes em performance• performance dos • short stacksconnectors • evented servers• non-blocking • libs padronizadasHTTP clients client • caches • HTTP plumbing origin server• cache local• middleware • good TTL strategyarchitecture • middleware• libs padronizadas architecture
  76. 76. • 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
  77. 77. Assumimos que nossa arquitetura está válida.
  78. 78. mas... custo aceitável + necessidades atendidas * ß MTRH
  79. 79. e quando REST não for suficiente?
  80. 80. não use REST
  81. 81. Os responsáveis
  82. 82. • bit.ly/abril_qcon_refs• engineering.abril.com.br Obrigado!• talleye.com• digital.abril.com.br
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×