Rails + Memcached

Persistindo sessões do Rails (2.3.2) com Memcached

Inicialmente, acho que vale destacar alguns motivos pelo qual a persistência de sessões do Rails, no lado servidor, pode ser bastante importante. Alguns dos motivos são:– Não trafegar dados de sessão em cookies;
– Aumento da capacidade de armazenamento de dados na sessão (cookies são limitados a 4K).

Uma vez que exista a necessidade de persistirmos as sessões, podemos destacar inúmeras opções para realização deste trabalho, como: Memcached, Redis, bancos de dados relacionais (MySQL, Oracle…), Bancos de dados não-relacionais (MongoDB…) etc.

No post de hoje vamos falar um pouco sobre o Memcached e sua aplicabilidade no armazenamento de sessões do Rails.

O que é Memcached?

Como descrito em seu próprio site, o Memcached é um mecanismo de armazenamento de chave-valor em memória capaz de tratar tanto Strings como objetos.

Vantagens da persistência da sessões utilizando Memcached

– Por ser um armazenamento em memória, reduz consideravelmente o consumo de I/O;
– Pode ser utilizado facilmente em modo distribuído;
– É mais rápido do que persistências em Bancos de dados relacionais;
– É menos robusto do que o Redis, porém, para esta necessidade de uso, sua simplicidade é uma vantagem;

Hands on!

Para demonstrarmos uma forma de configuração do Memcached para o gerenciamento das sessões do Rails, utilizaremos como base as seguintes gems:

actionmailer (2.3.2)
actionpack (2.3.2)
activerecord (2.3.2)
activeresource (2.3.2)
activesupport (2.3.2)
bundler (1.0.21)
memcache-client (1.8.5)
mysql (2.8.1)
rack (1.1.3)
rails (2.3.2)
rake (0.9.2.2)
rubygems-update (1.4.2)

Para iniciarmos, vamos criar uma aplicação Rails 2.3.2 chamada “artigo_memcached”:

rails artigo_memcached -d mysql

O segundo passo é criar um controller chamado “session_consumer” contendo uma action “index”:

script/generate controller session_consumer index

Uma vez que o controller seja criado, vamos editar a action “index” para adicionarmos um trecho que código que faça uso de uma sessão do Rais:

Até aqui, temos uma aplicação Rails comum, com persistência de sessão em Cookies (padrão do framework).

Vamos agora adicionar a configuração para persistência das sessões em Memcached.

Edite o arquivo “environment.rb” e adicione o seguinte trecho de código dentro do bloco “Rails::Initializer.run do |config|”:

Podemos observar que o trecho de código acima faz a leitura de um arquivo YML onde definiremos as configurações do Memcached por ambiente.

O último passo da configuração é criar um arquivo chamado “memcached.yml” dentro do diretório “config” da aplicação com o seguinte conteúdo:

# base config
base_cache: &base_cache
expires: 86400 #session expired after 24 hours
servers:
– ‘127.0.0.1:11211’

# test environments
test:
<

# dev
development:
<

# stage
stage:
< servers:
– ‘172.16.150.1:11211’
– ‘172.16.150.2:11211’

# production
production:
< servers:
– ‘172.16.160.1:11211’
– ‘172.16.160.2:11211’
– ‘172.16.160.3:11211’
– ‘172.16.160.4:11211’

Este arquivo de configuração é apenas um exemplo, coloquei mais ambientes para demonstrar como poderia ser feita a configuração quando utilizamos um ou mais servidores.

Para testar o funcionamento da persistência das sessões da aplicação no Memcached basta iniciar o WEBrick, utilizando o comando script/server, e acessar a url “http://localhost:3000/session_consumer”. Se tuder der certo, será exibido no navegador a mensagem “SessionConsumer#index”.

Vale destacar que para a aplicação funcionar, obviamente o memcached deverá estar rodando localmente na sua porta padrão (AKA: 11211). Caso queira ver as ações sendo executadas no memcached, inicie ele no modo “very verbose” utilizando o comando “memcached -vv”.