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:
1 2 3 4 5 6 7 |
class SessionConsumerController < ApplicationController def index session[:some_key] = 'some_value' end end |
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|”:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# >> config to persist rails sessions in memcached memcache_config = YAML.load_file("#{RAILS_ROOT}/config/memcached.yml")[RAILS_ENV] require 'memcache' CACHE = MemCache.new(:namespace => "artigo_memcachded_#{ENV['RAILS_ENV']}") CACHE.servers = memcache_config['servers'] config.action_controller.session_store = :mem_cache_store config.action_controller.session = { :session_key => '_artigo_memcachded_session', :secret => '19d3fc7d49f23bc2a2fe3f755d3b466bbb4e02121d980acb0f6c7b6e32d9697a458b5cf583e26d27c3ad8e4743a48ec9d4d93bd2d7c2fad1e3e32b6f09f2e971', :cache => CACHE, :expires => memcache_config['expires'] } # << config to persist rails sessions in memcached |
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”.