Construindo umsistema distribuidousando RESTPalestra ministrada na Universidade São Judas Tadeu
David Robertdavidrobert@gmail.comtwitter: while42github: davidrobert
AMBIENTE
gráficadistribuidoraeducação
Playboy VejaQuatro RodasSuper InteressantePlacar
“organizações que projetam sistemassão restritas a produzir projetos quesão cópias das estruturas decomunicação dessas org...
CMS’s existem desde os anos 90.Por que reiventamos a roda?
Porquetemos altadiversidadederequisitosnegóciospessoasorçamentosprioridadesculturas{
Como construir umaboa arquitetura?
Integraçãoo velho problema
Banco de DadosSolução Prática #1
Solução Prática #2Transferência de Arquivos
Solução Prática #3Web Services
Como são os Web Services hoje?
Como são os Web Services hoje?● WSDL● SOAP● XML● RPC (Remote Procedure Call)etc
1) Precisamos dissotudo mesmo?
2) Alguém já nãoresolveu isso?
3) Como avaliar se éuma boaarquitetura?
boaarquiteturanecessidadesatendidascustoaceitável= + * ßßquão bem o seu clientesabe pedir o que querMTRHMTRHmean time tore...
ALEXANDRIA
diretoriadigitalPlayboyVejaQuatroRodas
RAIO X
16 sites em produção
+/- 60 desenvolvedores13 arquitetos de software6 Gerentes de Projeto4 Gerentes de Produto1 Advocate da Plataforma
● MongoDB● MySQL● Hbase● HDFS● PostgreSQL● memcached● redis● Ruby● Java● Javascript● rails● sinatra● goliath● node.js● pla...
Infraestrutura Alexandria + sites● 91 VMs para ambientes dev, qa, stage● AMC (Abril Mídia Cloud): private cloud (Xen/Open ...
+15 milhões de pageviews(de jan até fev de 2013)
HTTP
domínio● acesso e manipulação de recursos● implementa regras de negócio● servidor HTTP + base de dados● infra “isolada”● ~...
serviço● consumo e manipulação de recursos● servidor HTTP + (opcional base de dados)● infra “isolada”● ~ 12 serviços● ex: ...
data-entry● entrada da Redação● aplicação web● ~ 1 para cada domínio● “API explorer”
sitetools● admin do site● manipulação das áreas e templates● agiliza criação de produtos● a fronteira com o usuário● opcio...
HTTPdomínioserviçodata-entry sitetools
system of systems
Como integrar?
REST
Por que escolher REST?
Por que escolhemos REST?● Protocolo de transferência amplamenteutilizado● Escalabilidade● Performance alta● Alta disponibi...
Por que escolhemos REST?● HTTP● Escalabilidade● Performance alta● Alta disponibilidade● Permitir evolução sem parar o sist...
Por que escolhemos REST?● HTTP● Web Cache● Performance alta● Alta disponibilidade● Permitir evolução sem parar o sistema● ...
Por que escolhemos REST?● HTTP● Web Cache● Web Proxy (localização geografica)● Alta disponibilidade● Permitir evolução sem...
Por que escolhemos REST?● HTTP● Web Cache● Web Proxy (localização geografica)● Load Balancers "comoditizados"● Permitir ev...
Por que escolhemos REST?● HTTP● Web Cache● Web Proxy (localização geografica)● Load Balancers "comoditizados"● Load Balanc...
Por que escolhemos REST?● HTTP● Web Cache● Web Proxy (localização geografica)● Load Balancers "comoditizados"● Load Balanc...
Por que escolhemos REST?● HTTP● Web Cache● Web Proxy (localização geografica)● Load Balancers "comoditizados"● Load Balanc...
Uniform interface noAlexandria
resouce identificationhttp://editorial.api.abril.com.br/materia/dicashttp://editorial.api.abril.com.br/materia/ac23657fght...
resources
resources{"tipo_recurso" : "materia","link" : [{"href" : "http://editorial.api.abril.com.br/materia/4f0dea5a1e13694","rel"...
representationsJSON
e um tiquinho assim de XMLou melhor,de application/opensearchdescription+xmlrepresentations
<?xml version="1.0" encoding="UTF-8"?><OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" xmlns:grafo="htt...
hypermediaExemplo: criar uma atividadede um usuário no site.Sabendo somente o entrypoint:http://socialcore.api.abril.com.br
POST http://socialcore.api.abril.com.br/Accept: application/jsonhypermedia
POST???hypermedia
HTTP/1.1 405 Method Not AllowedAllow: GEThypermedia
GET http://socialcore.api.abril.com.br/Accept: application/jsonhypermedia
HTTP/1.1 200 OKContent-Type: application/json; charset=utf-8{"titulo": "socialcore","link": [{"href": "http://socialcore.a...
GET http://socialcore.api.abril.com.br/atividadeAccept: application/jsonhypermedia
HTTP/1.1 200 OKContent-Type: application/json; charset=utf-8{"titulo": "Entry Point de Atividades","link": [{"href": "http...
GET http://socialcore.api.abril.com.br/atividade/templateAccept: application/jsonhypermedia
HTTP/1.1 200 OKContent-Type: application/json; charset=utf-8{"atividade": {"app": "","created_at": "","usuario": "","tipo"...
"link": [{"href": "http://socialcore.api.abril.com.br/atividade","rel": "atividade","type": "application/json"},{"href": "...
POST http://socialcore.api.abril.com.br/atividadeAccept: application/jsonContent-Type: application/json; charset=utf-8Auth...
HTTP/1.1 422 Unprocessable EntityContent-Type: application/json; charset=utf-8{"tipo_recurso":"erro","atividade":{"usuario...
POST http://socialcore.api.abril.com.br/atividadeAccept: application/jsonContent-Type: application/json; charset=utf-8Auth...
HTTP/1.1 201 CreatedContent-Type: application/json; charset=utf-8Location: http://socialcore.api.abril.com.br/atividade/09...
applicationprotocolHTTPstatus codesrepresentation metadataresource metadatacontrol data
Lições aprendidas
pontos importantes em performanceclientorigin server● performance dos connectors● non-blocking HTTP clients● cache local● ...
● Lei de Postel"Seja conservador no que faz, seja liberal no que vocêaceita dos outros"●
● Lei de Postel"Seja conservador no que faz, seja liberal no que vocêaceita dos outros"● REST é uma arquitetura de longo p...
● Lei de Postel"Seja conservador no que faz, seja liberal no que vocêaceita dos outros"● REST é uma arquitetura de longo p...
● Lei de Postel"Seja conservador no que faz, seja liberal no que vocêaceita dos outros"● REST é uma arquitetura de longo p...
● Lei de Postel"Seja conservador no que faz, seja liberal no que vocêaceita dos outros"● REST é uma arquitetura de longo p...
● Lei de Postel"Seja conservador no que faz, seja liberal no que vocêaceita dos outros"● REST é uma arquitetura de longo p...
Assumimos que nossaarquitetura está válida
necessidadesatendidascustoaceitável+ * ßMTRHmas...
e quando RESTnão for suficiente?
não use REST
Os responsáveis
PERGUNTAS ?
engineering.abril.com.brdigital.abril.com.brObrigado!David Robert
Construindo um sistema distribuido usando rest
Construindo um sistema distribuido usando rest
Construindo um sistema distribuido usando rest
Construindo um sistema distribuido usando rest
Construindo um sistema distribuido usando rest
Construindo um sistema distribuido usando rest
Upcoming SlideShare
Loading in …5
×

Construindo um sistema distribuido usando rest

935 views

Published on

Published in: Technology

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

×