SlideShare uma empresa Scribd logo
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”
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utilizando REST e Hípermídia.
• admin do site                       sitetools
• manipulação das áreas e templates
• agiliza criação de produtos
• a fronteira com o usuário
• opcional
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utilizando REST e Hípermídia.
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
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utilizando REST e Hípermídia.
• bit.ly/abril_qcon_refs
• engineering.abril.com.br   Obrigado!
• talleye.com
• digital.abril.com.br

Mais conteúdo relacionado

PPT
Case CMS Abril - System of Systems e Arquitetura (quase) Caótica.
PDF
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
PDF
Como um grande sistema REST funciona - arquitetura e desempenho
PDF
Rest Teoria E Pratica
KEY
PHP RESTful Web Services - PHPConf'09
PDF
PHP RESTful Web Services
PDF
Criando e consumindo webservice REST com PHP e JSON
PDF
Mini Curso Web Services com PHP
Case CMS Abril - System of Systems e Arquitetura (quase) Caótica.
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um grande sistema REST funciona - arquitetura e desempenho
Rest Teoria E Pratica
PHP RESTful Web Services - PHPConf'09
PHP RESTful Web Services
Criando e consumindo webservice REST com PHP e JSON
Mini Curso Web Services com PHP

Semelhante a Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utilizando REST e Hípermídia. (20)

PPT
Como um grande sistema REST funciona
PDF
Construindo um sistema distribuido usando rest
PDF
Rest Java One
PPTX
Rest workshop
PDF
Mashups: Criando Valor na Web 2.0 (BandTec)
PDF
O que é esse tal de rest? [PyBR2016]
PPTX
Uaijug ADF - spring boot - microservice - Introdução
PDF
HTTP, Requisição e Resposta
PPTX
A Web é uma API
KEY
Do Rest Ao Restfull - Rio Jug
PDF
APIs Abertas
PDF
Aula-16-Semana-05-RESTFull-Services Aula.pdf
PDF
Considerações técnicas para atlas temáticos digitais e interfaces para dados ...
PDF
Atlas Digitais e interfaces para dados abertos
PPTX
Web Services
PDF
Mashups: Criando Valor na Web 2.0
PPTX
Desbravando o REST com Python
PDF
Meet-ups Brazil: Padrões de Gerenciamento de Conteúdo / Patterns in Content M...
PDF
Restful Introdução com exemplo - Part 2
PDF
Arquiteturas de sistemas reais
Como um grande sistema REST funciona
Construindo um sistema distribuido usando rest
Rest Java One
Rest workshop
Mashups: Criando Valor na Web 2.0 (BandTec)
O que é esse tal de rest? [PyBR2016]
Uaijug ADF - spring boot - microservice - Introdução
HTTP, Requisição e Resposta
A Web é uma API
Do Rest Ao Restfull - Rio Jug
APIs Abertas
Aula-16-Semana-05-RESTFull-Services Aula.pdf
Considerações técnicas para atlas temáticos digitais e interfaces para dados ...
Atlas Digitais e interfaces para dados abertos
Web Services
Mashups: Criando Valor na Web 2.0
Desbravando o REST com Python
Meet-ups Brazil: Padrões de Gerenciamento de Conteúdo / Patterns in Content M...
Restful Introdução com exemplo - Part 2
Arquiteturas de sistemas reais
Anúncio

Mais de Luis Cipriani (10)

PDF
Adventures with Raspberry Pi and Twitter API
PDF
Capturando o pulso do planeta com as APIs de Streaming do Twitter
PDF
Twitter e suas APIs de Streaming - Campus Party Brasil 7
PDF
Segurança de APIs HTTP, um guia sensato para desenvolvedores preocupados
PDF
API Caching, why your server needs some rest
PDF
Explaining A Programming Model for Context-Aware Applications in Large-Scale ...
PDF
Explaining Semantic Web
PDF
Hbase: Introduction to column oriented databases
KEY
Case Abril: Tracking real time user behavior in websites Homes with Ruby, Sin...
KEY
Fearless HTTP requests abuse
Adventures with Raspberry Pi and Twitter API
Capturando o pulso do planeta com as APIs de Streaming do Twitter
Twitter e suas APIs de Streaming - Campus Party Brasil 7
Segurança de APIs HTTP, um guia sensato para desenvolvedores preocupados
API Caching, why your server needs some rest
Explaining A Programming Model for Context-Aware Applications in Large-Scale ...
Explaining Semantic Web
Hbase: Introduction to column oriented databases
Case Abril: Tracking real time user behavior in websites Homes with Ruby, Sin...
Fearless HTTP requests abuse
Anúncio

Último (20)

PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PPTX
Aula sobre banco de dados com firebase db
PPTX
Curso de Java 17 - (JEE (Sessões e Cookies)).pptx
PPTX
Curso de Java 16 - (JEE (Utilizando o Padrão MVC)).pptx
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PPTX
Curso de Java 9 - (Threads) Multitarefas.pptx
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PPTX
Aula sobre desenvolvimento de aplicativos
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PDF
Apple Pippin Uma breve introdução. - David Glotz
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PPTX
Curso de Java 12 - (JDBC, Transation, Commit e Rollback).pptx
PPTX
Curso de Java 11 - (Serializable (Serialização de Objetos)).pptx
PPTX
Curso de Java 10 - (IO Manipulação de Arquivos).pptx
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PPTX
Émile Durkheim slide elaborado muito bom
PPTX
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
COBITxITIL-Entenda as diferença em uso governança TI
Aula sobre banco de dados com firebase db
Curso de Java 17 - (JEE (Sessões e Cookies)).pptx
Curso de Java 16 - (JEE (Utilizando o Padrão MVC)).pptx
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Curso de Java 9 - (Threads) Multitarefas.pptx
Custos e liquidação no SAP Transportation Management, TM130 Col18
Aula sobre desenvolvimento de aplicativos
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Apple Pippin Uma breve introdução. - David Glotz
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Curso de Java 12 - (JDBC, Transation, Commit e Rollback).pptx
Curso de Java 11 - (Serializable (Serialização de Objetos)).pptx
Curso de Java 10 - (IO Manipulação de Arquivos).pptx
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Émile Durkheim slide elaborado muito bom
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...

Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utilizando REST e Hípermídia.

  • 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”
  • 30. • admin do site sitetools • manipulação das áreas e templates • agiliza criação de produtos • a fronteira com o usuário • opcional
  • 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?
  • 85. • bit.ly/abril_qcon_refs • engineering.abril.com.br Obrigado! • talleye.com • digital.abril.com.br