SlideShare uma empresa Scribd logo
1 de 114
Era uma vez o Zé do Rancho e a Mariazinha...
... querendo entrar na era da Internet ...
... precisavam escolher uma tecnologia ...
... precisavam escolher uma tecnologia ...
... precisavam escolher uma tecnologia ...
... precisavam escolher uma tecnologia ...
... precisavam escolher uma tecnologia ...
... e escolheram o Rails ...
E pouco tempo depois de ir para produção ...
... «baleiou» :( ...
... e pra resolver ...
... e pra resolver ...




     REINICIA O
     SERVIDOR!!!
Já vi isso antes?
... consequência ...
Quem nunca passou por isso?
E a consequência?
Nervosismo
Nervosismo   Frustração
Nervosismo   Frustração   Desespero
E a(s) solução(ões)?
Do Cache ao Cluster:
escalando com Rails3
Adriano Almeida

      @adrianoalmeida7

adriano.almeida@caelum.com.br
Escalabilidade
Vertical
Horizontal
Mas por onde começo?
Antes de mais nada:
Investigue os sintomas
Logs
Logs


Memória
Logs


  Memória


Processamento
Logs


  Memória


Processamento


    SQLs
Logs


  Memória


Processamento


    SQLs


  Requests
Vamos por partes
1a. fonte de problemas




    Banco de dados
Sintoma:
N+1 queries
Sintoma:
N+1 queries
Sintoma:
N+1 queries



 Solução:
Sintoma:
Joins excessivos
Sintoma:
Joins excessivos




  Solução 1:
Desnormalização
Sintoma:
    Joins excessivos




       Solução 2:
Usar banco não relacional
Qual é o problema dos relacionais?
E a alternativa?
Escalabilidade no NOSQL
Opções:

 => mongoid, mongomapper
Opções:

 => mongoid, mongomapper

 => couchio, couchrest
Opções:

 => mongoid, mongomapper

 => couchio, couchrest

 => neo4j.rb
Opções:

 => mongoid, mongomapper

 => couchio, couchrest

 => neo4j.rb

  => redis-rb
Sintoma:
Mesma query executando muitas vezes
Sintoma:
Mesma query executando muitas vezes




             Solução:
    Usar cache (e.g. memcached)
O que é o memcached?
{ }
Só configurando no environment
E usar:
Dog pile effect!
Solução:

Reescreva o ActiveSupport::Cache::MemCacheStore



        http://slideshare.net/plataformatec
2a. Fonte de problemas


Muito processamento de requests
Sintoma:
Muitos requests com resultados iguais
Sintoma:
Muitos requests com resultados iguais




             Solução:
        Cache das respostas
Uma parte do segredo está em:

  ActionController::Caching
1º: No seu environment (dev / prod / test)
2º: No seu controller
2º: No seu controller
Mas... e se...

... eu quisesse executar um filtro
  antes dessa página ser exibida?
Action Caching
E onde as páginas cacheadas ficam?
No disco, como HTMLs.
Mas tem como guardar na memória:
          memcached
Só configurando no environment
Outra parte está em:

Agrupar CSS e Javascripts
Ao invés de N Javascripts
1 só Javascript
GETs condicionais:

ActionController::ConditionalGet
ETAG
       +
IF_NONE_MATCH
LAST_MODIFIED
        +
IF_MODIFIED_SINCE
Jabá alheio:




http://akitaonrails.com/2010/05/25/voce-ja-esta-usando-
                       etags-certo
3a. Fonte de Problemas

Tarefas pesadas / longas executando em sequência
Sintoma:
Requests demorados, com tarefas pesadas
Sintoma:
Requests demorados, com tarefas pesadas




               Solução:
              Assíncrono
Delayed Job


http://github.com/tobi/delayed_job
RabbitMQ


http://www.rabbitmq.com/
Resque


http://github.com/defunkt/resque
4a. Fonte de problemas

      O Ruby...

        1.8.x
Como assim?
Green Threads
Soluções:

Ruby 1.9.x, REE, JRuby
Mais informações:
http://programmingzen.com/2010/07/19/the-great-ruby-
                 shootout-july-2010/
5. Fonte de problemas

Você não usa WEBrick em produção.... né?
Mongrel
Unicorn
E quando você já tentou os anteriores...



 Cluster e Balanceamento de Carga
No Apache
No Apache


mod_rails (Passenger)
+
mongrel_cluster
+
thin
... e se você não quer cuidar dessas coisas...
Cloud!




    Eu aprovo!
Obrigado!

Mais conteúdo relacionado

Mais procurados

Resolvendo problemas com o Bbundler
Resolvendo problemas com o BbundlerResolvendo problemas com o Bbundler
Resolvendo problemas com o Bbundler
Rodrigo Alves Vieira
 
Começando com Ruby - III SEICOM
Começando com Ruby - III SEICOMComeçando com Ruby - III SEICOM
Começando com Ruby - III SEICOM
Kenner Kliemann
 

Mais procurados (19)

GDG Conf Node JS sem segredos
GDG Conf Node JS sem segredosGDG Conf Node JS sem segredos
GDG Conf Node JS sem segredos
 
Um Mundo Java Sem XML
Um Mundo Java Sem XMLUm Mundo Java Sem XML
Um Mundo Java Sem XML
 
Introducing Ruby
Introducing RubyIntroducing Ruby
Introducing Ruby
 
Resolvendo problemas de dependências com o Bundler
Resolvendo problemas de dependências com o BundlerResolvendo problemas de dependências com o Bundler
Resolvendo problemas de dependências com o Bundler
 
Resolvendo problemas com o Bbundler
Resolvendo problemas com o BbundlerResolvendo problemas com o Bbundler
Resolvendo problemas com o Bbundler
 
Postgres Big data
Postgres Big dataPostgres Big data
Postgres Big data
 
Vim
VimVim
Vim
 
Ruby on Rails: Embarque nesse Framework Web
Ruby on Rails: Embarque nesse Framework WebRuby on Rails: Embarque nesse Framework Web
Ruby on Rails: Embarque nesse Framework Web
 
Sistemas Distribuídos - Multithreading
Sistemas Distribuídos - MultithreadingSistemas Distribuídos - Multithreading
Sistemas Distribuídos - Multithreading
 
GDG NodeJS Sem Segredos
GDG NodeJS Sem SegredosGDG NodeJS Sem Segredos
GDG NodeJS Sem Segredos
 
Lua em transmissões ao vivo
Lua em transmissões ao vivoLua em transmissões ao vivo
Lua em transmissões ao vivo
 
Threads 03: Ciclo de vida, aplicações e boas práticas
Threads 03: Ciclo de vida, aplicações e boas práticasThreads 03: Ciclo de vida, aplicações e boas práticas
Threads 03: Ciclo de vida, aplicações e boas práticas
 
Threads 01: Criação e controle de threads
Threads 01: Criação e controle de threadsThreads 01: Criação e controle de threads
Threads 01: Criação e controle de threads
 
Threads 02: Acesso exclusivo e comunicação entre threads
Threads 02: Acesso exclusivo e comunicação entre threadsThreads 02: Acesso exclusivo e comunicação entre threads
Threads 02: Acesso exclusivo e comunicação entre threads
 
Princípios de Concorrência em Ruby e Além
Princípios de Concorrência em Ruby e AlémPrincípios de Concorrência em Ruby e Além
Princípios de Concorrência em Ruby e Além
 
Flutter
FlutterFlutter
Flutter
 
Começando com Ruby - III SEICOM
Começando com Ruby - III SEICOMComeçando com Ruby - III SEICOM
Começando com Ruby - III SEICOM
 
Alta Performance com Java
Alta Performance com JavaAlta Performance com Java
Alta Performance com Java
 
Otimizando Portais Plone: Dicas de Desempenho
Otimizando Portais Plone: Dicas de DesempenhoOtimizando Portais Plone: Dicas de Desempenho
Otimizando Portais Plone: Dicas de Desempenho
 

Destaque

Oxente Rails 2010 - Persistindo em Graph databases
Oxente Rails 2010 - Persistindo em Graph databasesOxente Rails 2010 - Persistindo em Graph databases
Oxente Rails 2010 - Persistindo em Graph databases
adrianoalmeida7
 
Animated1
Animated1Animated1
Animated1
bekuo
 
Cartilha02 ca uterocamama-folhas
Cartilha02 ca uterocamama-folhasCartilha02 ca uterocamama-folhas
Cartilha02 ca uterocamama-folhas
aline galdino
 
Altzako autobusa nahi leire
Altzako autobusa nahi leireAltzako autobusa nahi leire
Altzako autobusa nahi leire
pazegui
 
Circular 9. solicitud actividades culturales 1
Circular 9. solicitud actividades culturales 1Circular 9. solicitud actividades culturales 1
Circular 9. solicitud actividades culturales 1
adrianoloras
 
Esto es una prueba
Esto es una pruebaEsto es una prueba
Esto es una prueba
AMETH
 

Destaque (20)

Oxente Rails 2010 - Persistindo em Graph databases
Oxente Rails 2010 - Persistindo em Graph databasesOxente Rails 2010 - Persistindo em Graph databases
Oxente Rails 2010 - Persistindo em Graph databases
 
Conexao java v-raptor
Conexao java v-raptorConexao java v-raptor
Conexao java v-raptor
 
Llavors de tomàquet
Llavors de tomàquetLlavors de tomàquet
Llavors de tomàquet
 
De idealista à empreendedor - como desenvolver aplicações em android que conq...
De idealista à empreendedor - como desenvolver aplicações em android que conq...De idealista à empreendedor - como desenvolver aplicações em android que conq...
De idealista à empreendedor - como desenvolver aplicações em android que conq...
 
TimbaPreneur de la Fira d'Igualada a La Veu de l'Anoia
TimbaPreneur de la Fira d'Igualada a La Veu de l'AnoiaTimbaPreneur de la Fira d'Igualada a La Veu de l'Anoia
TimbaPreneur de la Fira d'Igualada a La Veu de l'Anoia
 
Animated1
Animated1Animated1
Animated1
 
Fyhjuyj
FyhjuyjFyhjuyj
Fyhjuyj
 
Tareas simples
Tareas simplesTareas simples
Tareas simples
 
Cartilha02 ca uterocamama-folhas
Cartilha02 ca uterocamama-folhasCartilha02 ca uterocamama-folhas
Cartilha02 ca uterocamama-folhas
 
Historia
HistoriaHistoria
Historia
 
Altzako autobusa nahi leire
Altzako autobusa nahi leireAltzako autobusa nahi leire
Altzako autobusa nahi leire
 
Quay_4C_U
Quay_4C_UQuay_4C_U
Quay_4C_U
 
Montse coss
Montse cossMontse coss
Montse coss
 
Nombre
NombreNombre
Nombre
 
Voki daniel díaz
Voki daniel díazVoki daniel díaz
Voki daniel díaz
 
Cse
CseCse
Cse
 
Circular 9. solicitud actividades culturales 1
Circular 9. solicitud actividades culturales 1Circular 9. solicitud actividades culturales 1
Circular 9. solicitud actividades culturales 1
 
Esto es una prueba
Esto es una pruebaEsto es una prueba
Esto es una prueba
 
10 revisao producao_grafica
10 revisao producao_grafica10 revisao producao_grafica
10 revisao producao_grafica
 
O universo
O universoO universo
O universo
 

Semelhante a QConSP: Do cache ao cluster, escalando com Rails

Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.jsJava script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Vinicius Reis
 
JavaScript agora é sério (TDC 2011)
JavaScript agora é sério (TDC 2011)JavaScript agora é sério (TDC 2011)
JavaScript agora é sério (TDC 2011)
Luciano Ramalho
 
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
 

Semelhante a QConSP: Do cache ao cluster, escalando com Rails (20)

Javascript por debaixo dos panos
Javascript por debaixo dos panosJavascript por debaixo dos panos
Javascript por debaixo dos panos
 
Criando Aplicações Resilientes
Criando Aplicações ResilientesCriando Aplicações Resilientes
Criando Aplicações Resilientes
 
Esta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com RailsEsta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com Rails
 
Iccyber2012 sandro suffert apura - jacomo picolini teamcymru - desafio fore...
Iccyber2012   sandro suffert apura - jacomo picolini teamcymru - desafio fore...Iccyber2012   sandro suffert apura - jacomo picolini teamcymru - desafio fore...
Iccyber2012 sandro suffert apura - jacomo picolini teamcymru - desafio fore...
 
QCon SP 2015 - Advogados do diabo: como a arquitetura emergente de sua aplica...
QCon SP 2015 - Advogados do diabo: como a arquitetura emergente de sua aplica...QCon SP 2015 - Advogados do diabo: como a arquitetura emergente de sua aplica...
QCon SP 2015 - Advogados do diabo: como a arquitetura emergente de sua aplica...
 
Insustentavel js
Insustentavel jsInsustentavel js
Insustentavel js
 
Inteligencia artificial 2
Inteligencia artificial 2Inteligencia artificial 2
Inteligencia artificial 2
 
Java script
Java scriptJava script
Java script
 
Joomla Day Brasil 2010: Customizações para grandes portais
Joomla Day Brasil 2010: Customizações para grandes portaisJoomla Day Brasil 2010: Customizações para grandes portais
Joomla Day Brasil 2010: Customizações para grandes portais
 
Seminário Drupal São Paulo
Seminário Drupal São PauloSeminário Drupal São Paulo
Seminário Drupal São Paulo
 
DNAD 2015 - Como a arquitetura emergente de sua aplicação pode jogar contra ...
DNAD 2015  - Como a arquitetura emergente de sua aplicação pode jogar contra ...DNAD 2015  - Como a arquitetura emergente de sua aplicação pode jogar contra ...
DNAD 2015 - Como a arquitetura emergente de sua aplicação pode jogar contra ...
 
JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...
JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...
JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...
 
NetBeans: a IDE que você precisa
NetBeans: a IDE que você precisaNetBeans: a IDE que você precisa
NetBeans: a IDE que você precisa
 
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.jsJava script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
 
Desenvolvimento de Aplicações
Desenvolvimento de AplicaçõesDesenvolvimento de Aplicações
Desenvolvimento de Aplicações
 
JavaScript agora é sério (TDC 2011)
JavaScript agora é sério (TDC 2011)JavaScript agora é sério (TDC 2011)
JavaScript agora é sério (TDC 2011)
 
Performance em Java
Performance em JavaPerformance em Java
Performance em Java
 
Plataforma Zope Plone na PGR
Plataforma Zope Plone na PGRPlataforma Zope Plone na PGR
Plataforma Zope Plone na PGR
 
Interop itcare: Interoperabilidade Java e .NET
Interop itcare: Interoperabilidade Java e .NETInterop itcare: Interoperabilidade Java e .NET
Interop itcare: Interoperabilidade Java e .NET
 
Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.
 

QConSP: Do cache ao cluster, escalando com Rails

Notas do Editor

  1. nervosismo, stress, desespero... só coisa ruim... (quebrar esse slide em 3)
  2. nervosismo, stress, desespero... só coisa ruim... (quebrar esse slide em 3)
  3. nervosismo, stress, desespero... só coisa ruim... (quebrar esse slide em 3)
  4. nao importa a ordem das partes, isso varia de cenário pra cenário e problema pra problema
  5. colocar imagem de log com N+1 queries
  6. falar do mongo, couch
  7. Com o aumento do usa da sua aplicação, consequentemente vai ter mais requests sendo disparados pra ela. Esses requests devem ser tratados e em muitos casos eles vao precisar realizar pesquisas no banco de dados. A questão é que na maioria das vezes os dados buscados e retornados são os mesmos.
  8. Falar de MQ (RabbitMQ, Resque)
  9. Falar de MQ (RabbitMQ, Resque)
  10. tanto o apache qto o nginx sao servidores web que balenceiam a carga