SlideShare uma empresa Scribd logo
1 de 49
Atendendo Milhares de Requisições
com o Play Framework 2
Paulo “JCranky” Siqueira
jcranky.com / @jcranky
youtube.com/jcrankydev
Agenda
●
A aplicação e os cenários
●
Os testes
– números e alguns porquês
●
Conceitos e decisões importantes
A aplicação: Lojinha
Onde está a Lojinha?
●
Em produção:
http://lojinha.jcranky.com/
●
Código-fonte (open-source):
https://github.com/jcranky/lojinha/
Tecnologias
Cenário 1
●
150 usuários
●
Acesso ao Feed xml dos items
●
Executado 40 vezes
– 6000 requisições no total
Cenário 2
●
120 usuários
●
Acessando a página inicial
●
Executado 400 vezes
– 48000 requisições no total
Cenário 3
●
60 usuários
●
Acessando a página de um Item
●
Executado 400 vezes
– 24000 requisições no total
Cenário 4
●
15 usuários
●
Fazendo um lance em um Item
●
Executado 400 vezes
– 6000 requisições no total
Resumo
●
84000 requisições variadas
●
Diversos GETs
●
Um POST (oferta em um item)
Ferramental para os Testes
●
Apache JMeter
●
Amazon EC2
<3 <3 <3 <3
Plano de Testes
Arquivo .jmx
disponível no
github da Lojinha
Teste #1
●
Play e JMeter na máquina local
●
Banco de dados H2 (em memória)
●
Apenas dois produtos cadastrados
Teste #1
●
Longe do cenário real / ideal...
●
...mas ajuda a estabilizar o sistema
– Bugs foram encontrados nessa fase
Teste #1
●
Resultado:
+/- 180 Requisições
por segundo
ou 10 mil por minuto
Teste #1 - análise
●
BD em memória e embutido no Play
elimina muito overhead
●
Pode esconder problemas no acesso
aos dados
Teste #2
●
Igual ao anterior...
●
...mas agora usando o cache do Play:
– Página inicial
– Página dos items
Teste #2 – código original
def index = Action {
// corpo simplificado
Ok(html.index())
}
Teste #2 – código com cache
// index cacheado por 5 segundos
def index = Cached("index", 5){
Action {
// corpo simplificado
Ok(html.index())
}
}
Teste #2
●
Resultado:
+/- 800 Requisições
por segundo
ou 48 mil por minuto
Teste #2 – análise
●
A grande maioria dos acessos foi lida
do cache
●
Acessos sem cache também melhoram
– o hardware não está sobrecarregado
Teste #3
●
Agora é para valer!
●
Três servidores:
– JMeter
– PostgreSQL
– Play Framework 2.0
Teste #3
Teste #3
●
Instâncias AWS:
– JMeter: micro
– Play: medium
– PostgreSQL: medium-highcpu
Teste #3
●
Sem cache
●
Dados reais
– Clonados da Lojinha em produção
– 82 produtos
Teste #3
●
Resultado:
+/- 5 Requisições por segundo
ou 300 por minuto
Teste #3 - análise
●
CPU do PostgreSQL “no talo”
●
CPU do Play entre 50 ~ 60 %
●
Tunning no pool de conexões ajudou
um pouco
Teste #4
●
Mesmos três servidores
●
Agora com cache
●
BD “resetado”
Teste #4
●
Resultado:
~294 Requisições por segundo
ou mais de 17 mil por minuto
Teste #4 - análise
●
CPU do PostgreSQL ainda “no talo”
●
CPU do Play acima de 90%
●
Menos acesso ao BD, mais tempo
respondendo requisições
Em tempo
●
Não analisei uso de memória ou CPU
●
Apenas observei, sem coletar dados
●
Uso de memória pareceu muito baixo
Outras implantações
●
PostgreSQL e Play na mesmo instância
ficou inaceitável
●
Instância micro para o Play e
PostgreSQL também não
Princípios seguidos
●
Desenvolvimento da Lojinha sempre foi
despreocupado com performance
●
Mas seguindo princípios importantes
– Alguns “empurrados” pelos frameworks
Princípios seguidos
●
Uso de cache
●
Obviamente, indispensável para
atender muitas requisições
– Feed, Página de Item, Página Inicial
Princípios seguidos
●
Imagens no Amazon S3
●
Download de imagens tem impacto zero
na Lojinha
Princípios seguidos
●
Imutabilidade
● Result é imutável
– Portanto, seguro de cachear
Princípios seguidos
●
Assincronia
– Processamento dos lances
– Envio de e-mails (lances recebidos)
– Akka #ftw
Processamento dos lances
●
Controller bloqueia
●
Processamento interno não
– Ofertas em items diferentes são
processados em paralelo
Processamento dos lances
●
Possível melhoria:
– Não bloquear o Controller
– Async do Play
– Testarei no futuro para verificar se há
melhorias de performance
Exemplo: envio de e-mail
EMail.actor ! BidReceivedMessage(
bidProcessor.item.name, itemUrl, email)
Princípios seguidos
●
Sem sessão no lado do servidor
●
Característica do Play
●
Evita consumo excessivo de memória
●
Facilita clustering
Demo
rodando os testes localmente
Melhorias
●
Página inicial maior do que necessário
●
Possível solução: barra de rolagem
infinita
O que vêm por aí!
●
Pequena série de videos, mostrando os
testes passo a passo
●
Assinem o canal para acompanhar:
youtube.com/jcrankydev
Perguntas?
Obrigado!
Paulo “JCranky” Siqueira
@jcranky / jcranky.com
youtube.com/jcrankydev

Mais conteúdo relacionado

Mais procurados

Testes Funcionais e Estruturais utilizando Selenium IDE e Cobertura
Testes Funcionais e Estruturais utilizando Selenium IDE e CoberturaTestes Funcionais e Estruturais utilizando Selenium IDE e Cobertura
Testes Funcionais e Estruturais utilizando Selenium IDE e CoberturaTiago Antônio da Silva
 
Uma implementação de suporte a
Uma implementação de suporte a Uma implementação de suporte a
Uma implementação de suporte a Rômulo Jales
 
TDC2016SP - Trilha Banco de Dados
TDC2016SP - Trilha Banco de DadosTDC2016SP - Trilha Banco de Dados
TDC2016SP - Trilha Banco de Dadostdc-globalcode
 
Alta Performance com Java
Alta Performance com JavaAlta Performance com Java
Alta Performance com JavaAlisson Pedrina
 
Como migrar seu ambiente de desenvolvimento para Linux
Como migrar seu ambiente de desenvolvimento para LinuxComo migrar seu ambiente de desenvolvimento para Linux
Como migrar seu ambiente de desenvolvimento para LinuxMarcelo Sabadini
 
A Arte do Deployment - WebDevCamp
A Arte do Deployment - WebDevCampA Arte do Deployment - WebDevCamp
A Arte do Deployment - WebDevCampGeorge Guimarães
 
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCC
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCCTDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCC
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCCStefan Teixeira
 
Alto desempenho com banco de dados MySQL
Alto desempenho com banco de dados MySQLAlto desempenho com banco de dados MySQL
Alto desempenho com banco de dados MySQLJonas Silveira
 
1º Meetup Zabbix Meetup do Recife: Matheus Cabral - Monitoramento de Data Cen...
1º Meetup Zabbix Meetup do Recife: Matheus Cabral - Monitoramento de Data Cen...1º Meetup Zabbix Meetup do Recife: Matheus Cabral - Monitoramento de Data Cen...
1º Meetup Zabbix Meetup do Recife: Matheus Cabral - Monitoramento de Data Cen...Zabbix BR
 
Gerenciamento de Backups PostgreSQL com pgbarman
Gerenciamento de Backups PostgreSQL com pgbarmanGerenciamento de Backups PostgreSQL com pgbarman
Gerenciamento de Backups PostgreSQL com pgbarmanJuliano Atanazio
 
Criando um Website Cacheavel
Criando um Website CacheavelCriando um Website Cacheavel
Criando um Website CacheavelLucas Brasilino
 
Boas práticas e sobrevivência com vcr no rspec
Boas práticas e sobrevivência com vcr no rspecBoas práticas e sobrevivência com vcr no rspec
Boas práticas e sobrevivência com vcr no rspecfabio perrella
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valorKinn Julião
 

Mais procurados (20)

Testes Funcionais e Estruturais utilizando Selenium IDE e Cobertura
Testes Funcionais e Estruturais utilizando Selenium IDE e CoberturaTestes Funcionais e Estruturais utilizando Selenium IDE e Cobertura
Testes Funcionais e Estruturais utilizando Selenium IDE e Cobertura
 
Alta Concorrência com Postgres
Alta Concorrência com PostgresAlta Concorrência com Postgres
Alta Concorrência com Postgres
 
Uma implementação de suporte a
Uma implementação de suporte a Uma implementação de suporte a
Uma implementação de suporte a
 
TDC2016SP - Trilha Banco de Dados
TDC2016SP - Trilha Banco de DadosTDC2016SP - Trilha Banco de Dados
TDC2016SP - Trilha Banco de Dados
 
Alta Performance com Java
Alta Performance com JavaAlta Performance com Java
Alta Performance com Java
 
Como migrar seu ambiente de desenvolvimento para Linux
Como migrar seu ambiente de desenvolvimento para LinuxComo migrar seu ambiente de desenvolvimento para Linux
Como migrar seu ambiente de desenvolvimento para Linux
 
A Arte do Deployment - WebDevCamp
A Arte do Deployment - WebDevCampA Arte do Deployment - WebDevCamp
A Arte do Deployment - WebDevCamp
 
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCC
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCCTDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCC
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCC
 
Alto desempenho com banco de dados MySQL
Alto desempenho com banco de dados MySQLAlto desempenho com banco de dados MySQL
Alto desempenho com banco de dados MySQL
 
Pragmatismo e Simplicidade
Pragmatismo e SimplicidadePragmatismo e Simplicidade
Pragmatismo e Simplicidade
 
1º Meetup Zabbix Meetup do Recife: Matheus Cabral - Monitoramento de Data Cen...
1º Meetup Zabbix Meetup do Recife: Matheus Cabral - Monitoramento de Data Cen...1º Meetup Zabbix Meetup do Recife: Matheus Cabral - Monitoramento de Data Cen...
1º Meetup Zabbix Meetup do Recife: Matheus Cabral - Monitoramento de Data Cen...
 
Drupal + Rex
Drupal + RexDrupal + Rex
Drupal + Rex
 
Gerenciamento de Backups PostgreSQL com pgbarman
Gerenciamento de Backups PostgreSQL com pgbarmanGerenciamento de Backups PostgreSQL com pgbarman
Gerenciamento de Backups PostgreSQL com pgbarman
 
Criando um Website Cacheavel
Criando um Website CacheavelCriando um Website Cacheavel
Criando um Website Cacheavel
 
Arquivos No Banco
Arquivos No BancoArquivos No Banco
Arquivos No Banco
 
Replicação PostgreSQL com RepManager
Replicação PostgreSQL com RepManagerReplicação PostgreSQL com RepManager
Replicação PostgreSQL com RepManager
 
Sapo Sessions PHP
Sapo Sessions PHPSapo Sessions PHP
Sapo Sessions PHP
 
Boas práticas e sobrevivência com vcr no rspec
Boas práticas e sobrevivência com vcr no rspecBoas práticas e sobrevivência com vcr no rspec
Boas práticas e sobrevivência com vcr no rspec
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valor
 
Trabalhando com Logs no PostgreSQL
Trabalhando com Logs no PostgreSQLTrabalhando com Logs no PostgreSQL
Trabalhando com Logs no PostgreSQL
 

Semelhante a Atendendo Milhares de Requisições com o Play Framework 2 - v2

Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...Edlaine Zamora
 
HTTP: A Base do Desenvolvimento Web - FISL 12
HTTP: A Base do Desenvolvimento Web - FISL 12HTTP: A Base do Desenvolvimento Web - FISL 12
HTTP: A Base do Desenvolvimento Web - FISL 12Alexandre Gaigalas
 
PostgreSql - Um banco de dados Open Source que figura entre os grandes
PostgreSql - Um banco de dados Open Source que figura entre os grandesPostgreSql - Um banco de dados Open Source que figura entre os grandes
PostgreSql - Um banco de dados Open Source que figura entre os grandesjoanio trade
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...tdc-globalcode
 
TDC2016SP - O bê-a-bá da fila de processamento para você deixar o ThreadPool ...
TDC2016SP - O bê-a-bá da fila de processamento para você deixar o ThreadPool ...TDC2016SP - O bê-a-bá da fila de processamento para você deixar o ThreadPool ...
TDC2016SP - O bê-a-bá da fila de processamento para você deixar o ThreadPool ...tdc-globalcode
 
Desenvolvimento web com python e django
Desenvolvimento web com python e djangoDesenvolvimento web com python e django
Desenvolvimento web com python e djangoIgor Sobreira
 
Relatórios e estatísticas utilizando logs em tempo real
Relatórios e estatísticas utilizando logs em tempo realRelatórios e estatísticas utilizando logs em tempo real
Relatórios e estatísticas utilizando logs em tempo realFrancisco Freire
 
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)Fabiano Weimar
 
Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.Thiago Rondon
 
Apresentação GT - Digital Preservation
Apresentação GT - Digital PreservationApresentação GT - Digital Preservation
Apresentação GT - Digital PreservationRoberto Beraldo Chaiben
 
Como criar infraestrutura de sites para receber milhões de usuários?
Como criar infraestrutura de sites para receber milhões de usuários?Como criar infraestrutura de sites para receber milhões de usuários?
Como criar infraestrutura de sites para receber milhões de usuários?Marcelo Dieder
 
Voce se preocupa com performance ou é sempre problema da infra
Voce se preocupa com performance ou é sempre problema da infraVoce se preocupa com performance ou é sempre problema da infra
Voce se preocupa com performance ou é sempre problema da infraCDS
 
TDC2016SP - Trilha Banco de Dados
TDC2016SP - Trilha Banco de DadosTDC2016SP - Trilha Banco de Dados
TDC2016SP - Trilha Banco de Dadostdc-globalcode
 
InfluxDb: como monitorar milhares de dados por segundo em real time
InfluxDb: como monitorar milhares de dados por segundo em real time InfluxDb: como monitorar milhares de dados por segundo em real time
InfluxDb: como monitorar milhares de dados por segundo em real time Umbler
 
Tdc2016 trilha-banco-influx.ppt
Tdc2016 trilha-banco-influx.pptTdc2016 trilha-banco-influx.ppt
Tdc2016 trilha-banco-influx.pptMarcos Artigas
 
Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHPFelipe Ribeiro
 

Semelhante a Atendendo Milhares de Requisições com o Play Framework 2 - v2 (20)

Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
Teste de performance com JMeter: como criar e executar os testes em aplicaçõe...
 
HTTP: A Base do Desenvolvimento Web - FISL 12
HTTP: A Base do Desenvolvimento Web - FISL 12HTTP: A Base do Desenvolvimento Web - FISL 12
HTTP: A Base do Desenvolvimento Web - FISL 12
 
PostgreSql - Um banco de dados Open Source que figura entre os grandes
PostgreSql - Um banco de dados Open Source que figura entre os grandesPostgreSql - Um banco de dados Open Source que figura entre os grandes
PostgreSql - Um banco de dados Open Source que figura entre os grandes
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
 
TDC2016SP - O bê-a-bá da fila de processamento para você deixar o ThreadPool ...
TDC2016SP - O bê-a-bá da fila de processamento para você deixar o ThreadPool ...TDC2016SP - O bê-a-bá da fila de processamento para você deixar o ThreadPool ...
TDC2016SP - O bê-a-bá da fila de processamento para você deixar o ThreadPool ...
 
Metralhando sua API
 Metralhando sua API Metralhando sua API
Metralhando sua API
 
Desenvolvimento web com python e django
Desenvolvimento web com python e djangoDesenvolvimento web com python e django
Desenvolvimento web com python e django
 
Relatórios e estatísticas utilizando logs em tempo real
Relatórios e estatísticas utilizando logs em tempo realRelatórios e estatísticas utilizando logs em tempo real
Relatórios e estatísticas utilizando logs em tempo real
 
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)
 
Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.
 
Apresentação GT - Digital Preservation
Apresentação GT - Digital PreservationApresentação GT - Digital Preservation
Apresentação GT - Digital Preservation
 
Curso HTML 5 - Aula Inicial
Curso HTML 5 - Aula InicialCurso HTML 5 - Aula Inicial
Curso HTML 5 - Aula Inicial
 
Gfs slides
Gfs slidesGfs slides
Gfs slides
 
Como criar infraestrutura de sites para receber milhões de usuários?
Como criar infraestrutura de sites para receber milhões de usuários?Como criar infraestrutura de sites para receber milhões de usuários?
Como criar infraestrutura de sites para receber milhões de usuários?
 
Voce se preocupa com performance ou é sempre problema da infra
Voce se preocupa com performance ou é sempre problema da infraVoce se preocupa com performance ou é sempre problema da infra
Voce se preocupa com performance ou é sempre problema da infra
 
TDC2016SP - Trilha Banco de Dados
TDC2016SP - Trilha Banco de DadosTDC2016SP - Trilha Banco de Dados
TDC2016SP - Trilha Banco de Dados
 
InfluxDb: como monitorar milhares de dados por segundo em real time
InfluxDb: como monitorar milhares de dados por segundo em real time InfluxDb: como monitorar milhares de dados por segundo em real time
InfluxDb: como monitorar milhares de dados por segundo em real time
 
Tdc2016 trilha-banco-influx.ppt
Tdc2016 trilha-banco-influx.pptTdc2016 trilha-banco-influx.ppt
Tdc2016 trilha-banco-influx.ppt
 
Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHP
 
Processos e threads cap 02 (i unidade)
Processos e threads   cap 02 (i unidade)Processos e threads   cap 02 (i unidade)
Processos e threads cap 02 (i unidade)
 

Mais de Paulo Siqueira

Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de c...
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de c...Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de c...
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de c...Paulo Siqueira
 
Desvendando o sistema de tipos do scala
Desvendando o sistema de tipos do scalaDesvendando o sistema de tipos do scala
Desvendando o sistema de tipos do scalaPaulo Siqueira
 
Minecraft and Scala: Creating a DSL to enable kids to create Minecraft Mods
Minecraft and Scala: Creating a DSL to enable kids to create Minecraft ModsMinecraft and Scala: Creating a DSL to enable kids to create Minecraft Mods
Minecraft and Scala: Creating a DSL to enable kids to create Minecraft ModsPaulo Siqueira
 
Minecraft Modding e Scala
Minecraft Modding e ScalaMinecraft Modding e Scala
Minecraft Modding e ScalaPaulo Siqueira
 
Minecraft Modding: Um Jogo que vira Muitos!
 Minecraft Modding: Um Jogo que vira Muitos! Minecraft Modding: Um Jogo que vira Muitos!
Minecraft Modding: Um Jogo que vira Muitos!Paulo Siqueira
 
Entendendo o Modelo de Atores
Entendendo o Modelo de AtoresEntendendo o Modelo de Atores
Entendendo o Modelo de AtoresPaulo Siqueira
 
Akka no Just Java 2012
Akka no Just Java 2012Akka no Just Java 2012
Akka no Just Java 2012Paulo Siqueira
 

Mais de Paulo Siqueira (7)

Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de c...
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de c...Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de c...
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de c...
 
Desvendando o sistema de tipos do scala
Desvendando o sistema de tipos do scalaDesvendando o sistema de tipos do scala
Desvendando o sistema de tipos do scala
 
Minecraft and Scala: Creating a DSL to enable kids to create Minecraft Mods
Minecraft and Scala: Creating a DSL to enable kids to create Minecraft ModsMinecraft and Scala: Creating a DSL to enable kids to create Minecraft Mods
Minecraft and Scala: Creating a DSL to enable kids to create Minecraft Mods
 
Minecraft Modding e Scala
Minecraft Modding e ScalaMinecraft Modding e Scala
Minecraft Modding e Scala
 
Minecraft Modding: Um Jogo que vira Muitos!
 Minecraft Modding: Um Jogo que vira Muitos! Minecraft Modding: Um Jogo que vira Muitos!
Minecraft Modding: Um Jogo que vira Muitos!
 
Entendendo o Modelo de Atores
Entendendo o Modelo de AtoresEntendendo o Modelo de Atores
Entendendo o Modelo de Atores
 
Akka no Just Java 2012
Akka no Just Java 2012Akka no Just Java 2012
Akka no Just Java 2012
 

Atendendo Milhares de Requisições com o Play Framework 2 - v2