Construindo um sistema distribuido usando rest

934 visualizações

Publicada em

Publicada em: Tecnologia

Construindo um sistema distribuido usando rest

  1. 1. Construindo umsistema distribuidousando RESTPalestra ministrada na Universidade São Judas Tadeu
  2. 2. David Robertdavidrobert@gmail.comtwitter: while42github: davidrobert
  3. 3. AMBIENTE
  4. 4. gráficadistribuidoraeducação
  5. 5. Playboy VejaQuatro RodasSuper InteressantePlacar
  6. 6. “organizações que projetam sistemassão restritas a produzir projetos quesão cópias das estruturas decomunicação dessas organizações”Lei deConwayhttp://www.melconway.com/Home/Conways_Law.html
  7. 7. CMS’s existem desde os anos 90.Por que reiventamos a roda?
  8. 8. Porquetemos altadiversidadederequisitosnegóciospessoasorçamentosprioridadesculturas{
  9. 9. Como construir umaboa arquitetura?
  10. 10. Integraçãoo velho problema
  11. 11. Banco de DadosSolução Prática #1
  12. 12. Solução Prática #2Transferência de Arquivos
  13. 13. Solução Prática #3Web Services
  14. 14. Como são os Web Services hoje?
  15. 15. Como são os Web Services hoje?● WSDL● SOAP● XML● RPC (Remote Procedure Call)etc
  16. 16. 1) Precisamos dissotudo mesmo?
  17. 17. 2) Alguém já nãoresolveu isso?
  18. 18. 3) Como avaliar se éuma boaarquitetura?
  19. 19. boaarquiteturanecessidadesatendidascustoaceitável= + * ßßquão bem o seu clientesabe pedir o que querMTRHMTRHmean time torecoveryhappiness
  20. 20. ALEXANDRIA
  21. 21. diretoriadigitalPlayboyVejaQuatroRodas
  22. 22. RAIO X
  23. 23. 16 sites em produção
  24. 24. +/- 60 desenvolvedores13 arquitetos de software6 Gerentes de Projeto4 Gerentes de Produto1 Advocate da Plataforma
  25. 25. ● MongoDB● MySQL● Hbase● HDFS● PostgreSQL● memcached● redis● Ruby● Java● Javascript● rails● sinatra● goliath● node.js● play● jetty● tokamak● cachebag● restfulieLinguagens Storages Frameworks outros● Solr● Hadoop● RabbitMQ● Varnish● New Relic● Tracelyticshttps://github.com/abril
  26. 26. 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
  27. 27. +15 milhões de pageviews(de jan até fev de 2013)
  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. 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
  31. 31. data-entry● entrada da Redação● aplicação web● ~ 1 para cada domínio● “API explorer”
  32. 32. sitetools● admin do site● manipulação das áreas e templates● agiliza criação de produtos● a fronteira com o usuário● opcional
  33. 33. HTTPdomínioserviçodata-entry sitetools
  34. 34. system of systems
  35. 35. Como integrar?
  36. 36. REST
  37. 37. Por que escolher REST?
  38. 38. Por que escolhemos REST?● Protocolo de transferência amplamenteutilizado● Escalabilidade● Performance alta● Alta disponibilidade● Permitir evolução sem parar o sistema● Permitir evolução sem quebrar os clientes● Segurança
  39. 39. 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
  40. 40. Por que escolhemos REST?● HTTP● Web Cache● Performance alta● Alta disponibilidade● Permitir evolução sem parar o sistema● Permitir evolução sem quebrar os clientes● Segurança
  41. 41. Por que escolhemos REST?● HTTP● Web Cache● Web Proxy (localização geografica)● Alta disponibilidade● Permitir evolução sem parar o sistema● Permitir evolução sem quebrar os clientes● Segurança
  42. 42. Por que escolhemos REST?● HTTP● Web Cache● Web Proxy (localização geografica)● Load Balancers "comoditizados"● Permitir evolução sem parar o sistema● Permitir evolução sem quebrar os clientes● Segurança
  43. 43. Por que escolhemos REST?● HTTP● Web Cache● Web Proxy (localização geografica)● Load Balancers "comoditizados"● Load Balancers● Permitir evolução sem quebrar os clientes● Segurança
  44. 44. Por que escolhemos REST?● HTTP● Web Cache● Web Proxy (localização geografica)● Load Balancers "comoditizados"● Load Balancers● HTML, JSON, XML● Segurança
  45. 45. Por que escolhemos REST?● HTTP● Web Cache● Web Proxy (localização geografica)● Load Balancers "comoditizados"● Load Balancers● HTML, JSON, XML● HTTPS / TLS
  46. 46. Uniform interface noAlexandria
  47. 47. resouce identificationhttp://editorial.api.abril.com.br/materia/dicashttp://editorial.api.abril.com.br/materia/ac23657fghttp://bebe.abril.com.br/materia/ac23657fg
  48. 48. resources
  49. 49. 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)
  50. 50. representationsJSON
  51. 51. e um tiquinho assim de XMLou melhor,de application/opensearchdescription+xmlrepresentations
  52. 52. <?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>representations
  53. 53. hypermediaExemplo: criar uma atividadede um usuário no site.Sabendo somente o entrypoint:http://socialcore.api.abril.com.br
  54. 54. POST http://socialcore.api.abril.com.br/Accept: application/jsonhypermedia
  55. 55. POST???hypermedia
  56. 56. HTTP/1.1 405 Method Not AllowedAllow: GEThypermedia
  57. 57. GET http://socialcore.api.abril.com.br/Accept: application/jsonhypermedia
  58. 58. HTTP/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"}]}hypermedia
  59. 59. GET http://socialcore.api.abril.com.br/atividadeAccept: application/jsonhypermedia
  60. 60. HTTP/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"}]}hypermedia
  61. 61. GET http://socialcore.api.abril.com.br/atividade/templateAccept: application/jsonhypermedia
  62. 62. HTTP/1.1 200 OKContent-Type: application/json; charset=utf-8{"atividade": {"app": "","created_at": "","usuario": "","tipo": "","objeto": {"tipo": ""},"resultado": {"tipo": ""}},(continua)hypermedia
  63. 63. "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"}]}hypermedia
  64. 64. POST 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"}}}hypermedia
  65. 65. HTTP/1.1 422 Unprocessable EntityContent-Type: application/json; charset=utf-8{"tipo_recurso":"erro","atividade":{"usuario":"",},"erros":[{"atributo":"usuario","mensagem":["é obrigatório"]}]}hypermedia
  66. 66. POST 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"}}}hypermedia
  67. 67. HTTP/1.1 201 CreatedContent-Type: application/json; charset=utf-8Location: http://socialcore.api.abril.com.br/atividade/0922307o/hypermedia
  68. 68. applicationprotocolHTTPstatus codesrepresentation metadataresource metadatacontrol data
  69. 69. Lições aprendidas
  70. 70. pontos importantes em performanceclientorigin 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
  71. 71. ● Lei de Postel"Seja conservador no que faz, seja liberal no que vocêaceita dos outros"●
  72. 72. ● Lei de Postel"Seja conservador no que faz, seja liberal no que vocêaceita dos outros"● REST é uma arquitetura de longo prazo●
  73. 73. ● 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●
  74. 74. ● 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●
  75. 75. ● 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 suasdesvantagens●
  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 tem suasdesvantagens● Medir/monitorar o desempenho é importantíssimo
  77. 77. Assumimos que nossaarquitetura está válida
  78. 78. necessidadesatendidascustoaceitável+ * ßMTRHmas...
  79. 79. e quando RESTnão for suficiente?
  80. 80. não use REST
  81. 81. Os responsáveis
  82. 82. PERGUNTAS ?
  83. 83. engineering.abril.com.brdigital.abril.com.brObrigado!David Robert

×