SlideShare uma empresa Scribd logo
Construindo um
sistema distribuido
usando REST
Palestra ministrada na Universidade São Judas Tadeu
David Robert
davidrobert@gmail.com
twitter: while42
github: davidrobert
AMBIENTE
Construindo um sistema distribuido usando rest
gráfica
distribuidora
educação
Playboy Veja
Quatro Rodas
Super Interessante
Placar
“organizações que projetam sistemas
são restritas a produzir projetos que
são cópias das estruturas de
comunicação dessas organizações”
Lei de
Conway
http://www.melconway.com/Home/Conways_Law.html
CMS’s existem desde os anos 90.
Por que reiventamos a roda?
Porque
temos alta
diversidade
de
requisitos
negócios
pessoas
orçamentos
prioridades
culturas
{
Como construir uma
boa arquitetura?
Integração
o velho problema
Banco de Dados
Solução Prática #1
Solução Prática #2
Transferência de Arquivos
Solução Prática #3
Web Services
Como são os Web Services hoje?
Como são os Web Services hoje?
● WSDL
● SOAP
● XML
● RPC (Remote Procedure Call)
etc
Construindo um sistema distribuido usando rest
1) Precisamos disso
tudo mesmo?
2) Alguém já não
resolveu isso?
3) Como avaliar se é
uma boa
arquitetura?
boa
arquitetura
necessidades
atendidas
custo
aceitável
= + * ß
ß
quão bem o seu cliente
sabe pedir o que quer
MTRH
MTRH
mean time to
recovery
happiness
ALEXANDRIA
diretoria
digital
Playbo
y
Vej
a
Quatro
Rodas
RAIO X
16 sites em produção
+/- 60 desenvolvedores
13 arquitetos de software
6 Gerentes de Projeto
4 Gerentes de Produto
1 Advocate da Plataforma
● MongoDB
● MySQL
● Hbase
● HDFS
● PostgreSQL
● memcached
● redis
● Ruby
● Java
● Javascript
● rails
● sinatra
● goliath
● node.js
● play
● jetty
● tokamak
● cachebag
● restfulie
Linguagens Storages Frameworks outros
● Solr
● Hadoop
● RabbitMQ
● Varnish
● New Relic
● Tracelytics
https://github.com/abril
Infraestrutura Alexandria + sites
● 91 VMs para ambientes dev, qa, stage
● AMC (Abril Mídia Cloud): private cloud (Xen/Open Stack)
● ou VMWare
● ~100 VMs + 20 físicas para produção
● Data center próprio, AWS, Heroku
● Total aproximado: 220 máquinas
+15 milhões de pageviews
(de jan até fev de 2013)
HTTP
domínio
● acesso e manipulação de recursos
● implementa regras de negócio
● servidor HTTP + base de dados
● infra “isolada”
● ~ 8 domínios
● ex: editorial (matérias, galerias, etc), anotações
(comentários), estabelecimentos, mídia, pessoas
serviço
● consumo e manipulação de recursos
● servidor HTTP + (opcional base de dados)
● infra “isolada”
● ~ 12 serviços
● ex: console, socialcore, search, Abril ID, abr.io, etc
data-entry
● entrada da Redação
● aplicação web
● ~ 1 para cada domínio
● “API explorer”
Construindo um sistema distribuido usando rest
sitetools● admin do site
● manipulação das áreas e templates
● agiliza criação de produtos
● a fronteira com o usuário
● opcional
Construindo um sistema distribuido usando rest
HTTP
domínio
serviço
data-entry sitetools
system of systems
Como integrar?
Construindo um sistema distribuido usando rest
Construindo um sistema distribuido usando rest
REST
Por que escolher REST?
Por que escolhemos REST?
● Protocolo de transferência amplamente
utilizado
● Escalabilidade
● Performance alta
● Alta disponibilidade
● Permitir evolução sem parar o sistema
● Permitir evolução sem quebrar os clientes
● Segurança
Por que escolhemos REST?
● HTTP
● Escalabilidade
● Performance alta
● Alta disponibilidade
● Permitir evolução sem parar o sistema
● Permitir evolução sem quebrar os clientes
● Segurança
Por que escolhemos REST?
● HTTP
● Web Cache
● Performance alta
● Alta disponibilidade
● Permitir evolução sem parar o sistema
● Permitir evolução sem quebrar os clientes
● Segurança
Por que escolhemos REST?
● HTTP
● Web Cache
● Web Proxy (localização geografica)
● Alta disponibilidade
● Permitir evolução sem parar o sistema
● Permitir evolução sem quebrar os clientes
● Segurança
Por que escolhemos REST?
● HTTP
● Web Cache
● Web Proxy (localização geografica)
● Load Balancers "comoditizados"
● Permitir evolução sem parar o sistema
● Permitir evolução sem quebrar os clientes
● Segurança
Por que escolhemos REST?
● HTTP
● Web Cache
● Web Proxy (localização geografica)
● Load Balancers "comoditizados"
● Load Balancers
● Permitir evolução sem quebrar os clientes
● Segurança
Por que escolhemos REST?
● HTTP
● Web Cache
● Web Proxy (localização geografica)
● Load Balancers "comoditizados"
● Load Balancers
● HTML, JSON, XML
● Segurança
Por que escolhemos REST?
● HTTP
● Web Cache
● Web Proxy (localização geografica)
● Load Balancers "comoditizados"
● Load Balancers
● HTML, JSON, XML
● HTTPS / TLS
Uniform interface no
Alexandria
resouce identification
http://editorial.api.abril.com.br/materia/dicas
http://editorial.api.abril.com.br/materia/ac23657fg
http://bebe.abril.com.br/materia/ac23657fg
resources
resources
{
"tipo_recurso" : "materia",
"link" : [
{
"href" : "http://editorial.api.abril.com.br/materia/4f0dea5a1e13694",
"rel" : "self",
"type" : "application/json"
},
{
"href" : "http://editorial.api.abril.com.br/materias",
"rel" : "materias",
"type" : "application/json"
}
],
"id" : "http://editorial.api.abril.com.br/materia/4f0dea5a1e13694",
"slug" : "o-quintal-da-realeza",
"marca" : "viajeaqui",
"status" : "disponivel",
"descricao_conteudo" : "O quintal da realeza",
"fonte" : "viajeaqui",
(continua)
representations
JSON
e um tiquinho assim de XML
ou melhor,
de application/opensearchdescription+xml
representations
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" xmlns:grafo="http:
//socialcore.api.abril.com.br/grafo/busca">
<ShortName>Buscar relacionamentos</ShortName>
<Description>Busca de relacionamentos no grafo</Description>
<Url type="application/json"
template="http://socialcore.api.abril.com.br/grafo/busca?usuario={grafo:usuario?}
&amp;tipo={grafo:tipo}"/>
<Query role="example"
title="Exemplo de valores dos parâmetros"
grafo:usuario="id do usuario"
grafo:tipo="segue |seguido_por " />
</OpenSearchDescription>
representations
hypermedia
Exemplo: criar uma atividade
de um usuário no site.
Sabendo somente o entrypoint:
http://socialcore.api.abril.com.br
POST http://socialcore.api.abril.com.br/
Accept: application/json
hypermedia
POST???
hypermedia
HTTP/1.1 405 Method Not Allowed
Allow: GET
hypermedia
GET http://socialcore.api.abril.com.br/
Accept: application/json
hypermedia
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
{
"titulo": "socialcore",
"link": [
{
"href": "http://socialcore.api.abril.com.br/",
"rel": "self",
"type": "application/json"
},
{
"href": "http://socialcore.api.abril.com.br/atividade",
"rel": "atividade",
"type": "application/json"
},
{
"href": "http://socialcore.api.abril.com.br/grafo",
"rel": "grafo",
"type": "application/json"
}
]
}
hypermedia
GET http://socialcore.api.abril.com.br/atividade
Accept: application/json
hypermedia
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
{
"titulo": "Entry Point de Atividades",
"link": [
{
"href": "http://socialcore.api.abril.com.br/atividade/template",
"rel": "template",
"type": "application/json"
},
{
"href": "http://socialcore.api.abril.com.br/atividade/busca/descritor",
"rel": "search",
"type": "application/opensearchdescription+xml"
},
{
"href": "http://socialcore.api.abril.com.br/atividade/stat/descritor",
"rel": "stat",
"type": "application/opensearchdescription+xml"
}
]
}
hypermedia
GET http://socialcore.api.abril.com.br/atividade/template
Accept: application/json
hypermedia
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
{
"atividade": {
"app": "",
"created_at": "",
"usuario": "",
"tipo": "",
"objeto": {
"tipo": ""
},
"resultado": {
"tipo": ""
}
},
(continua)
hypermedia
"link": [
{
"href": "http://socialcore.api.abril.com.br/atividade",
"rel": "atividade",
"type": "application/json"
},
{
"href": "http://socialcore.api.abril.com.br/atividade/busca/descritor",
"rel": "search",
"type": "application/opensearchdescription+xml"
},
{
"href": "http://socialcore.api.abril.com.br/atividade/stat/descritor",
"rel": "stat",
"type": "application/opensearchdescription+xml"
}
]
}
hypermedia
POST http://socialcore.api.abril.com.br/atividade
Accept: application/json
Content-Type: application/json; charset=utf-8
Authentication: Basic 37rnx9w87rjdw87gri
{
"atividade": {
"app": "http://aapg.api.abril.com.br/produtos/1",
"created_at": 1325086429,
"tipo": "comentar",
"objeto": {
"descricao": "Titulo da materia",
"id": "http://veja.abril.com.br/noticia/economia/confianca-da",
"tipo": "materia"
},
"resultado": {
"corpo": "otima materia",
"id": "http://veja.abril.com.br/noticia/economia/confianca-da/comments/1",
"tipo": "comentario"
}
}
}
hypermedia
HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json; charset=utf-8
{
"tipo_recurso":"erro",
"atividade":{
"usuario":"",
},
"erros":[
{"atributo":"usuario","mensagem":["é obrigatório"]}
]
}
hypermedia
POST http://socialcore.api.abril.com.br/atividade
Accept: application/json
Content-Type: application/json; charset=utf-8
Authentication: Basic 37rnx9w87rjdw87gri
{
"atividade": {
"app": "http://aapg.api.abril.com.br/produtos/1",
"created_at": 1325086429,
"usuario": "http://aapg.api.abril.com.br/usuarios/2",
"tipo": "comentar",
"objeto": {
"descricao": "Titulo da materia",
"id": "http://veja.abril.com.br/noticia/economia/confianca-da",
"tipo": "materia"
},
"resultado": {
"corpo": "otima materia",
"id": "http://veja.abril.com.br/noticia/economia/confianca-da/comments/1",
"tipo": "comentario"
}
}
}
hypermedia
HTTP/1.1 201 Created
Content-Type: application/json; charset=utf-8
Location: http://socialcore.api.abril.com.
br/atividade/0922307
o/
hypermedia
application
protocol
HTTPstatus codes
representation metadata
resource metadata
control data
Lições aprendidas
pontos importantes em performance
client
origin server
● performance dos connectors
● non-blocking HTTP clients
● cache local
● middleware architecture
● libs padronizadas
● short stacks
● evented servers
● libs padronizadas
● good TTL strategy
● middleware architecture
● caches
● HTTP plumbing
● Lei de Postel
"Seja conservador no que faz, seja liberal no que você
aceita dos outros"
●
● Lei de Postel
"Seja conservador no que faz, seja liberal no que você
aceita dos outros"
● REST é uma arquitetura de longo prazo
●
● Lei de Postel
"Seja conservador no que faz, seja liberal no que você
aceita dos outros"
● REST é uma arquitetura de longo prazo
● Defenda com todas as suas forças:
● seus metadados (recursos)
● sua interface
●
● Lei de Postel
"Seja conservador no que faz, seja liberal no que você
aceita dos outros"
● REST é uma arquitetura de longo prazo
● Defenda com todas as suas forças:
● seus metadados (recursos)
● sua interface
● Documentação é essencial
●
● Lei de Postel
"Seja conservador no que faz, seja liberal no que você
aceita dos outros"
● REST é uma arquitetura de longo prazo
● Defenda com todas as suas forças:
● seus metadados (recursos)
● sua interface
● Documentação é essencial
● Independência de desenvolvimento dos nós tem suas
desvantagens
●
● Lei de Postel
"Seja conservador no que faz, seja liberal no que você
aceita dos outros"
● REST é uma arquitetura de longo prazo
● Defenda com todas as suas forças:
● seus metadados (recursos)
● sua interface
● Documentação é essencial
● Independência de desenvolvimento dos nós tem suas
desvantagens
● Medir/monitorar o desempenho é importantíssimo
Assumimos que nossa
arquitetura está válida
necessidades
atendidas
custo
aceitável
+ * ß
MTRH
mas...
e quando REST
não for suficiente?
não use REST
Os responsáveis
PERGUNTAS ?
engineering.abril.com.br
digital.abril.com.br
Obrigado!
David Robert

Mais conteúdo relacionado

PDF
Como um grande sistema REST funciona - arquitetura e desempenho
PPTX
REST: Padrões e Melhores Práticas
PPT
Web Services Rest
PDF
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
ODP
Boas práticas no desenvolvimento de uma RESTful API
PDF
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]
PDF
Desenvolvimento Web : HTML5, CSS3 & JavaScript
PDF
Modelagem e implementação de um sistema de arquivos distribuído baseado em DHT
Como um grande sistema REST funciona - arquitetura e desempenho
REST: Padrões e Melhores Práticas
Web Services Rest
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Boas práticas no desenvolvimento de uma RESTful API
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]
Desenvolvimento Web : HTML5, CSS3 & JavaScript
Modelagem e implementação de um sistema de arquivos distribuído baseado em DHT

Destaque (7)

PPTX
Android webservice
PPTX
Android Destin
PPTX
Android 03 - WebService
PPTX
Android 04 - Persistência Local & SplashScreen
PDF
Sistemas De Arquivos Distribuídos (SAD)
PDF
Capítulo 10 - Sincronização de dados usando JSON
PDF
Criando e consumindo webservice REST com PHP e JSON
Android webservice
Android Destin
Android 03 - WebService
Android 04 - Persistência Local & SplashScreen
Sistemas De Arquivos Distribuídos (SAD)
Capítulo 10 - Sincronização de dados usando JSON
Criando e consumindo webservice REST com PHP e JSON
Anúncio

Semelhante a Construindo um sistema distribuido usando rest (20)

PPT
Como um grande sistema REST funciona
PDF
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
PDF
Aula-16-Semana-05-RESTFull-Services Aula.pdf
PPTX
Web Services
KEY
Do Rest Ao Restfull - Rio Jug
PDF
PHP RESTful Web Services
PPTX
Rest workshop
KEY
PHP RESTful Web Services - PHPConf'09
PDF
Design de RESTful APIs
PPTX
Desbravando o REST com Python
PDF
O que é esse tal de rest? [PyBR2016]
PDF
InterCon 2017 - Design Coerente: decisões de tecnologia para APIs - Ravan Scafi
PDF
Rest Teoria E Pratica
PDF
WordPress como um backend de seus aplicativos
PDF
Trabalho final psdc
PDF
Introdução APIs RESTful
PDF
Mashups: Criando Valor na Web 2.0
PDF
Mashups: Criando Valor na Web 2.0 (BandTec)
PPTX
Integrando sua App ao Mundo via REST/JSON
PDF
Expondo APIs de back-ends legados e travados
Como um grande sistema REST funciona
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
Aula-16-Semana-05-RESTFull-Services Aula.pdf
Web Services
Do Rest Ao Restfull - Rio Jug
PHP RESTful Web Services
Rest workshop
PHP RESTful Web Services - PHPConf'09
Design de RESTful APIs
Desbravando o REST com Python
O que é esse tal de rest? [PyBR2016]
InterCon 2017 - Design Coerente: decisões de tecnologia para APIs - Ravan Scafi
Rest Teoria E Pratica
WordPress como um backend de seus aplicativos
Trabalho final psdc
Introdução APIs RESTful
Mashups: Criando Valor na Web 2.0
Mashups: Criando Valor na Web 2.0 (BandTec)
Integrando sua App ao Mundo via REST/JSON
Expondo APIs de back-ends legados e travados
Anúncio

Mais de David Robert Camargo de Campos (15)

PDF
Evolução cultural - Criando Times de Alto Desempenho
PDF
Evolução cultural - Criando times de alto desempenho
PDF
Introdução ao kotlin
PDF
O uso de PWA e o futuro do desenvolvimento mobile com React Native e Kotlin
PDF
Evolução cultural: Criando times de alto desempenho no Elo7
PDF
Cultura na engenharia & Impacto no recrutamento
PDF
Os desafios de um chat integrado ao checkout
PDF
Times de Alta Performance
PDF
PDF
An introduction to programming in Go
PDF
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
PDF
Implementação, design ou arquitetura?
PDF
Dicas para deixar seu código mais Robusto
PDF
Robustez de Software - Como ouvir menos reclamações dos seus chefes
Evolução cultural - Criando Times de Alto Desempenho
Evolução cultural - Criando times de alto desempenho
Introdução ao kotlin
O uso de PWA e o futuro do desenvolvimento mobile com React Native e Kotlin
Evolução cultural: Criando times de alto desempenho no Elo7
Cultura na engenharia & Impacto no recrutamento
Os desafios de um chat integrado ao checkout
Times de Alta Performance
An introduction to programming in Go
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
Implementação, design ou arquitetura?
Dicas para deixar seu código mais Robusto
Robustez de Software - Como ouvir menos reclamações dos seus chefes

Último (20)

PPTX
Émile Durkheim slide elaborado muito bom
PPTX
Curso de Java 10 - (IO Manipulação de Arquivos).pptx
PPTX
Curso de Java 16 - (JEE (Utilizando o Padrão MVC)).pptx
PDF
Apple Pippin Uma breve introdução. - David Glotz
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PPTX
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PDF
Processos na gestão de transportes, TM100 Col18
PPTX
Curso de Java 17 - (JEE (Sessões e Cookies)).pptx
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PPTX
Curso de Java 15 - (Uso de Servlets (Entendendo a Estrutura)).pptx
PPTX
Curso de Java 9 - (Threads) Multitarefas.pptx
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PPTX
Aula 18 - Manipulacao De Arquivos python
PPTX
Curso de Java 11 - (Serializable (Serialização de Objetos)).pptx
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PPTX
Curso de Java 14 - (Explicações Adicionais (Classes Abstrata e Interface)).pptx
Émile Durkheim slide elaborado muito bom
Curso de Java 10 - (IO Manipulação de Arquivos).pptx
Curso de Java 16 - (JEE (Utilizando o Padrão MVC)).pptx
Apple Pippin Uma breve introdução. - David Glotz
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Processos na gestão de transportes, TM100 Col18
Curso de Java 17 - (JEE (Sessões e Cookies)).pptx
Custos e liquidação no SAP Transportation Management, TM130 Col18
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Curso de Java 15 - (Uso de Servlets (Entendendo a Estrutura)).pptx
Curso de Java 9 - (Threads) Multitarefas.pptx
COBITxITIL-Entenda as diferença em uso governança TI
Aula 18 - Manipulacao De Arquivos python
Curso de Java 11 - (Serializable (Serialização de Objetos)).pptx
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Curso de Java 14 - (Explicações Adicionais (Classes Abstrata e Interface)).pptx

Construindo um sistema distribuido usando rest