SlideShare uma empresa Scribd logo
como um verdadeiro
         sistema REST funciona



Luís Cipriani
@lfcipriani (twitter, linkedin, github, ...)
QConSP (2012-08-04)
?
                          mestrado



mai/2009
           nov/2009
bit.ly/lesterforaday
engineering.abril.com.br




talleye.com
hoje nós vamos falar sobre...
REST
de novo...
só que diferente...
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
às vezes as pessoas
   simplesmente não
entendem um conceito...
às vezes as pessoas
 escrevem posts de blog
explicando o conceito de
    forma diferente...
às vezes as pessoas
escrevem livros, fazem
      palestras...
mas isso quer dizer que
 elas estão erradas ou
    agindo de má fé?
jamais
boa
arquitetura   =
                       custo
                      aceitável   +   necessidades
                                       atendidas
                                                     * ß
                                   MTRH



ß   quão bem o seu cliente
    sabe pedir o que quer :-P     MTRH      mean time to
                                            recovery happiness
hoje nós vamos falar sobre...
a nossa implementação
do estilo arquitetural para
   sistemas baseados em
 rede proposto pelo Roy
 Fielding, mais conhecida
          como...
REST
RAIO X
“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
gráfica


         distribuidora


                     educação
Viaje Aqui




             Recreio




                              Bravo!


 Playboy               Veja
Recreio



          Bravo!


Playboy
                             diretoria digital
10 sites em produção
       (em ago/2012)
linguagens     storage      frameworks      outros
• ruby        • MongoDB      • rails       • Solr
• java        • MySQL        • sinatra     • Hadoop
              • Hbase        • goliath     • RabbitMQ
              • HDFS         • play        • Varnish
              • PostgreSQL   • jetty       • New Relic
              • memcached    • tokamak
              • redis        • cachebag
                             • browsah




                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


• 81 VMs + 16 físicas para produção



• Total aproximado: 188 máquinas (jun/2012)
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
• 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
data-entry
             • entrada da Redação
             • aplicação web
             • ~ 1 para cada domínio
             • “API explorer”
• admin do site                       sitetools
• manipulação das áreas e templates
• agiliza criação de produtos
• a fronteira com o usuário
• opcional
domínio


             HTTP



data-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 + U
Client-Server


• Separação de responsabilidades
• Escalabilidade (simplificação)
• Evolução independente



         http://byterot.blogspot.co.uk/2012/06/what-i-think-coupling-is.html
REST = LCODC$SS + U
Client-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
REST = LCODC$SS + U
Stateless

    • Visibilidade
    • Escalabilidade      • Performance de rede
    (recursos alocados)
    • Confiabilidade
REST = LCODC$SS + U
Stateless no Alexandria

 • HATEOAS implementado nas APIs
 • cookies nas operações destrutivas
REST = LCODC$SS + U
Cache

  • Eficiência              • Confiabilidade
  • Escalabilidade
  • Performance
  percebida pelo usuário
REST = LCODC$SS + U
Cache 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
REST = LCODC$SS + U
Layered System


 • Encapsula complexidade   • Performance
 • Evolvabilidade           percebida pelo usuário
 • Simplicidade
REST = LCODC$SS + U
Layered 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
REST = LCODC$SS + U
Code-on-demand


 • Extensibilidade          • Visibilidade
 • Simplificação do client
REST = LCODC$SS + U
Code-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
REST = LCODC$SS + U
Uniform interface

• Simplificação pela generalidade   • Performance
• Visibilidade                     percebida pelo usuário
• Desacoplamento                   • Restrita a dados com
• Evolvabilidade                   granularidade larga
REST = LCODC$SS +


Uniform interface no Alexandria
U resource identification


        URI
    universal resource identifier
U resource identification


         /:tipo_recurso/:id
U resource identification

http://editorial.api.abril.com.br/materia/dicas


http://editorial.api.abril.com.br/materia/ac23657fg


http://bebe.abril.com.br/materia/ac23657fg
U resources
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)
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 da
Inglaterra",
       "id" : "http://editorial.api.abril.com.br/galerias_multimidia/4f0deb759d0a73284d00001e",
       "titulo" : "Especial viajeaqui em Londres"                                   (continua)
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 de
Windsor já foi sede da monarquia britânica.</p>"
}
U representations


     JSON
U representations

e um tiquinho assim de XML

ou melhor,
de application/opensearchdescription+xml
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>
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.com.br
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 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"
        }
    ]
}
U hypermedia

GET	
  http://socialcore.api.abril.com.br/atividade
Accept:	
  application/json
U 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"
        }
    ]
}
U hypermedia

GET	
  http://socialcore.api.abril.com.br/atividade/template
Accept:	
  application/json
U hypermedia
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
{
    "atividade": {
        "app": "",
        "created_at": "",
        "usuario": "",
        "tipo": "",
        "objeto": {
            "tipo": ""
        },
        "resultado": {
            "tipo": ""
        }
    },

 (continua)
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"
        }
    ]
}
U 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"
        }
    }
}
U 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"]}
            ]
}
U 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"
        }
    }
}
U hypermedia

HTTP/1.1 201 Created
Content-Type: application/json; charset=utf-8
Location: http://socialcore.api.abril.com.br/atividade/0922307




                     o/
U application protocol
                      representation metadata
 resource metadata




     HTTP
       status codes
                        control data
e a performance
 disso tudo aí?
a requisição mais rápida que o servidor
 executa é aquela que ele não executa
estratégia de cache HTTP é imprescindível




   bit.ly/fearlessHTTP
melhorando cache local
pontos importantes
• performance dos      • short stacks
connectors             • evented servers
• non-blocking         • libs padronizadas
HTTP clients



   client
                            origin server
• cache local
• middleware          • good TTL strategy
architecture          • middleware
• libs padronizadas   architecture
HTTP plumbing
    Connection:	
  Keep-­‐Alive




http://en.wikipedia.org/wiki/HTTP_persistent_connection
HTTP plumbing




  http://en.wikipedia.org/wiki/HTTP_pipelining
HTTP plumbing

      • Extensões ao protocolo HTTP/1.1
        • Full-Duplex HTTP
        • HTTP MPLEX
      • waka (Roy Fielding)
      • SPDY
      • HTTP Speed + Mobility
      • HTTP 2.0
        • HTTPbis Working Group


http://berb.github.com/diploma-thesis/original/091_archtrends.html
e quando REST não
   for suficiente?
não use REST
Lições aprendidas
• 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.
mas...




          custo
         aceitável   +   necessidades
                          atendidas
                                        * ß
                     MTRH
Os responsáveis
• bit.ly/abril_qcon_refs
• engineering.abril.com.br   Obrigado!
• talleye.com
• digital.abril.com.br

Mais conteúdo relacionado

Mais procurados

Mini Curso Web Services com PHP
Mini Curso Web Services com PHPMini Curso Web Services com PHP
Mini Curso Web Services com PHPelliando dias
 
REST Web Services com Java
REST Web Services com JavaREST Web Services com Java
REST Web Services com Java
JugVale
 
O que é esse tal de rest? [PyBR2016]
O que é esse tal de rest? [PyBR2016]O que é esse tal de rest? [PyBR2016]
O que é esse tal de rest? [PyBR2016]
Filipe Ximenes
 
Web Services Rest
Web Services RestWeb Services Rest
Web Services Rest
Bruno Luiz Pereira da Silva
 
RESTful com json
RESTful com jsonRESTful com json
WebService Restful em Java
WebService Restful em JavaWebService Restful em Java
WebService Restful em Java
alexmacedo
 
Consumindo dados via web service no android
Consumindo dados via web service no androidConsumindo dados via web service no android
Consumindo dados via web service no android
Alexandre Antunes
 
Boas práticas no desenvolvimento de uma RESTful API
Boas práticas no desenvolvimento de uma RESTful APIBoas práticas no desenvolvimento de uma RESTful API
Boas práticas no desenvolvimento de uma RESTful API
Fernando Camargo
 
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]
Carl Edwin
 
Do Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio JugDo Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio Jug
Sergio Azevedo
 
Android webservice
Android webserviceAndroid webservice
Android webservice
Alan Echer
 
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...
Tchelinux
 
APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]
APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]
APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]
Filipe Ximenes
 
Criando Webservices RESTFul com CakePHP
Criando Webservices RESTFul com CakePHPCriando Webservices RESTFul com CakePHP
Criando Webservices RESTFul com CakePHP
Renan Gonçalves
 
Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0
jesuinoPower
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
Ari Stopassola Junior
 
Usando tapioca para acessar APIs web [PyBR11]
Usando tapioca para acessar APIs web [PyBR11]Usando tapioca para acessar APIs web [PyBR11]
Usando tapioca para acessar APIs web [PyBR11]
Filipe Ximenes
 
Boas práticas de API Design
Boas práticas de API DesignBoas práticas de API Design
Boas práticas de API Design
Caio Ribeiro Pereira
 
Introdução a programação para a Internet
Introdução a programação para a InternetIntrodução a programação para a Internet
Introdução a programação para a Internet
Leonardo Soares
 
Web 2.0 e RIA com PHP
Web 2.0 e RIA com PHPWeb 2.0 e RIA com PHP
Web 2.0 e RIA com PHP
Adler Medrado
 

Mais procurados (20)

Mini Curso Web Services com PHP
Mini Curso Web Services com PHPMini Curso Web Services com PHP
Mini Curso Web Services com PHP
 
REST Web Services com Java
REST Web Services com JavaREST Web Services com Java
REST Web Services com Java
 
O que é esse tal de rest? [PyBR2016]
O que é esse tal de rest? [PyBR2016]O que é esse tal de rest? [PyBR2016]
O que é esse tal de rest? [PyBR2016]
 
Web Services Rest
Web Services RestWeb Services Rest
Web Services Rest
 
RESTful com json
RESTful com jsonRESTful com json
RESTful com json
 
WebService Restful em Java
WebService Restful em JavaWebService Restful em Java
WebService Restful em Java
 
Consumindo dados via web service no android
Consumindo dados via web service no androidConsumindo dados via web service no android
Consumindo dados via web service no android
 
Boas práticas no desenvolvimento de uma RESTful API
Boas práticas no desenvolvimento de uma RESTful APIBoas práticas no desenvolvimento de uma RESTful API
Boas práticas no desenvolvimento de uma RESTful API
 
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]
 
Do Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio JugDo Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio Jug
 
Android webservice
Android webserviceAndroid webservice
Android webservice
 
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...
 
APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]
APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]
APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]
 
Criando Webservices RESTFul com CakePHP
Criando Webservices RESTFul com CakePHPCriando Webservices RESTFul com CakePHP
Criando Webservices RESTFul com CakePHP
 
Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 
Usando tapioca para acessar APIs web [PyBR11]
Usando tapioca para acessar APIs web [PyBR11]Usando tapioca para acessar APIs web [PyBR11]
Usando tapioca para acessar APIs web [PyBR11]
 
Boas práticas de API Design
Boas práticas de API DesignBoas práticas de API Design
Boas práticas de API Design
 
Introdução a programação para a Internet
Introdução a programação para a InternetIntrodução a programação para a Internet
Introdução a programação para a Internet
 
Web 2.0 e RIA com PHP
Web 2.0 e RIA com PHPWeb 2.0 e RIA com PHP
Web 2.0 e RIA com PHP
 

Destaque

Explaining Semantic Web
Explaining Semantic WebExplaining Semantic Web
Explaining Semantic Web
Luis Cipriani
 
Hbase: Introduction to column oriented databases
Hbase: Introduction to column oriented databasesHbase: Introduction to column oriented databases
Hbase: Introduction to column oriented databases
Luis Cipriani
 
Fearless HTTP requests abuse
Fearless HTTP requests abuseFearless HTTP requests abuse
Fearless HTTP requests abuse
Luis Cipriani
 
Case Abril: Tracking real time user behavior in websites Homes with Ruby, Sin...
Case Abril: Tracking real time user behavior in websites Homes with Ruby, Sin...Case Abril: Tracking real time user behavior in websites Homes with Ruby, Sin...
Case Abril: Tracking real time user behavior in websites Homes with Ruby, Sin...
Luis Cipriani
 
Rest introdução
Rest introduçãoRest introdução
Rest introdução
Jeison Barros
 
Rest Teoria E Pratica
Rest Teoria E PraticaRest Teoria E Pratica
Rest Teoria E Pratica
Luiz Costa
 
Como um grande sistema REST funciona
Como um grande sistema REST funcionaComo um grande sistema REST funciona
Como um grande sistema REST funciona
David Robert Camargo de Campos
 
Android Destin
Android DestinAndroid Destin
Android Destin
Aline Borges
 
Construindo um sistema distribuido usando rest
Construindo um sistema distribuido usando restConstruindo um sistema distribuido usando rest
Construindo um sistema distribuido usando rest
David Robert Camargo de Campos
 
Android 03 - WebService
Android 03 - WebServiceAndroid 03 - WebService
Android 03 - WebService
Aline Borges
 
Android 04 - Persistência Local & SplashScreen
Android 04 - Persistência Local & SplashScreenAndroid 04 - Persistência Local & SplashScreen
Android 04 - Persistência Local & SplashScreen
Aline Borges
 
Como fazer boas libs
Como fazer boas libs Como fazer boas libs
Como fazer boas libs
Vinta Software
 
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APISDJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS
Fernando Rocha
 
Boas práticas de django
Boas práticas de djangoBoas práticas de django
Boas práticas de django
Filipe Ximenes
 
Junho 2016 - Django - A sua cápsula de soluções web em python
Junho 2016 - Django - A sua cápsula de soluções web em pythonJunho 2016 - Django - A sua cápsula de soluções web em python
Junho 2016 - Django - A sua cápsula de soluções web em python
Grupo de Testes Carioca
 
Integração utilizando REST API e Microservices
Integração utilizando REST API e MicroservicesIntegração utilizando REST API e Microservices
Integração utilizando REST API e Microservices
Denis Santos
 
Capítulo 10 - Sincronização de dados usando JSON
Capítulo 10 - Sincronização de dados usando JSONCapítulo 10 - Sincronização de dados usando JSON
Capítulo 10 - Sincronização de dados usando JSON
Marcio Palheta
 
Learning python with flask (PyLadies Malaysia 2017 Workshop #1)
Learning python with flask (PyLadies Malaysia 2017 Workshop #1)Learning python with flask (PyLadies Malaysia 2017 Workshop #1)
Learning python with flask (PyLadies Malaysia 2017 Workshop #1)
Sian Lerk Lau
 

Destaque (18)

Explaining Semantic Web
Explaining Semantic WebExplaining Semantic Web
Explaining Semantic Web
 
Hbase: Introduction to column oriented databases
Hbase: Introduction to column oriented databasesHbase: Introduction to column oriented databases
Hbase: Introduction to column oriented databases
 
Fearless HTTP requests abuse
Fearless HTTP requests abuseFearless HTTP requests abuse
Fearless HTTP requests abuse
 
Case Abril: Tracking real time user behavior in websites Homes with Ruby, Sin...
Case Abril: Tracking real time user behavior in websites Homes with Ruby, Sin...Case Abril: Tracking real time user behavior in websites Homes with Ruby, Sin...
Case Abril: Tracking real time user behavior in websites Homes with Ruby, Sin...
 
Rest introdução
Rest introduçãoRest introdução
Rest introdução
 
Rest Teoria E Pratica
Rest Teoria E PraticaRest Teoria E Pratica
Rest Teoria E Pratica
 
Como um grande sistema REST funciona
Como um grande sistema REST funcionaComo um grande sistema REST funciona
Como um grande sistema REST funciona
 
Android Destin
Android DestinAndroid Destin
Android Destin
 
Construindo um sistema distribuido usando rest
Construindo um sistema distribuido usando restConstruindo um sistema distribuido usando rest
Construindo um sistema distribuido usando rest
 
Android 03 - WebService
Android 03 - WebServiceAndroid 03 - WebService
Android 03 - WebService
 
Android 04 - Persistência Local & SplashScreen
Android 04 - Persistência Local & SplashScreenAndroid 04 - Persistência Local & SplashScreen
Android 04 - Persistência Local & SplashScreen
 
Como fazer boas libs
Como fazer boas libs Como fazer boas libs
Como fazer boas libs
 
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APISDJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS
DJANGO-REST-FRAMEWORK: AWESOME WEB-BROWSABLE WEB APIS
 
Boas práticas de django
Boas práticas de djangoBoas práticas de django
Boas práticas de django
 
Junho 2016 - Django - A sua cápsula de soluções web em python
Junho 2016 - Django - A sua cápsula de soluções web em pythonJunho 2016 - Django - A sua cápsula de soluções web em python
Junho 2016 - Django - A sua cápsula de soluções web em python
 
Integração utilizando REST API e Microservices
Integração utilizando REST API e MicroservicesIntegração utilizando REST API e Microservices
Integração utilizando REST API e Microservices
 
Capítulo 10 - Sincronização de dados usando JSON
Capítulo 10 - Sincronização de dados usando JSONCapítulo 10 - Sincronização de dados usando JSON
Capítulo 10 - Sincronização de dados usando JSON
 
Learning python with flask (PyLadies Malaysia 2017 Workshop #1)
Learning python with flask (PyLadies Malaysia 2017 Workshop #1)Learning python with flask (PyLadies Malaysia 2017 Workshop #1)
Learning python with flask (PyLadies Malaysia 2017 Workshop #1)
 

Semelhante a Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

5. rodando containers docker na aws
5. rodando containers docker na aws5. rodando containers docker na aws
5. rodando containers docker na aws
Amazon Web Services LATAM
 
No sql Orientado a documento
No sql Orientado a documentoNo sql Orientado a documento
No sql Orientado a documento
Alex Martins
 
Introdução a plataforma de aplicativos Redu
Introdução a plataforma de aplicativos ReduIntrodução a plataforma de aplicativos Redu
Introdução a plataforma de aplicativos Redu
Guilherme
 
Rails
RailsRails
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST Framework
Mario Guedes
 
IoTizando com JavaScript
IoTizando com JavaScriptIoTizando com JavaScript
IoTizando com JavaScript
Heider Lopes
 
Introdução sobre desenvolvimento web
Introdução sobre desenvolvimento webIntrodução sobre desenvolvimento web
Introdução sobre desenvolvimento web
Rodrigo Rodrigues
 
Web Services
Web ServicesWeb Services
Web Services
armeniocardoso
 
Apresentação no Meetup da Elastic em Florianopolis
Apresentação no Meetup da Elastic em FlorianopolisApresentação no Meetup da Elastic em Florianopolis
Apresentação no Meetup da Elastic em Florianopolis
luis antonio Nunes
 
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDB
Ari Stopassola Junior
 
Latinoware 2012 - Desenvolvendo Interfaces com Holy
Latinoware 2012 - Desenvolvendo Interfaces com HolyLatinoware 2012 - Desenvolvendo Interfaces com Holy
Latinoware 2012 - Desenvolvendo Interfaces com Holy
Dextra
 
Latinoware2012 - Desenvolvendo interfaces WEB com HOLY de forma prática e efi...
Latinoware2012 - Desenvolvendo interfaces WEB com HOLY de forma prática e efi...Latinoware2012 - Desenvolvendo interfaces WEB com HOLY de forma prática e efi...
Latinoware2012 - Desenvolvendo interfaces WEB com HOLY de forma prática e efi...
Leandro Guimarães
 
Curso AngularJS - Parte 1
Curso AngularJS - Parte 1Curso AngularJS - Parte 1
Curso AngularJS - Parte 1
Alvaro Viebrantz
 
GDG ABC Meetup #5 - Tendências 2015
GDG ABC Meetup #5 - Tendências 2015GDG ABC Meetup #5 - Tendências 2015
GDG ABC Meetup #5 - Tendências 2015
Daniel Costa Gimenes
 
Docker + Azure: opções disponíveis e utilização de containers na nuvem - Azur...
Docker + Azure: opções disponíveis e utilização de containers na nuvem - Azur...Docker + Azure: opções disponíveis e utilização de containers na nuvem - Azur...
Docker + Azure: opções disponíveis e utilização de containers na nuvem - Azur...
Renato Groff
 
Mini Curso Mashup Coreu
Mini Curso Mashup CoreuMini Curso Mashup Coreu
Mini Curso Mashup Coreu
Marcelo Linhares
 
Oficina técnica da Infraestrutura Nacional de Dados Abertos - INDA
Oficina técnica da Infraestrutura Nacional de Dados Abertos - INDAOficina técnica da Infraestrutura Nacional de Dados Abertos - INDA
Oficina técnica da Infraestrutura Nacional de Dados Abertos - INDA
nitaibezerra
 
Ruby on Rails 100% na cloud com heroku e outros serviços
Ruby on Rails 100% na cloud com heroku e outros serviçosRuby on Rails 100% na cloud com heroku e outros serviços
Ruby on Rails 100% na cloud com heroku e outros serviços
Bruno Ghisi
 
Carreira do profissional de dados
Carreira do profissional de dadosCarreira do profissional de dados
Carreira do profissional de dados
Edvaldo Castro
 
2016/08/19 - Uma visão geral da AWS para desenvolvedores
2016/08/19 - Uma visão geral da AWS para desenvolvedores2016/08/19 - Uma visão geral da AWS para desenvolvedores
2016/08/19 - Uma visão geral da AWS para desenvolvedores
Jardel Weyrich
 

Semelhante a Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril (20)

5. rodando containers docker na aws
5. rodando containers docker na aws5. rodando containers docker na aws
5. rodando containers docker na aws
 
No sql Orientado a documento
No sql Orientado a documentoNo sql Orientado a documento
No sql Orientado a documento
 
Introdução a plataforma de aplicativos Redu
Introdução a plataforma de aplicativos ReduIntrodução a plataforma de aplicativos Redu
Introdução a plataforma de aplicativos Redu
 
Rails
RailsRails
Rails
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST Framework
 
IoTizando com JavaScript
IoTizando com JavaScriptIoTizando com JavaScript
IoTizando com JavaScript
 
Introdução sobre desenvolvimento web
Introdução sobre desenvolvimento webIntrodução sobre desenvolvimento web
Introdução sobre desenvolvimento web
 
Web Services
Web ServicesWeb Services
Web Services
 
Apresentação no Meetup da Elastic em Florianopolis
Apresentação no Meetup da Elastic em FlorianopolisApresentação no Meetup da Elastic em Florianopolis
Apresentação no Meetup da Elastic em Florianopolis
 
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDB
 
Latinoware 2012 - Desenvolvendo Interfaces com Holy
Latinoware 2012 - Desenvolvendo Interfaces com HolyLatinoware 2012 - Desenvolvendo Interfaces com Holy
Latinoware 2012 - Desenvolvendo Interfaces com Holy
 
Latinoware2012 - Desenvolvendo interfaces WEB com HOLY de forma prática e efi...
Latinoware2012 - Desenvolvendo interfaces WEB com HOLY de forma prática e efi...Latinoware2012 - Desenvolvendo interfaces WEB com HOLY de forma prática e efi...
Latinoware2012 - Desenvolvendo interfaces WEB com HOLY de forma prática e efi...
 
Curso AngularJS - Parte 1
Curso AngularJS - Parte 1Curso AngularJS - Parte 1
Curso AngularJS - Parte 1
 
GDG ABC Meetup #5 - Tendências 2015
GDG ABC Meetup #5 - Tendências 2015GDG ABC Meetup #5 - Tendências 2015
GDG ABC Meetup #5 - Tendências 2015
 
Docker + Azure: opções disponíveis e utilização de containers na nuvem - Azur...
Docker + Azure: opções disponíveis e utilização de containers na nuvem - Azur...Docker + Azure: opções disponíveis e utilização de containers na nuvem - Azur...
Docker + Azure: opções disponíveis e utilização de containers na nuvem - Azur...
 
Mini Curso Mashup Coreu
Mini Curso Mashup CoreuMini Curso Mashup Coreu
Mini Curso Mashup Coreu
 
Oficina técnica da Infraestrutura Nacional de Dados Abertos - INDA
Oficina técnica da Infraestrutura Nacional de Dados Abertos - INDAOficina técnica da Infraestrutura Nacional de Dados Abertos - INDA
Oficina técnica da Infraestrutura Nacional de Dados Abertos - INDA
 
Ruby on Rails 100% na cloud com heroku e outros serviços
Ruby on Rails 100% na cloud com heroku e outros serviçosRuby on Rails 100% na cloud com heroku e outros serviços
Ruby on Rails 100% na cloud com heroku e outros serviços
 
Carreira do profissional de dados
Carreira do profissional de dadosCarreira do profissional de dados
Carreira do profissional de dados
 
2016/08/19 - Uma visão geral da AWS para desenvolvedores
2016/08/19 - Uma visão geral da AWS para desenvolvedores2016/08/19 - Uma visão geral da AWS para desenvolvedores
2016/08/19 - Uma visão geral da AWS para desenvolvedores
 

Mais de Luis Cipriani

Adventures with Raspberry Pi and Twitter API
Adventures with Raspberry Pi and Twitter APIAdventures with Raspberry Pi and Twitter API
Adventures with Raspberry Pi and Twitter API
Luis Cipriani
 
Capturando o pulso do planeta com as APIs de Streaming do Twitter
Capturando o pulso do planeta com as APIs de Streaming do TwitterCapturando o pulso do planeta com as APIs de Streaming do Twitter
Capturando o pulso do planeta com as APIs de Streaming do Twitter
Luis Cipriani
 
Twitter e suas APIs de Streaming - Campus Party Brasil 7
Twitter e suas APIs de Streaming - Campus Party Brasil 7Twitter e suas APIs de Streaming - Campus Party Brasil 7
Twitter e suas APIs de Streaming - Campus Party Brasil 7
Luis Cipriani
 
Segurança de APIs HTTP, um guia sensato para desenvolvedores preocupados
Segurança de APIs HTTP, um guia sensato para desenvolvedores preocupadosSegurança de APIs HTTP, um guia sensato para desenvolvedores preocupados
Segurança de APIs HTTP, um guia sensato para desenvolvedores preocupados
Luis Cipriani
 
API Caching, why your server needs some rest
API Caching, why your server needs some restAPI Caching, why your server needs some rest
API Caching, why your server needs some rest
Luis Cipriani
 
Explaining A Programming Model for Context-Aware Applications in Large-Scale ...
Explaining A Programming Model for Context-Aware Applications in Large-Scale ...Explaining A Programming Model for Context-Aware Applications in Large-Scale ...
Explaining A Programming Model for Context-Aware Applications in Large-Scale ...
Luis Cipriani
 

Mais de Luis Cipriani (6)

Adventures with Raspberry Pi and Twitter API
Adventures with Raspberry Pi and Twitter APIAdventures with Raspberry Pi and Twitter API
Adventures with Raspberry Pi and Twitter API
 
Capturando o pulso do planeta com as APIs de Streaming do Twitter
Capturando o pulso do planeta com as APIs de Streaming do TwitterCapturando o pulso do planeta com as APIs de Streaming do Twitter
Capturando o pulso do planeta com as APIs de Streaming do Twitter
 
Twitter e suas APIs de Streaming - Campus Party Brasil 7
Twitter e suas APIs de Streaming - Campus Party Brasil 7Twitter e suas APIs de Streaming - Campus Party Brasil 7
Twitter e suas APIs de Streaming - Campus Party Brasil 7
 
Segurança de APIs HTTP, um guia sensato para desenvolvedores preocupados
Segurança de APIs HTTP, um guia sensato para desenvolvedores preocupadosSegurança de APIs HTTP, um guia sensato para desenvolvedores preocupados
Segurança de APIs HTTP, um guia sensato para desenvolvedores preocupados
 
API Caching, why your server needs some rest
API Caching, why your server needs some restAPI Caching, why your server needs some rest
API Caching, why your server needs some rest
 
Explaining A Programming Model for Context-Aware Applications in Large-Scale ...
Explaining A Programming Model for Context-Aware Applications in Large-Scale ...Explaining A Programming Model for Context-Aware Applications in Large-Scale ...
Explaining A Programming Model for Context-Aware Applications in Large-Scale ...
 

Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril

  • 1. como um verdadeiro sistema REST funciona Luís Cipriani @lfcipriani (twitter, linkedin, github, ...) QConSP (2012-08-04)
  • 2. ? mestrado mai/2009 nov/2009
  • 5. hoje nós vamos falar sobre...
  • 9. Someone published a new REST API Let’s check it out!! o/
  • 10. mmm... just another HTTP-based RPC... http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
  • 11. às vezes as pessoas simplesmente não entendem um conceito...
  • 12. às vezes as pessoas escrevem posts de blog explicando o conceito de forma diferente...
  • 13. às vezes as pessoas escrevem livros, fazem palestras...
  • 14. mas isso quer dizer que elas estão erradas ou agindo de má fé?
  • 16. boa arquitetura = custo aceitável + necessidades atendidas * ß MTRH ß quão bem o seu cliente sabe pedir o que quer :-P MTRH mean time to recovery happiness
  • 17. hoje nós vamos falar sobre...
  • 18. a nossa implementação do estilo arquitetural para sistemas baseados em rede proposto pelo Roy Fielding, mais conhecida como...
  • 19. REST
  • 21. “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
  • 22. gráfica distribuidora educação
  • 23. Viaje Aqui Recreio Bravo! Playboy Veja
  • 24. Recreio Bravo! Playboy diretoria digital
  • 25. 10 sites em produção (em ago/2012)
  • 26. linguagens storage frameworks outros • ruby • MongoDB • rails • Solr • java • MySQL • sinatra • Hadoop • Hbase • goliath • RabbitMQ • HDFS • play • Varnish • PostgreSQL • jetty • New Relic • memcached • tokamak • redis • cachebag • browsah https://github.com/abril
  • 27. infraestrutura Alexandria + sites • 91 VMs para ambientes dev, qa, stage • AMC (Abril Mídia Cloud): private cloud (Xen/Open Stack) • ou VMWare • 81 VMs + 16 físicas para produção • Total aproximado: 188 máquinas (jun/2012)
  • 28. HTTP
  • 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. • 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
  • 31. data-entry • entrada da Redação • aplicação web • ~ 1 para cada domínio • “API explorer”
  • 32. • admin do site sitetools • manipulação das áreas e templates • agiliza criação de produtos • a fronteira com o usuário • opcional
  • 33. domínio HTTP data-entry sitetools serviço
  • 35. REST
  • 36. Por que escolhemos REST? image from Roy Fielding dissertation (pag. 85)
  • 38. REST = LCODC$SS + U Client-Server • Separação de responsabilidades • Escalabilidade (simplificação) • Evolução independente http://byterot.blogspot.co.uk/2012/06/what-i-think-coupling-is.html
  • 39. REST = LCODC$SS + U Client-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
  • 40. REST = LCODC$SS + U Stateless • Visibilidade • Escalabilidade • Performance de rede (recursos alocados) • Confiabilidade
  • 41. REST = LCODC$SS + U Stateless no Alexandria • HATEOAS implementado nas APIs • cookies nas operações destrutivas
  • 42. REST = LCODC$SS + U Cache • Eficiência • Confiabilidade • Escalabilidade • Performance percebida pelo usuário
  • 43. REST = LCODC$SS + U Cache 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
  • 44. REST = LCODC$SS + U Layered System • Encapsula complexidade • Performance • Evolvabilidade percebida pelo usuário • Simplicidade
  • 45. REST = LCODC$SS + U Layered 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
  • 46. REST = LCODC$SS + U Code-on-demand • Extensibilidade • Visibilidade • Simplificação do client
  • 47. REST = LCODC$SS + U Code-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
  • 48. REST = LCODC$SS + U Uniform interface • Simplificação pela generalidade • Performance • Visibilidade percebida pelo usuário • Desacoplamento • Restrita a dados com • Evolvabilidade granularidade larga
  • 49. REST = LCODC$SS + Uniform interface no Alexandria
  • 50. U resource identification URI universal resource identifier
  • 51. U resource identification /:tipo_recurso/:id
  • 54. 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)
  • 55. 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 da Inglaterra", "id" : "http://editorial.api.abril.com.br/galerias_multimidia/4f0deb759d0a73284d00001e", "titulo" : "Especial viajeaqui em Londres" (continua)
  • 56. 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 de Windsor já foi sede da monarquia britânica.</p>" }
  • 58. U representations e um tiquinho assim de XML ou melhor, de application/opensearchdescription+xml
  • 59. 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>
  • 60. U hypermedia image from the book Rest in Practice (by Jim Webber) (pag. 14)
  • 61. U hypermedia Exercício: criar uma atividade de um usuário no site. Você só sabe o entrypoint: http://socialcore.api.abril.com.br
  • 62. U hypermedia POST  http://socialcore.api.abril.com.br/ Accept:  application/json
  • 63. U hypermedia POST???
  • 64. U hypermedia HTTP/1.1 405 Method Not Allowed Allow: GET
  • 65. U hypermedia GET  http://socialcore.api.abril.com.br/ Accept:  application/json
  • 66. U 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" } ] }
  • 68. U 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" } ] }
  • 70. U hypermedia HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 { "atividade": { "app": "", "created_at": "", "usuario": "", "tipo": "", "objeto": { "tipo": "" }, "resultado": { "tipo": "" } }, (continua)
  • 71. 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" } ] }
  • 72. U 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" } } }
  • 73. U 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"]} ] }
  • 74. U 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" } } }
  • 75. U hypermedia HTTP/1.1 201 Created Content-Type: application/json; charset=utf-8 Location: http://socialcore.api.abril.com.br/atividade/0922307 o/
  • 76. U application protocol representation metadata resource metadata HTTP status codes control data
  • 77. e a performance disso tudo aí?
  • 78. a requisição mais rápida que o servidor executa é aquela que ele não executa
  • 79.
  • 80. estratégia de cache HTTP é imprescindível bit.ly/fearlessHTTP
  • 82. pontos importantes • performance dos • short stacks connectors • evented servers • non-blocking • libs padronizadas HTTP clients client origin server • cache local • middleware • good TTL strategy architecture • middleware • libs padronizadas architecture
  • 83. HTTP plumbing Connection:  Keep-­‐Alive http://en.wikipedia.org/wiki/HTTP_persistent_connection
  • 84. HTTP plumbing http://en.wikipedia.org/wiki/HTTP_pipelining
  • 85. HTTP plumbing • Extensões ao protocolo HTTP/1.1 • Full-Duplex HTTP • HTTP MPLEX • waka (Roy Fielding) • SPDY • HTTP Speed + Mobility • HTTP 2.0 • HTTPbis Working Group http://berb.github.com/diploma-thesis/original/091_archtrends.html
  • 86. e quando REST não for suficiente?
  • 89. • 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
  • 90. Assumimos que nossa arquitetura está válida.
  • 91. mas... custo aceitável + necessidades atendidas * ß MTRH
  • 93. • bit.ly/abril_qcon_refs • engineering.abril.com.br Obrigado! • talleye.com • digital.abril.com.br