SlideShare a Scribd company logo
1 of 85
Download to read offline
Alexandria: um Sistema de
  Sistemas para Publicação de
  Conteúdo Digital utilizando
       REST e Hipermídia

Luís Cipriani
@lfcipriani (twitter, linkedin, github, ...)
Seminário de Sistemas - IME (2013-04-08)
engineering.abril.com.br




talleye.com
hoje nós vamos falar sobre...
REST
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
por que há tanto mal
 entendimento em
  relação ao REST?
quem entende errado, está
    fazendo errado?
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
CMS’s existem desde os anos 90.

 Por que reiventamos a roda?
{
                       requisitos
                        negócios
 Porque temos            pessoas
alta diversidade       orçamentos
        de             prioridades
                         culturas
Recreio



          Bravo!


Playboy
                             diretoria digital
14 sites em produção
       (em abr/2013)
50 desenvolvedores
12 arquitetos de software
  6 Gerentes de Projeto
 4 Gerentes de Produto
1 Advocate da Plataforma
         (em abr/2013)
linguagens      storage      frameworks       outros
• ruby         • MongoDB      • rails        • Solr
• java         • MySQL        • sinatra      • Hadoop
• javascript   • Hbase        • goliath      • RabbitMQ
               • HDFS         • node.js      • Varnish
               • PostgreSQL   • play         • New Relic
               • memcached    • jetty
               • redis        • tokamak
                              • cachebag
                              • HTTPMonkey



                 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 + 16 físicas para produção
  • Data center próprio, AWS, Heroku


• Total aproximado: 207 máquinas (abr/2013)
12,5 milhões de pageviews
       (de 15/jan até 14/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
• 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
Lições aprendidas
pontos importantes em performance
• performance dos                      • short stacks
connectors                             • evented servers
• non-blocking                         • libs padronizadas
HTTP clients



   client           • caches
                    • HTTP plumbing         origin server
• cache local
• middleware                          • good TTL strategy
architecture                          • middleware
• libs padronizadas                   architecture
• 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
e quando REST não
   for suficiente?
não use REST
Os responsáveis
• bit.ly/abril_qcon_refs
• engineering.abril.com.br   Obrigado!
• talleye.com
• digital.abril.com.br

More Related Content

Similar to Alexandria: um Sistema de Publicação Digital RESTful

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 ReduGuilherme
 
Latinoware 2012 - Desenvolvendo Interfaces com Holy
Latinoware 2012 - Desenvolvendo Interfaces com HolyLatinoware 2012 - Desenvolvendo Interfaces com Holy
Latinoware 2012 - Desenvolvendo Interfaces com HolyDextra
 
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
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkMario Guedes
 
No sql Orientado a documento
No sql Orientado a documentoNo sql Orientado a documento
No sql Orientado a documentoAlex Martins
 
[Minha Vida TechDay] Novo Dieta e Saúde
[Minha Vida TechDay] Novo Dieta e Saúde[Minha Vida TechDay] Novo Dieta e Saúde
[Minha Vida TechDay] Novo Dieta e SaúdeCleber Dantas
 
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 2015Daniel Costa Gimenes
 
Introdução sobre desenvolvimento web
Introdução sobre desenvolvimento webIntrodução sobre desenvolvimento web
Introdução sobre desenvolvimento webRodrigo Rodrigues
 
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çosBruno Ghisi
 
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 - INDAnitaibezerra
 
Carreira do profissional de dados
Carreira do profissional de dadosCarreira do profissional de dados
Carreira do profissional de dadosEdvaldo Castro
 
IoTizando com JavaScript
IoTizando com JavaScriptIoTizando com JavaScript
IoTizando com JavaScriptHeider Lopes
 
Técnicas de Programação para a Web
Técnicas de Programação para a WebTécnicas de Programação para a Web
Técnicas de Programação para a WebLuiz Cláudio Silva
 
PHP Experience 2016 - [Workshop] APIs bem desenhadas como base para integrações
PHP Experience 2016 - [Workshop] APIs bem desenhadas como base para integraçõesPHP Experience 2016 - [Workshop] APIs bem desenhadas como base para integrações
PHP Experience 2016 - [Workshop] APIs bem desenhadas como base para integraçõesiMasters
 

Similar to Alexandria: um Sistema de Publicação Digital RESTful (20)

Como um grande sistema REST funciona
Como um grande sistema REST funcionaComo um grande sistema REST funciona
Como um grande sistema REST funciona
 
Construindo um sistema distribuido usando rest
Construindo um sistema distribuido usando restConstruindo um sistema distribuido usando rest
Construindo um sistema distribuido usando rest
 
5. rodando containers docker na aws
5. rodando containers docker na aws5. rodando containers docker na aws
5. rodando containers docker na aws
 
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
 
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...
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST Framework
 
No sql Orientado a documento
No sql Orientado a documentoNo sql Orientado a documento
No sql Orientado a documento
 
[Minha Vida TechDay] Novo Dieta e Saúde
[Minha Vida TechDay] Novo Dieta e Saúde[Minha Vida TechDay] Novo Dieta e Saúde
[Minha Vida TechDay] Novo Dieta e Saúde
 
Web Services
Web ServicesWeb Services
Web Services
 
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
 
Introdução sobre desenvolvimento web
Introdução sobre desenvolvimento webIntrodução sobre desenvolvimento web
Introdução sobre desenvolvimento web
 
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
 
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
 
Carreira do profissional de dados
Carreira do profissional de dadosCarreira do profissional de dados
Carreira do profissional de dados
 
IoTizando com JavaScript
IoTizando com JavaScriptIoTizando com JavaScript
IoTizando com JavaScript
 
Mini Curso Mashup Coreu
Mini Curso Mashup CoreuMini Curso Mashup Coreu
Mini Curso Mashup Coreu
 
Técnicas de Programação para a Web
Técnicas de Programação para a WebTécnicas de Programação para a Web
Técnicas de Programação para a Web
 
PHP Experience 2016 - [Workshop] APIs bem desenhadas como base para integrações
PHP Experience 2016 - [Workshop] APIs bem desenhadas como base para integraçõesPHP Experience 2016 - [Workshop] APIs bem desenhadas como base para integrações
PHP Experience 2016 - [Workshop] APIs bem desenhadas como base para integrações
 

More from 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 APILuis 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 TwitterLuis 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 7Luis 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 preocupadosLuis 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 restLuis 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
 
Explaining Semantic Web
Explaining Semantic WebExplaining Semantic Web
Explaining Semantic WebLuis Cipriani
 
Hbase: Introduction to column oriented databases
Hbase: Introduction to column oriented databasesHbase: Introduction to column oriented databases
Hbase: Introduction to column oriented databasesLuis 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
 
Fearless HTTP requests abuse
Fearless HTTP requests abuseFearless HTTP requests abuse
Fearless HTTP requests abuseLuis Cipriani
 

More from Luis Cipriani (10)

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 ...
 
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
 
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...
 
Fearless HTTP requests abuse
Fearless HTTP requests abuseFearless HTTP requests abuse
Fearless HTTP requests abuse
 

Alexandria: um Sistema de Publicação Digital RESTful

  • 1. Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utilizando REST e Hipermídia Luís Cipriani @lfcipriani (twitter, linkedin, github, ...) Seminário de Sistemas - IME (2013-04-08)
  • 3. hoje nós vamos falar sobre...
  • 5. Someone published a new REST API Let’s check it out!! o/
  • 6. mmm... just another HTTP-based RPC... http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
  • 7. por que há tanto mal entendimento em relação ao REST?
  • 8. quem entende errado, está fazendo errado?
  • 9. 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
  • 10. hoje nós vamos falar sobre...
  • 11. a nossa implementação do estilo arquitetural para sistemas baseados em rede proposto pelo Roy Fielding, mais conhecida como...
  • 12. REST
  • 14. “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
  • 15. gráfica distribuidora educação
  • 16. Viaje Aqui Recreio Bravo! Playboy Veja
  • 17. CMS’s existem desde os anos 90. Por que reiventamos a roda?
  • 18. { requisitos negócios Porque temos pessoas alta diversidade orçamentos de prioridades culturas
  • 19. Recreio Bravo! Playboy diretoria digital
  • 20. 14 sites em produção (em abr/2013)
  • 21. 50 desenvolvedores 12 arquitetos de software 6 Gerentes de Projeto 4 Gerentes de Produto 1 Advocate da Plataforma (em abr/2013)
  • 22. linguagens storage frameworks outros • ruby • MongoDB • rails • Solr • java • MySQL • sinatra • Hadoop • javascript • Hbase • goliath • RabbitMQ • HDFS • node.js • Varnish • PostgreSQL • play • New Relic • memcached • jetty • redis • tokamak • cachebag • HTTPMonkey https://github.com/abril
  • 23. infraestrutura Alexandria + sites • 91 VMs para ambientes dev, qa, stage • AMC (Abril Mídia Cloud): private cloud (Xen/Open Stack) • ou VMWare • ~100 VMs + 16 físicas para produção • Data center próprio, AWS, Heroku • Total aproximado: 207 máquinas (abr/2013)
  • 24. 12,5 milhões de pageviews (de 15/jan até 14/fev de 2013)
  • 25. HTTP
  • 26. 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
  • 27. • 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
  • 28. data-entry • entrada da Redação • aplicação web • ~ 1 para cada domínio • “API explorer”
  • 29.
  • 30. • admin do site sitetools • manipulação das áreas e templates • agiliza criação de produtos • a fronteira com o usuário • opcional
  • 31.
  • 32. domínio HTTP data-entry sitetools serviço
  • 34. REST
  • 35. Por que escolhemos REST? image from Roy Fielding dissertation (pag. 85)
  • 37. 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
  • 38. 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
  • 39. REST = LCODC$SS + U Stateless • Visibilidade • Escalabilidade • Performance de rede (recursos alocados) • Confiabilidade
  • 40. REST = LCODC$SS + U Stateless no Alexandria • HATEOAS implementado nas APIs • cookies nas operações destrutivas
  • 41. REST = LCODC$SS + U Cache • Eficiência • Confiabilidade • Escalabilidade • Performance percebida pelo usuário
  • 42. 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
  • 43. REST = LCODC$SS + U Layered System • Encapsula complexidade • Performance • Evolvabilidade percebida pelo usuário • Simplicidade
  • 44. 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
  • 45. REST = LCODC$SS + U Code-on-demand • Extensibilidade • Visibilidade • Simplificação do client
  • 46. 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
  • 47. REST = LCODC$SS + U Uniform interface • Simplificação pela generalidade • Performance • Visibilidade percebida pelo usuário • Desacoplamento • Restrita a dados com • Evolvabilidade granularidade larga
  • 48. REST = LCODC$SS + Uniform interface no Alexandria
  • 49. U resource identification URI universal resource identifier
  • 50. U resource identification /:tipo_recurso/:id
  • 53. 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)
  • 54. 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)
  • 55. 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>" }
  • 57. U representations e um tiquinho assim de XML ou melhor, de application/opensearchdescription+xml
  • 58. 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>
  • 59. U hypermedia image from the book Rest in Practice (by Jim Webber) (pag. 14)
  • 60. U hypermedia Exercício: criar uma atividade de um usuário no site. Você só sabe o entrypoint: http://socialcore.api.abril.com.br
  • 61. U hypermedia POST  http://socialcore.api.abril.com.br/ Accept:  application/json
  • 62. U hypermedia POST???
  • 63. U hypermedia HTTP/1.1 405 Method Not Allowed Allow: GET
  • 64. U hypermedia GET  http://socialcore.api.abril.com.br/ Accept:  application/json
  • 65. 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" } ] }
  • 67. 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" } ] }
  • 69. 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)
  • 70. 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" } ] }
  • 71. 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" } } }
  • 72. 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"]} ] }
  • 73. 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" } } }
  • 74. U hypermedia HTTP/1.1 201 Created Content-Type: application/json; charset=utf-8 Location: http://socialcore.api.abril.com.br/atividade/0922307 o/
  • 75. U application protocol representation metadata resource metadata HTTP status codes control data
  • 77. pontos importantes em performance • performance dos • short stacks connectors • evented servers • non-blocking • libs padronizadas HTTP clients client • caches • HTTP plumbing origin server • cache local • middleware • good TTL strategy architecture • middleware • libs padronizadas architecture
  • 78. • 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
  • 79. Assumimos que nossa arquitetura está válida.
  • 80. mas... custo aceitável + necessidades atendidas * ß MTRH
  • 81. e quando REST não for suficiente?
  • 84.
  • 85. • bit.ly/abril_qcon_refs • engineering.abril.com.br Obrigado! • talleye.com • digital.abril.com.br