Explicando o Rails Metal – Parte 2

15 de janeiro de 2009  |  Rails 2.3  | 

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.



5 Comentários


  1. Muito bom esse Metal.
    Uma aplicação Rails utilizando Sinatra ou Metal puro para serviços específicos é um ótimo caminho. Qual será a diferença de performance entre eles afinal (Sinatra e só Metal)?

    Caso queira fazer um projeto todo com Rails Metal melhor utilizar somente Sinatra, sem Rails.

  2. Carlos,

    No “Hello World” ele retorna uma string simples.
    Como seria se eu quisesse retornar uma string que venha de uma entidade ActiveRecord?

    Posso colocar um closure no final dessa linha (["Hello, World!"])

    [200, {"Content-Type" => "text/html"}, ["Hello, World!"]]

    ??

    []´s

  3. Juliano, você faz uma chamada a um objeto do AR normalmente e o devolve da mesma forma como fez com o Hello World. Você também pode devolver um xml ou qualquer outra coisa.

  4. cara, bacana..
    mas nao entendi muito bem o conceito de rails metal. A definicao dele e do nome nao ficaram tao bem explicitados na minha opiniao, mas de resto (como o comentario sobre sua funcionalidade) ficou ok.
    valeu

  5. Muito bom o artigo, é bom ver o rails amadurecendo cada dia.

Deixe um comentário