quinta-feira, 26 de janeiro de 2012

Codeigniter + Node.js + Vows.js - Notifier


Finalizando, vamos refatorar a aplicação de prova de conceito para que ela utilize utilize o servidor node.js para notificar os clientes conectados.  O código fonte final da aplicação pode ser encontrado no repositório https://github.com/fcm/codeigniter-academic

Refatorando o Worker
A classe que realiza o trabalho de redimensionamento das imagens deve ser refatorada para se conectar com o servidor node.js e assim comunicar aos seus clientes a conclusão de seu trabalho.  Vamos iniciar pelo arquivo (codeigniter-academic/spec/ResizeImageJobSpec.php) de especificação (BDD).




Manipulador de Notificações
A classe application/workers/notifier.php é responsável pela interação com o servidor node.js.  Esta classe possui um método publish que usa um client REST para  notificar seus clientes das alteração no seu estado por meio de mensagens (websocket) usando o servidor node.js (server-fayer) .



Injetando a Dependência
A classe que manipula as notificações é injetada no construtor da classe que realiza o trabalho de redimensionamento das imagens ( application/workers/resize_image_job.php). Desta maneira testar a classe ou mudar a maneira de conexão e notificação fica muito mais simples.



Rodando os testes
Rodar os testes para ver se a refatoração não quebrou nada na aplicação. O resultado deve ser próximo da figura abaixo.




Rodando a Aplicação
Sempre que um worker finaliza um trabalho de redimensionamento das imagens ele se conecta por meio do protocolo HTTP usando o cliente REST com o servidor Node.js que publica esta mensagem para os clientes conectados num determinado canal. Desta forma não é necessário que todos os clientes façam Long Polling para descobrir o se as imagens já foram redimensionadas. Isso ajuda muito a escalar uma aplicação web diminuindo o número de requisições.

Foi criado um segundo canal por onde podem ser enviadas mensagens gerais para a aplicação. Pode ser usado a aplicação Curl para testar a funcionalidade direto do terminal conforme o comando da imagem abaixo.




REFERÊNCIAS
http://howtonode.org/how-to-module
http://www.adityaravishankar.com/2011/10/nowjs-node-js-tutorial-creating-multi-room-chat-server/
http://simas.posterous.com/writing-a-php-daemon-application
http://www.lifeyun.com/node-js-building-for-scalability-with-server-side-javascript.html
http://www.vivaolinux.com.br/artigo/Node.js-para-administradores-de-sistema
http://vowsjs.org