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!

QConSP: Do cache ao cluster, escalando com Rails

Notas do Editor

  • #21 nervosismo, stress, desespero... só coisa ruim... (quebrar esse slide em 3)
  • #22 nervosismo, stress, desespero... só coisa ruim... (quebrar esse slide em 3)
  • #23 nervosismo, stress, desespero... só coisa ruim... (quebrar esse slide em 3)
  • #38 nao importa a ordem das partes, isso varia de cenário pra cenário e problema pra problema
  • #40 colocar imagem de log com N+1 queries
  • #45 falar do mongo, couch
  • #66 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.
  • #87 Falar de MQ (RabbitMQ, Resque)
  • #88 Falar de MQ (RabbitMQ, Resque)
  • #102 tanto o apache qto o nginx sao servidores web que balenceiam a carga