Como um grande sistema REST funciona - arquitetura e desempenho

3.058 visualizações

Publicada em

Publicada em: Tecnologia
1 comentário
15 gostaram
Estatísticas
Notas
Sem downloads
Visualizações
Visualizações totais
3.058
No SlideShare
0
A partir de incorporações
0
Número de incorporações
713
Ações
Compartilhamentos
0
Downloads
0
Comentários
1
Gostaram
15
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Como um grande sistema REST funciona - arquitetura e desempenho

  1. 1. Como um grande sistema REST funciona Arquitetura e Desempenho FISL 2013
  2. 2. David Robert davidrobert@gmail.com twitter: @while42 github: davidrobert
  3. 3. AMBIENTE
  4. 4. Criar um Gerenciador e Publicador de conteúdo digital para o Grupo Abril
  5. 5. Criar um Gerenciador e Publicador de conteúdo digital ...
  6. 6. Criar um Gerenciador e Publicador de conteúdo digital ... Qual?
  7. 7. Criar um Gerenciador e Publicador de conteúdo digital ... Matérias Chamadas Estabelecimentos Imagens Atrações Famosos Carros Receitas Jogos Infográficos etc etc ... Qual?
  8. 8. Criar um Gerenciador e Publicador de conteúdo digital ... Publicar Onde?
  9. 9. Criar um Gerenciador e Publicador de conteúdo digital ... Web Mobile - Tablets - CELULARES SMART TV API's Publicar Onde?
  10. 10. gráfica distribuidora educação
  11. 11. Playboy Veja Quatro Rodas Super Interessante Placar
  12. 12. “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
  13. 13. CMS’s existem desde os anos 90. Por que reiventamos a roda?
  14. 14. Porque temos alta diversidade de requisitos negócios pessoas orçamentos prioridades culturas {
  15. 15. Como construir uma boa arquitetura?
  16. 16. Integração o velho problema
  17. 17. Banco de Dados Solução Prática #1
  18. 18. Solução Prática #2 Transferência de Arquivos
  19. 19. Solução Prática #3 Web Services
  20. 20. Como são os Web Services hoje?
  21. 21. Como são os Web Services hoje? ● WSDL ● SOAP ● XML ● RPC (Remote Procedure Call) etc
  22. 22. 1) Precisamos disso tudo mesmo?
  23. 23. 2) Alguém já não resolveu isso?
  24. 24. 3) Como avaliar se é uma boa arquitetura?
  25. 25. boa arquitetura necessidades atendidas custo aceitável = + * ß ß quão bem o seu cliente sabe pedir o que quer MTRH MTRH mean time to recovery happiness
  26. 26. ALEXANDRIA
  27. 27. diretoria digital Playbo y Vej a Quatro Rodas
  28. 28. RAIO X
  29. 29. 16 sites em produção
  30. 30. +/- 60 desenvolvedores 13 arquitetos de software 6 Gerentes de Projeto 4 Gerentes de Produto 1 Advocate da Plataforma
  31. 31. ● MongoDB ● MySQL ● Hbase ● HDFS ● PostgreSQL ● memcached ● redis ● Ruby ● Java ● Javascript ● rails ● sinatra ● goliath ● node.js ● play ● jetty ● tokamak ● cachebag ● restfulie Linguagens Storages Frameworks outros ● Solr ● Hadoop ● RabbitMQ ● Varnish ● New Relic ● Tracelytics https://github.com/abril
  32. 32. 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
  33. 33. +15 milhões de pageviews (de jan até fev de 2013)
  34. 34. HTTP
  35. 35. 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
  36. 36. 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
  37. 37. data-entry ● entrada da Redação ● aplicação web ● ~ 1 para cada domínio ● “API explorer”
  38. 38. sitetools● admin do site ● manipulação das áreas e templates ● agiliza criação de produtos ● a fronteira com o usuário ● opcional
  39. 39. HTTP domínio serviço data-entry sitetools
  40. 40. system of systems
  41. 41. Como integrar?
  42. 42. REST
  43. 43. Por que escolhemos REST?
  44. 44. Por que escolhemos REST? ● Protocolo de transferência bastante utilizado ● Escalabilidade ● Performance alta ● Alta disponibilidade ● Permitir evolução sem parar o sistema ● Permitir evolução sem quebrar os clientes ● Segurança
  45. 45. 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
  46. 46. 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
  47. 47. 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
  48. 48. 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
  49. 49. 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
  50. 50. Por que escolhemos REST? ● HTTP ● Web Cache ● Web Proxy (localização geografica) ● Load Balancers "comoditizados" ● Load Balancers ● HTML, JSON, XML ● Segurança
  51. 51. Por que escolhemos REST? ● HTTP ● Web Cache ● Web Proxy (localização geografica) ● Load Balancers "comoditizados" ● Load Balancers ● HTML, JSON, XML ● HTTPS / TLS
  52. 52. Como integrar e ter baixo acoplamento?
  53. 53. Como integrar e ter baixo acoplamento? Interface Uniforme
  54. 54. resouce identification http://editorial.api.abril.com.br/materia/dicas http://editorial.api.abril.com.br/materia/ac23657fg http://bebe.abril.com.br/materia/ac23657fg
  55. 55. resources
  56. 56. 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)
  57. 57. representations JSON
  58. 58. e um tiquinho assim de XML ou melhor, de application/opensearchdescription+xml representations
  59. 59. <?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
  60. 60. hypermedia Exemplo: criar uma atividade de um usuário no site. Sabendo somente o entrypoint: http://socialcore.api.abril.com.br
  61. 61. POST http://socialcore.api.abril.com.br/ Accept: application/json hypermedia
  62. 62. POST??? hypermedia
  63. 63. HTTP/1.1 405 Method Not Allowed Allow: GET hypermedia
  64. 64. GET http://socialcore.api.abril.com.br/ Accept: application/json hypermedia
  65. 65. 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" } ] } hypermedia
  66. 66. GET http://socialcore.api.abril.com.br/atividade Accept: application/json hypermedia
  67. 67. 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" } ] } hypermedia
  68. 68. GET http://socialcore.api.abril.com.br/atividade/template Accept: application/json hypermedia
  69. 69. HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 { "atividade": { "app": "", "created_at": "", "usuario": "", "tipo": "", "objeto": { "tipo": "" }, "resultado": { "tipo": "" } }, (continua) hypermedia
  70. 70. "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
  71. 71. 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" } } } hypermedia
  72. 72. HTTP/1.1 422 Unprocessable Entity Content-Type: application/json; charset=utf-8 { "tipo_recurso":"erro", "atividade":{ "usuario":"", }, "erros":[ {"atributo":"usuario","mensagem":["é obrigatório"]} ] } hypermedia
  73. 73. 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" } } } hypermedia
  74. 74. HTTP/1.1 201 Created Content-Type: application/json; charset=utf-8 Location: http://socialcore.api.abril.com. br/atividade/0922307 o/ hypermedia
  75. 75. application protocol HTTPstatus codes representation metadata resource metadata control data
  76. 76. e a performance disso tudo ai?
  77. 77. a requisição mais rapida que o servidor executa é aquela que ele não executa
  78. 78. estratégia de cache HTTP é imprescindível Palestra: Abusando nas requisições HTTP sem medo http://goo.gl/k29NU
  79. 79. Lições aprendidas
  80. 80. pontos importantes em performance client origin 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
  81. 81. ● Lei de Postel "Seja conservador no que faz, seja liberal no que você aceita dos outros" ●
  82. 82. ● Lei de Postel "Seja conservador no que faz, seja liberal no que você aceita dos outros" ● REST é uma arquitetura de longo prazo ●
  83. 83. ● 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 ●
  84. 84. ● 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 ●
  85. 85. ● 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 ●
  86. 86. ● 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
  87. 87. Assumimos que nossa arquitetura está válida
  88. 88. necessidades atendidas custo aceitável + * ß MTRH mas...
  89. 89. e quando REST não for suficiente?
  90. 90. não use REST
  91. 91. Os responsáveis
  92. 92. PERGUNTAS ?
  93. 93. engineering.abril.com.br digital.abril.com.br Obrigado! David Robert

×