Carlos Brando

Nome do Jogo

Explicando o Rails Metal - Parte 2

No primeiro artigo desta série eu comentei sobre um dos novos recursos incluídos no Rails, chamado de Rails Metal. Agora vamos falar da funcionalidade que leva o nome “Metal”.

Imagine que você precise criar um serviço simples (como uma API pública, por exemplo) que faça uma ou duas consultas no banco de dados e devolva um string para o usuário e que precisa ser muito, muito rápido. É nestas horas que utilizaremos o Rails “Metal”, para realizar tarefas simples que precisam ser realmente rápidas.

Para criar um serviço Rails Metal devemos usar o seguinte comando:

$ ./script/generate metal poller

Com isto teremos um novo diretório chamado app/metal. Nele você encontrará o arquivo poller.rb que deve se parecer com o isto:

# Allow the metal piece to run in isolation
require(File.dirname(__FILE__) + "/../../config/environment") unless defined?(Rails)

class Poller
  def self.call(env)
    if env["PATH_INFO"] =~ /^\/poller/
      [200, {"Content-Type" => "text/html"}, ["Hello, World!"]]
    else
      [404, {"Content-Type" => "text/html"}, ["Not Found"]]
    end
  end
end

Neste modelo tudo o que ele faz é capturar as requisições feitas para /poller e retornar ‘Hello World’. Quando a requisição não for para /poller ele retornará um status 404, que indica ao sistema de rotas do Rails que ele deve assumir à partir daí, cuidando da requisição.

Para ficar mais claro, o código acima se fosse criado em um controller comum do Rails seria algo mais ou menos assim:

class OldPollerController < ApplicationController
  def poller
    render :text => "Hello World!"
  end
end

Jesse Newland fez um teste simples de performance e chegou ao seguinte resultado: Executando estes dois códigos, no modelo tradicional usando um controller comum teríamos 408.45 req/s e 2.448 ms, enquanto na versão Metal temos 1154.66 req/s e 0.866 ms. Ou seja, para um ridículo Hello World o Rails Metal se mostra 2.8x mais rápido que um Controller comum. Muito bom.

Ao subir seu projeto Rails você já terá no ar o seu serviço Rails Metal. Mas se desejar também pode subir o serviço isoladamente através da ferramenta rackup:

rackup -s mongrel app/metal/poller.rb

Usando outras ferramentas

Além do modelo proposto também podemos fazer uso de outras ferramentas afim de simplificar a criação destes serviços. Veja um exemplo retirado da especificação do Rails de um código usando o Sinatra para criar um serviço Rails Metal:

# app/metal/api.rb
require 'sinatra'
Sinatra::Application.default_options.merge!(:run => false, :env => :production)
Api = Sinatra.application unless defined? Api

get '/interesting/new/ideas' do
  'Hello Sinatra!'
end

Finalizando

Como podem ver teremos o melhor de dois mundo na próxima versão do Rails. Mas é importante ressaltar que mesmo sendo possível criar um projeto inteiro usando apenas o Rails Metal, isto não é uma boa coisa a se fazer. O Rails Metal é uma ferramenta com uma finalidade especifica e somente deve ser usada para casos onde a performance é crucial para o sucesso do seu software.

Comments