• Save
Como um grande sistema REST funciona - arquitetura e desempenho
Upcoming SlideShare
Loading in...5
×
 

Como um grande sistema REST funciona - arquitetura e desempenho

on

  • 1,419 views

 

Statistics

Views

Total Views
1,419
Views on SlideShare
1,150
Embed Views
269

Actions

Likes
9
Downloads
0
Comments
1

3 Embeds 269

http://carledwinj.wordpress.com 250
http://www.linkedin.com 15
https://www.linkedin.com 4

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Como um grande sistema REST funciona - arquitetura e desempenho Como um grande sistema REST funciona - arquitetura e desempenho Presentation Transcript

  • Como um grande sistema REST funciona Arquitetura e Desempenho FISL 2013
  • David Robert davidrobert@gmail.com twitter: @while42 github: davidrobert
  • AMBIENTE
  • Criar um Gerenciador e Publicador de conteúdo digital para o Grupo Abril
  • Criar um Gerenciador e Publicador de conteúdo digital ...
  • Criar um Gerenciador e Publicador de conteúdo digital ... Qual?
  • 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?
  • Criar um Gerenciador e Publicador de conteúdo digital ... Publicar Onde?
  • Criar um Gerenciador e Publicador de conteúdo digital ... Web Mobile - Tablets - CELULARES SMART TV API's Publicar Onde?
  • gráfica distribuidora educação
  • Playboy Veja Quatro Rodas Super Interessante Placar
  • “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
  • CMS’s existem desde os anos 90. Por que reiventamos a roda?
  • Porque temos alta diversidade de requisitos negócios pessoas orçamentos prioridades culturas {
  • Como construir uma boa arquitetura?
  • Integração o velho problema
  • Banco de Dados Solução Prática #1
  • Solução Prática #2 Transferência de Arquivos
  • Solução Prática #3 Web 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 disso tudo mesmo?
  • 2) Alguém já não resolveu isso?
  • 3) Como avaliar se é uma boa arquitetura?
  • 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
  • ALEXANDRIA
  • diretoria digital Playbo y Vej a Quatro Rodas
  • RAIO X
  • 16 sites em produção
  • +/- 60 desenvolvedores 13 arquitetos de software 6 Gerentes de Projeto 4 Gerentes de Produto 1 Advocate da Plataforma
  • ● 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
  • 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
  • +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” ● ~ 8 domínios ● ex: editorial (matérias, galerias, etc), anotações (comentários), estabelecimentos, mídia, pessoas
  • 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
  • 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 ● opcional
  • HTTP domínio serviço data-entry sitetools
  • system of systems
  • Como integrar?
  • REST
  • Por que escolhemos REST?
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • Por que escolhemos REST? ● HTTP ● Web Cache ● Web Proxy (localização geografica) ● Load Balancers "comoditizados" ● Load Balancers ● HTML, JSON, XML ● Segurança
  • Por que escolhemos REST? ● HTTP ● Web Cache ● Web Proxy (localização geografica) ● Load Balancers "comoditizados" ● Load Balancers ● HTML, JSON, XML ● HTTPS / TLS
  • Como integrar e ter baixo acoplamento?
  • Como integrar e ter baixo acoplamento? Interface Uniforme
  • 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
  • resources
  • 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)
  • representations JSON
  • e um tiquinho assim de XML ou melhor, de application/opensearchdescription+xml 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> representations
  • hypermedia Exemplo: criar uma atividade de um usuário no site. Sabendo somente o entrypoint: http://socialcore.api.abril.com.br
  • POST http://socialcore.api.abril.com.br/ Accept: application/json hypermedia
  • POST??? hypermedia
  • HTTP/1.1 405 Method Not Allowed Allow: GET hypermedia
  • GET http://socialcore.api.abril.com.br/ Accept: application/json 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" } ] } hypermedia
  • GET http://socialcore.api.abril.com.br/atividade Accept: application/json 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" } ] } hypermedia
  • GET http://socialcore.api.abril.com.br/atividade/template Accept: application/json hypermedia
  • HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 { "atividade": { "app": "", "created_at": "", "usuario": "", "tipo": "", "objeto": { "tipo": "" }, "resultado": { "tipo": "" } }, (continua) 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" } ] } 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" } } } 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"]} ] } 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" } } } hypermedia
  • HTTP/1.1 201 Created Content-Type: application/json; charset=utf-8 Location: http://socialcore.api.abril.com. br/atividade/0922307 o/ hypermedia
  • application protocol HTTPstatus codes representation metadata resource metadata control data
  • e a performance disso tudo ai?
  • a requisição mais rapida que o servidor executa é aquela que ele não executa
  • estratégia de cache HTTP é imprescindível Palestra: Abusando nas requisições HTTP sem medo http://goo.gl/k29NU
  • Lições aprendidas
  • 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
  • ● 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 prazo ●
  • ● 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 ●
  • ● 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 ●
  • ● 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 ●
  • ● 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
  • Assumimos que nossa arquitetura está válida
  • necessidades atendidas custo aceitável + * ß MTRH mas...
  • e quando REST não for suficiente?
  • não use REST
  • Os responsáveis
  • PERGUNTAS ?
  • engineering.abril.com.br digital.abril.com.br Obrigado! David Robert