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

Mais conteúdo relacionado

Mais procurados

Introdução sobre desenvolvimento web
Introdução sobre desenvolvimento webIntrodução sobre desenvolvimento web
Introdução sobre desenvolvimento web
Rodrigo Rodrigues
 
Desenvolvimento Web com CakePHP
Desenvolvimento Web com CakePHPDesenvolvimento Web com CakePHP
Desenvolvimento Web com CakePHP
Sérgio Vilar
 

Mais procurados (20)

Construindo um sistema distribuido usando rest
Construindo um sistema distribuido usando restConstruindo um sistema distribuido usando rest
Construindo um sistema distribuido usando rest
 
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...
 
Rest Teoria E Pratica
Rest Teoria E PraticaRest Teoria E Pratica
Rest Teoria E Pratica
 
Criando Webservices RESTFul com CakePHP
Criando Webservices RESTFul com CakePHPCriando Webservices RESTFul com CakePHP
Criando Webservices RESTFul com CakePHP
 
Webservices
WebservicesWebservices
Webservices
 
Desenvolvimento web - conceitos, tecnologia e tendências.
Desenvolvimento web - conceitos, tecnologia e tendências.Desenvolvimento web - conceitos, tecnologia e tendências.
Desenvolvimento web - conceitos, tecnologia e tendências.
 
Web 2.0 e RIA com PHP
Web 2.0 e RIA com PHPWeb 2.0 e RIA com PHP
Web 2.0 e RIA com PHP
 
Android webservice
Android webserviceAndroid webservice
Android webservice
 
JavaScript
JavaScriptJavaScript
JavaScript
 
Boas práticas de API Design
Boas práticas de API DesignBoas práticas de API Design
Boas práticas de API Design
 
Introdução a Web Services
Introdução a Web ServicesIntrodução a Web Services
Introdução a Web Services
 
Desenvolvimento Web : HTML5, CSS3 & JavaScript
Desenvolvimento Web : HTML5, CSS3 & JavaScriptDesenvolvimento Web : HTML5, CSS3 & JavaScript
Desenvolvimento Web : HTML5, CSS3 & JavaScript
 
Introdução APIs RESTful
Introdução APIs RESTfulIntrodução APIs RESTful
Introdução APIs RESTful
 
Quokka CMS - Desenvolvendo web apps com Flask e MongoDB - grupy - Outubro 2015
Quokka CMS - Desenvolvendo web apps com Flask e MongoDB - grupy - Outubro 2015Quokka CMS - Desenvolvendo web apps com Flask e MongoDB - grupy - Outubro 2015
Quokka CMS - Desenvolvendo web apps com Flask e MongoDB - grupy - Outubro 2015
 
Introdução sobre desenvolvimento web
Introdução sobre desenvolvimento webIntrodução sobre desenvolvimento web
Introdução sobre desenvolvimento web
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST Framework
 
Introdução a programação para a Internet
Introdução a programação para a InternetIntrodução a programação para a Internet
Introdução a programação para a Internet
 
Análise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e Zend
Análise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e ZendAnálise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e Zend
Análise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e Zend
 
Desenvolvimento Web com CakePHP
Desenvolvimento Web com CakePHPDesenvolvimento Web com CakePHP
Desenvolvimento Web com CakePHP
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks php
 

Destaque (6)

TimesTen In-Memory Database
TimesTen In-Memory DatabaseTimesTen In-Memory Database
TimesTen In-Memory Database
 
Baixo Acoplamento e Alta Coesão
Baixo Acoplamento e Alta CoesãoBaixo Acoplamento e Alta Coesão
Baixo Acoplamento e Alta Coesão
 
REST – Desmistificando A Implementação De Web Services REST Em Java Monografia
REST – Desmistificando A Implementação De Web Services REST Em Java MonografiaREST – Desmistificando A Implementação De Web Services REST Em Java Monografia
REST – Desmistificando A Implementação De Web Services REST Em Java Monografia
 
Gestão de Projetos - Exemplo de Documentação de Projeto
Gestão de Projetos - Exemplo de Documentação de ProjetoGestão de Projetos - Exemplo de Documentação de Projeto
Gestão de Projetos - Exemplo de Documentação de Projeto
 
CONEXÃO BANCO DE DADOS MYSQL COM JAVA
CONEXÃO BANCO DE DADOS MYSQL  COM JAVACONEXÃO BANCO DE DADOS MYSQL  COM JAVA
CONEXÃO BANCO DE DADOS MYSQL COM JAVA
 
Acesso a Banco de Dados em Java usando JDBC
Acesso a Banco de Dados em Java usando JDBCAcesso a Banco de Dados em Java usando JDBC
Acesso a Banco de Dados em Java usando JDBC
 

Semelhante a Como um grande sistema REST funciona - arquitetura e desempenho

Apresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo SitesApresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo Sites
thiagolima
 
Ruby on Rails 100% na cloud com heroku e outros serviços
Ruby on Rails 100% na cloud com heroku e outros serviçosRuby on Rails 100% na cloud com heroku e outros serviços
Ruby on Rails 100% na cloud com heroku e outros serviços
Bruno Ghisi
 
Desenvolvimento web com software livre
Desenvolvimento web com software livreDesenvolvimento web com software livre
Desenvolvimento web com software livre
Ruan Carvalho
 

Semelhante a Como um grande sistema REST funciona - arquitetura e desempenho (20)

Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
 
Como um grande sistema REST funciona
Como um grande sistema REST funcionaComo um grande sistema REST funciona
Como um grande sistema REST funciona
 
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
 
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
 
Apresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo SitesApresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo Sites
 
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
 
WSO2 - Portfólio de Produtos, Soluções e Suportes
WSO2 - Portfólio de Produtos, Soluções e SuportesWSO2 - Portfólio de Produtos, Soluções e Suportes
WSO2 - Portfólio de Produtos, Soluções e Suportes
 
AWS Data Immersion Webinar Week - Planeje e entenda como criar um repositório...
AWS Data Immersion Webinar Week - Planeje e entenda como criar um repositório...AWS Data Immersion Webinar Week - Planeje e entenda como criar um repositório...
AWS Data Immersion Webinar Week - Planeje e entenda como criar um repositório...
 
TDC 2017 - Borg até o Prometheus: Site Reliability Engineering
TDC 2017 - Borg até o Prometheus: Site Reliability EngineeringTDC 2017 - Borg até o Prometheus: Site Reliability Engineering
TDC 2017 - Borg até o Prometheus: Site Reliability Engineering
 
Apresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvemApresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvem
 
Site estático + Hospedagem Gratuita.pdf
Site estático + Hospedagem Gratuita.pdfSite estático + Hospedagem Gratuita.pdf
Site estático + Hospedagem Gratuita.pdf
 
TDC2016POA | Trilha BigData - Orquestrando Hadoop, Cassandra e MongoDB com o ...
TDC2016POA | Trilha BigData - Orquestrando Hadoop, Cassandra e MongoDB com o ...TDC2016POA | Trilha BigData - Orquestrando Hadoop, Cassandra e MongoDB com o ...
TDC2016POA | Trilha BigData - Orquestrando Hadoop, Cassandra e MongoDB com o ...
 
Azure e suas vantagens (Palestra 1)
Azure e suas vantagens (Palestra 1) Azure e suas vantagens (Palestra 1)
Azure e suas vantagens (Palestra 1)
 
SharePoint Framework - Uma plataforma aberta e conectada
SharePoint Framework - Uma plataforma aberta e conectadaSharePoint Framework - Uma plataforma aberta e conectada
SharePoint Framework - Uma plataforma aberta e conectada
 
IBM WebSphere Portal
IBM WebSphere PortalIBM WebSphere Portal
IBM WebSphere Portal
 
Workshop Hands-On APIX 2018 - Trilha Básica
Workshop Hands-On APIX 2018 - Trilha BásicaWorkshop Hands-On APIX 2018 - Trilha Básica
Workshop Hands-On APIX 2018 - Trilha Básica
 
Desenvolvimento web com software livre
Desenvolvimento web com software livreDesenvolvimento web com software livre
Desenvolvimento web com software livre
 
Desenvolvimento web com Software Livre
Desenvolvimento web com Software LivreDesenvolvimento web com Software Livre
Desenvolvimento web com Software Livre
 
Tudo que Você Precisa Saber para Hackear o Google
Tudo que Você Precisa Saber para Hackear o GoogleTudo que Você Precisa Saber para Hackear o Google
Tudo que Você Precisa Saber para Hackear o Google
 
Visão Geral De Desenvolvimento Web Sre 2012
Visão Geral De Desenvolvimento Web   Sre 2012Visão Geral De Desenvolvimento Web   Sre 2012
Visão Geral De Desenvolvimento Web Sre 2012
 

Mais de David Robert Camargo de Campos

Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
David Robert Camargo de Campos
 

Mais de David Robert Camargo de Campos (15)

Evolução cultural - Criando Times de Alto Desempenho
Evolução cultural - Criando Times de Alto DesempenhoEvolução cultural - Criando Times de Alto Desempenho
Evolução cultural - Criando Times de Alto Desempenho
 
Evolução cultural - Criando times de alto desempenho
Evolução cultural - Criando times de alto desempenhoEvolução cultural - Criando times de alto desempenho
Evolução cultural - Criando times de alto desempenho
 
Introdução ao kotlin
Introdução ao kotlinIntrodução ao kotlin
Introdução ao kotlin
 
O uso de PWA e o futuro do desenvolvimento mobile com React Native e Kotlin
O uso de PWA e o futuro do desenvolvimento mobile com React Native e KotlinO uso de PWA e o futuro do desenvolvimento mobile com React Native e 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
Evolução cultural: Criando times de alto desempenho no Elo7Evolução cultural: Criando times de alto desempenho no Elo7
Evolução cultural: Criando times de alto desempenho no Elo7
 
Cultura na engenharia & Impacto no recrutamento
Cultura na engenharia & Impacto no recrutamentoCultura na engenharia & Impacto no recrutamento
Cultura na engenharia & Impacto no recrutamento
 
Os desafios de um chat integrado ao checkout
Os desafios de um chat integrado ao checkoutOs desafios de um chat integrado ao checkout
Os desafios de um chat integrado ao checkout
 
Times de Alta Performance
Times de Alta PerformanceTimes de Alta Performance
Times de Alta Performance
 
Programando em Go
Programando em GoProgramando em Go
Programando em Go
 
An introduction to programming in Go
An introduction to programming in GoAn introduction to programming in Go
An introduction to programming in Go
 
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
Lidando com Java obsoleto: do Struts 1.0 ao CDI - QConSP 2014
 
Implementação, design ou arquitetura?
Implementação, design ou arquitetura?Implementação, design ou arquitetura?
Implementação, design ou arquitetura?
 
Dojo abril
Dojo abrilDojo abril
Dojo abril
 
Dicas para deixar seu código mais Robusto
Dicas para deixar seu código mais RobustoDicas para deixar seu código mais Robusto
Dicas para deixar seu código mais Robusto
 
Robustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesRobustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefes
 

Último

Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
Natalia Granato
 

Último (6)

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 

Como um grande sistema REST funciona - arquitetura e desempenho