Starling: Trabalhando com Filas em Ruby

Quem nunca ouviu a grande falácia de que Rails não escala? Isso foi moda durante algumas semanas enquanto o Twitter passava por problemas de escalabilidade, não necessariamente por culpa do Rails ou de Ruby, mas quem quer por lenha na fogueira não está muito preocupado com isso e quer mesmo é semear a discórdia. Muita água já passou por baixo da ponte, o Twitter agora está estável e as coisasfluem bem.

No começo deste ano o pessoal do Twitter anunciou e tornou open source o projeto Starling, criado por Blaine Cook. O Starling é o core do Twitter, ele é o servidor de filas responsável por manter em pé o Twitter. E agora como um projeto open source está disponível como gem e pode ser usado por qualquer outro projeto.

Indo direto ao ponto, o Starling é, basicamente, um servidor de filas implementado sob o protocolo do MemCache. O MemCache é um servidor de cache distribuído de altíssima performance e é largamente usado, principalmente em clusters de aplicações web.

Para usar o Starling é muito simples. Os primeiros passos são

Instalação

1) Instalar o servidor MemCache

[code]jeveaux@kamael ~ $ sudo apt-get -y install memcached[/code]

2) Instalar a gem do MemCache e

[code]jeveaux@kamael ~ $ sudo gem install memcache-client[/code]

3) Instalar a gem do Starling.

[code]jeveaux@kamael ~ $ sudo gem install starling[/code]

E pronto, isso é tudo para começarmos a usar o Starling. Se você achou a instalação simples se prepare, pois a utilização é ainda mais simples.

Usando o Starling

Se você já usou o MemCache vai sentir-se familiarizado com o Starling. A diferença é apenas na implementação do protocolo, ou seja, a utilização em código será igual a do MemCache, só que ao fazer set e get as coisas acontecerão de uma forma um pouco diferente. Por enquanto a diferença maior que percebi foi em relação do método get, que quando usado no MemCache apenas retorna um valor do cache e o mantém lá, já no caso do Starling o get retorna o valor e o remove da memória. Analisando com calma isso faz sentido, afinal não estamos mais falando de cache e sim de filas, mesmo que a implementação da fila seja feita usando cache.

Mas antes de irmos para os exemplos de código, precisamos fazer com o que o servidor de filas – duh, Starling – esteja disponível e rodando. Vamos iniciar o Starling na porta 22122 (-p) e como um daemon (-d):

[code]jeveaux@kamael ~ $ sudo starling -p 22122 -d[/code]

Isso já basta para iniciar o servidor do Starling e deixá-lo disponível para uso. Agora então vamos alimentar a fila, crie o arquivo: alimentar_fila.rb.

[code]#alimentar_fila.rb
require ‘rubygems’
require ‘memcache’
starling = MemCache.new ‘localhost:22122’
starling.set ‘fila’, ‘qualquer objeto'[/code]

Ao executar este arquivo (ruby alimenta_fila.rb) não teremos nenhum resultado visual, mas acredite, a fila chamada de‘fila’ no exemplo está recebendo objetos. Agora o trabalho será para – como dizem – consumir a fila. Vamos ao consumir_fila.rb.

[code]#consumir_fila.rb
require 'rubygems'
require 'memcache'
starling = MemCache.new 'localhost:22122'
loop {
  objeto_fila = starling.get 'fila'
  if !objeto_fila.nil?
    puts 'recuperado da fila:' + objeto_fila
  end
}[/code]

E agora sim estamos prontos para colocar e remover objetos em uma fila. O exemplo para consumir os objetos ficará em loop, então você pode executá-lo numa janela do bash e em outra janela ir executando o exemplo para alimentar a fila com objetos e acompanhar o comportamento dos procedimentos de alimentar e consumir a fila. A recuperação da fila será imediata, instantânea, afinal, assim como o MemCache, o Starling está preparado para receber milhares de operações por segundo.

E é isso, o seu servidor de filas já está rodando e sendo alimentado/consumido. Agora é aplicar para o que você está precisando :D

Problemas

Há um probleminha chato com a gravação de log em disco que o Starling faz das filas. Todo o set feito gera o objeto na memória e também em disco – geralmente em /var/spool/starling/. O problema é que o get somente remove o objeto da memória e não do disco. Aparentemente isso foi feito pra ser assim mesmo e segundo o próprio Blaine Cook este arquivo de log não ficará sendo incrementado para sempre, pois, depois de um certo tamanho (o engraçado é que ele não fala esse certo tamanho) ele será rotacionado, mas por enquanto ainda não descobri este certo tamanho e o arquivo tem crescido infinitamente.

E apenas uma observação quanto ao consumir_fila.rb: Não deixe-o executando por muito tempo e nem muito menos esqueça de finalizá-lo pois como ele fica em loop infinito poderá ocupar o seu processador a toa.

Customizando o gedit para Rails

Não há dúvidas que o TextMate é um excelente editor para se trabalhar com Rails, mas como nem todos possuem um Mac para ter o prazer de utilizar este editor, o jeito é se contentar com alternativas menos hype sexy.

Para quem usa Gnome, porém, é muito mais fácil encontrar uma ótima alternativa. O gedit é um editor de texto que vem, geralmente, por default em qualquer distribuição Linux com Gnome. Não vou falar muito do gedit como editor pois este não é o foco do post, a idéia é mostrar apenas o projeto gedit-rails, que é o projeto que contém uma série de utilitários para deixar o gedit ‘turbinado’ para se trabalhar com Rails.

Para instalar o gedit-rails é super simples, basta fazer o download do projeto (zip, tar.gz ou via clone do repositório do github) e fazer a instalação executando o script install.sh. A instalação é simples e não há nenhum estágio além da execução da execução propriamente dita do script e depois disso o trabalho será apenas de configuração.

A instalação adicionará no gedit o tema de fontes e cores: Darkmate, os plugins: Class Browser, HTML Tidy, Rails Hot Keys, Rails Hot Commands e Snap Open e o mais importante, os snippets. A configuração pode ser feita basicamente em duas etapas:

Tema de fontes e cores: Edit > Preferences > Fonts & Colors> Darkmate. E o resultado será:

– Plugins: Edit > Preferences > Plugins. Lembre-se, os plugins que foram instalados e que podem ser ativados são: Class Browser, HTML Tidy, Rails Hot Keys, Rails Hot Commands e Snap Open. Os snippets já estarão funcionando sem nenhuma modificação. Basicamente alguns dos recursos adicionados serão:

Recomendo também a leitura dos posts sobre gedit-rails do Urubatan, um dos autores do projeto.

Para quem curte o VI também existe uma ótima opção, o vim-rails. Qualquer dia escrevo sobre este addon.

Mais (ainda) do mesmo

Já fazem alguns dias que foi lançada a versão do 6.1 do NetBeans, mas como andei sem tempo demorei um pouquinho pra atualizar meu (novo) ambiente de trabalho, como já comentei aqui e aqui, estou utilizando o NetBeans num dos projetos que participo.

Como ia baixar a nova versão, acabei optando pela versão full já interessado no suporte ao Ruby, coisa que ainda não testei no NetBeans pois o Aptana sempre foi legal pra mim, afinal é um Eclipse, certo? ;-) Ainda não tive tempo para testar o NetBeans com Ruby, mas farei isso ainda essa semana.

Logo de cara ao abrir os projetos no novo NetBeans o project.properties foi alterado e todos os endereços que antes eu havia mudado para caminhos relativos voltaram a ser caminhos absolutos, precisei acertar isso novamente. Todos os arquivos do projeto localizados no diretório nbproject foram alterados, não sei exatamente o motivo e nem se isso vai atrapalhar quando alguém com outra versão do NetBeans for utilizar o projeto, sinceramente fiquei um pouco preocupado.

Um novo problema que não acontecia passou a acontecer. Uma referência a um projeto com EJBs, apesar de não estar com a opção ‘Package‘ do NetBeans marcada, ou seja, o projeto referenciado não deveria ser empacotado junto com o WAR da Web Application. Mas isso não estava funcionando mais, precisei editar mais um arquivo manualmente, o build-impl.xml e retirar a tag copy-ear-war da referência problemática.

Fora os problemas, eu gostei que agora ao fazer o diff entre dois arquivos as diferenças já são abertas automaticamente, antes eu precisa mandar abrir o diff e depois clicar numa das tags exibidas. E a IDE em si também ficou mais rápida para aparecer, isso mesmo, só pra aparecer, pois pra abrir continua demorando o mesmo tempo de antes, só foi feita uma jogada pra nos tapiar. Os projetos e módulos que antes eram carregados ao iniciar a IDE agora são carregados depois que ela abre, ou seja, continua demorando do mesmo, só mudaram a demora de lugar.

No geral essa experiência está sendo muito legal, já estou bem menos reativo ao NetBeans.

Planning Poker Cards

O Flavio Steffens, que escreve no blog Mudando uma Pequena Empresa publicou hoje um esquema muito legal para usar-se no Planning Poker, são as tão famosas cartas (cards). Pelo relato em seu blog, são os próprios modelos que o Flavio utiliza na empresa em que trabalha e pelo que eu já vi, são bem úteis e aplicáveis a qualquer outra empresa.

Então, se você também faz rascunhos sofríveis em papel chamex ou se você também tem o péssimo costume de perder ou inutilizar as cartas entre uma sprint e outra e precisa ficar fazendo tudo de novo, aproveite o modelo disponibilizado pelo Flavio e mande fazer os seus cartões de verdade numa gráfica.

Mais do mesmo: Netbeans

Nada como um bom final de semana trabalhando para lembrar e descobrir mais algumas façanhas no nosso amigo Netbeans. Vamos a listinha de novo.

Gostei:

  • Ainda vou descobrir alguma coisa.

Não gostei:

  • Set as Main Project. Isso é muito chato!
  • O ‘Fix Imports’ só funciona quando a classe não tem nenhum erro, ou seja, só depois de você acertar tudo que uma geral nos imports poderia fazer.
  • Ainda não descobri um atalho para o Quick&Fix. No Eclipse, CTRL+1.
  • Não dá pra você simplesmente matar, parar, *exterminar* com o serviço do servidor de aplicações que estiver utilizando. No meu caso tem sido péssimo, pois o servidor de aplicações roda localmente na minha estação, mas o banco de dados eu acesso o do escritório (lembre-se que eu trabalho em casa agora :D) via VPN e às vezes demora uns 10 minutos pra verificar todas as conexões. (Nota mental: não que eu queira largar conexões penduradas no banco sempre, mas neste caso seria melhor do que esperar 10 minutos, afinal, em menos de 10 minutos o oracle já iria matar as conexões mesmo).

No final de semana tem mais.