SlideShare una empresa de Scribd logo
1 de 85
Como um grande
sistema REST funciona
David Robert
davidrobert@gmail.com
twitter: while42
github: davidrobert
AMBIENTE
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
{
boa
arquitetura
necessidades
atendidas
custo
aceitável
= + *ß
ßquão bem o seu cliente
sabe pedir o que quer :-P
MTRH
MTRH
mean time to
recovery happiness
diretoria digital
Playboy
Veja
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
• HTTPMonkey
linguagens storage frameworks outros
• Solr
• Hadoop
• RabbitMQ
• Varnish
• New Relic
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
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 Caches
• 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 Caches
• Web Proxies (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 Caches
• Web Proxies (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 Caches
• Web Proxies (localização geografica)
• Load Balancers “comoditizados”
• Load Balancers
• Permitir evolução sem quebrar os clientes
• Segurança
Por que escolhemos REST?
• HTTP
• Web Caches
• Web Proxies (localização geografica)
• Load Balancers “comoditizados”
• Load Balancers
• HTML, JSON, XML
• Segurança
Por que escolhemos REST?
• HTTP
• Web Caches
• Web Proxies (localização geografica)
• Load Balancers “comoditizados”
• Load Balancers
• HTML, JSON, XML
• HTTPS / TLS
REST= +LCODC$SS
Porque...
U
o_O
REST= +LCODC$SS
Porque...
U
Layered-Code on Demand-Client-Cache-Stateless-Server
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
• Visibilidade
• Escalabilidade
(recursos alocados)
• Confiabilidade
• Performance de rede
Stateless
Stateless no Alexandria
• HATEOAS implementado nas APIs
• cookies nas operações destrutivas
REST= +LCODC$SS U
REST= +LCODC$SS U
• Eficiência
• Escalabilidade
• Performance
percebida pelo usuário
• Confiabilidade
Cache
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= +ULCODC$SS
REST= +LCODC$SS U
• Encapsula complexidade
• Evolvabilidade
• Simplicidade
• Performance percebida
pelo usuário
Layered System
• 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= +ULCODC$SS
Layered System no Alexandria
REST= +LCODC$SS U
• Extensibilidade
• Simplificação do client
• Visibilidade
Code-on-demand
• 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= +ULCODC$SS
Code-on-demand no Alexandria
REST= +LCODC$SS U
• Simplificação pela generalidade
• Visibilidade
• Desacoplamento
• Evolvabilidade
• Performance percebida
pelo usuário
• Restrita a dados com
granularidade larga
Uniform interface
REST=
niform interface no Alexandria
+LCODC$SS
U
Uresource identification
URIuniversal resource identifier
Uresource identification
/:tipo_recurso/:id
Uresource identification
http://editorial.api.abril.com.br/materia/dicas
http://editorial.api.abril.com.br/materia/ac23657fg
http://bebe.abril.com.br/materia/ac23657fg
Uresources
Uresources
{
"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)
Urepresentations
JSON
Urepresentations
e um tiquinho assim de XML
ou melhor,
de application/opensearchdescription+xml
Urepresentations
<?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>
Uhypermedia
Exercício: criar uma atividade de
um usuário no site.
Você só sabe o entrypoint:
http://socialcore.api.abril.com.br
Uhypermedia
POST http://socialcore.api.abril.com.br/
Accept: application/json
Uhypermedia
POST???
Uhypermedia
HTTP/1.1 405 Method Not Allowed
Allow: GET
Uhypermedia
GET http://socialcore.api.abril.com.br/
Accept: application/json
Uhypermedia
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"
}
]
}
Uhypermedia
GET http://socialcore.api.abril.com.br/atividade
Accept: application/json
Uhypermedia
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"
}
]
}
Uhypermedia
GET http://socialcore.api.abril.com.br/atividade/template
Accept: application/json
Uhypermedia
HTTP/1.1 200 OK
Content-Type: application/json;
charset=utf-8
{
"atividade": {
"app": "",
"created_at": "",
"usuario": "",
"tipo": "",
"objeto": {
"tipo": ""
},
"resultado": {
"tipo": ""
}
},(continua)
Uhypermedia
"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"
}
]
}
Uhypermedia
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"
}
Uhypermedia
HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json; charset=utf-8
{
"tipo_recurso":"erro",
"atividade":{
"usuario":"",
},
"erros":[
{"atributo":"usuario","mensagem":["é obrigatório"]}
]
}
Uhypermedia
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"
Uhypermedia
HTTP/1.1 201 Created
Content-Type: application/json; charset=utf-8
Location: http://socialcore.api.abril.com.br/atividade/0922307
o/
Uapplication 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
• 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

Más contenido relacionado

Similar a Como um grande sistema REST funciona

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...Luis Cipriani
 
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na AbrilComo um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na AbrilLuis Cipriani
 
Como um grande sistema REST funciona - arquitetura e desempenho
Como um grande sistema REST funciona - arquitetura e desempenhoComo um grande sistema REST funciona - arquitetura e desempenho
Como um grande sistema REST funciona - arquitetura e desempenhoDavid Robert Camargo de Campos
 
BigQuery Performance Improvements Storage API
BigQuery Performance Improvements Storage APIBigQuery Performance Improvements Storage API
BigQuery Performance Improvements Storage APIAlvaro Viebrantz
 
Desenvolvendo Sistema Cloud e Web Full-stack Developer
Desenvolvendo Sistema Cloud e Web Full-stack DeveloperDesenvolvendo Sistema Cloud e Web Full-stack Developer
Desenvolvendo Sistema Cloud e Web Full-stack DeveloperCesar Romero
 
[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
 
Palestra ror edted
Palestra ror edtedPalestra ror edted
Palestra ror edtedbrunoaalves
 
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
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkMario Guedes
 
Introdução ao ASP .NET Web API
Introdução ao ASP .NET Web APIIntrodução ao ASP .NET Web API
Introdução ao ASP .NET Web APIVinicius Mussak
 
Implementando APIs seguras na nuvem - Outubro-2018 - Azure Brasil
Implementando APIs seguras na nuvem - Outubro-2018 - Azure BrasilImplementando APIs seguras na nuvem - Outubro-2018 - Azure Brasil
Implementando APIs seguras na nuvem - Outubro-2018 - Azure BrasilRenato Groff
 
Melhores práticas para Arquitetura em Cloud Computing
Melhores práticas para Arquitetura em Cloud ComputingMelhores práticas para Arquitetura em Cloud Computing
Melhores práticas para Arquitetura em Cloud ComputingDaniel Checchia
 
Azure e suas vantagens (Palestra 1)
Azure e suas vantagens (Palestra 1) Azure e suas vantagens (Palestra 1)
Azure e suas vantagens (Palestra 1) Marcus Garcia
 
ASP.NET Core APIs: Performance Tips
ASP.NET Core APIs: Performance TipsASP.NET Core APIs: Performance Tips
ASP.NET Core APIs: Performance TipsAndre Baltieri
 
Construindo aplicações Cloud Native em Go
Construindo aplicações Cloud Native em GoConstruindo aplicações Cloud Native em Go
Construindo aplicações Cloud Native em GoAlvaro Viebrantz
 

Similar a Como um grande sistema REST funciona (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 verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na AbrilComo um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
 
Como um grande sistema REST funciona - arquitetura e desempenho
Como um grande sistema REST funciona - arquitetura e desempenhoComo um grande sistema REST funciona - arquitetura e desempenho
Como um grande sistema REST funciona - arquitetura e desempenho
 
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
 
DevTalk 08/2019
DevTalk 08/2019DevTalk 08/2019
DevTalk 08/2019
 
Api todo list
Api todo listApi todo list
Api todo list
 
BigQuery Performance Improvements Storage API
BigQuery Performance Improvements Storage APIBigQuery Performance Improvements Storage API
BigQuery Performance Improvements Storage API
 
Desenvolvendo Sistema Cloud e Web Full-stack Developer
Desenvolvendo Sistema Cloud e Web Full-stack DeveloperDesenvolvendo Sistema Cloud e Web Full-stack Developer
Desenvolvendo Sistema Cloud e Web Full-stack Developer
 
[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
 
Palestra ror edted
Palestra ror edtedPalestra ror edted
Palestra ror edted
 
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
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST Framework
 
Introdução ao ASP .NET Web API
Introdução ao ASP .NET Web APIIntrodução ao ASP .NET Web API
Introdução ao ASP .NET Web API
 
Implementando APIs seguras na nuvem - Outubro-2018 - Azure Brasil
Implementando APIs seguras na nuvem - Outubro-2018 - Azure BrasilImplementando APIs seguras na nuvem - Outubro-2018 - Azure Brasil
Implementando APIs seguras na nuvem - Outubro-2018 - Azure Brasil
 
Arquitetura API em NodeJS
Arquitetura API em NodeJSArquitetura API em NodeJS
Arquitetura API em NodeJS
 
Melhores práticas para Arquitetura em Cloud Computing
Melhores práticas para Arquitetura em Cloud ComputingMelhores práticas para Arquitetura em Cloud Computing
Melhores práticas para Arquitetura em Cloud Computing
 
Azure e suas vantagens (Palestra 1)
Azure e suas vantagens (Palestra 1) Azure e suas vantagens (Palestra 1)
Azure e suas vantagens (Palestra 1)
 
ASP.NET Core APIs: Performance Tips
ASP.NET Core APIs: Performance TipsASP.NET Core APIs: Performance Tips
ASP.NET Core APIs: Performance Tips
 
Construindo aplicações Cloud Native em Go
Construindo aplicações Cloud Native em GoConstruindo aplicações Cloud Native em Go
Construindo aplicações Cloud Native em Go
 

Más de David Robert Camargo de Campos

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 DesempenhoDavid Robert Camargo de Campos
 
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 desempenhoDavid Robert Camargo de Campos
 
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 KotlinDavid Robert Camargo de Campos
 
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 Elo7David 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 2014David Robert Camargo de Campos
 
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 chefesDavid Robert Camargo de Campos
 

Más 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
 

Como um grande sistema REST funciona