Um dos nossos clientes nos solicitou a criação de uma plataforma de Webcast. Tal plataforma é responsável por transmissão de vídeo, slides, chat, enquetes, etc. de uma apresentação onde o apresentador ou palestrante se comunica com muitos ouvintes/espectadores simultâneos, normalmente utilizando a tecnologia streaming.

Um dos requisitos do projeto era atender milhares de usuários simultâneos, podendo esses usuários interagir (via chat, enquete, etc), de diversos dispositivos (celulares, tablets, desktop, etc.).

Após alguns testes e provas de conceito, verificamos que o melhor caminho a se seguir seria utilizando uma solução baseada em Node.js.

Trabalhando junto com a equipe técnica e de negócio do cliente, entregamos uma solução que atinge os objetivos acima, além de empregar as melhores técnicas e tecnologia de ponta na solução. Ficou fora do escopo da atuação da Vizir neste projeto a infra-estrutura de streaming de vídeo, que foi executado de forma inovadora pela equipe do nosso cliente!

Algumas características do projeto:

Node.js: Para a troca de mensagem em tempo real entre o servidor e milhares de clientes, era necessário extrair o máximo de cada servidor. A plataforma Node.js é ideal para estes cenários, pois empregando técnicas de “non-blocking I/O” e por isso pode manter milhares de usuários conectados ao servidor simultaneamente.

Socket.io: Fazer com que o software fosse acessível pelo maior número de dispositivos e navegadores (e suas versões) fazia parte escopo do projeto. Isso colocava um desafio, já que alguns dispositivos ou navegadores antigos não tem suporte nativo à tecnologia WebSockets que permite troca de mensagens em tempo real. Para isso utilizamos o Socket.io, que emula a tecnologia de streaming de mensagem, mesmo quando WebSocket não é suportado.

Backbone.js: Por se tratar de uma aplicação web single page e com grande quantidade de código sendo executado no browser, precisamos utilizar um MVC JavaScript robusto e que possibilitasse um desenvolvimento mais modular. Decidimos utilizar o Backbone.js, que facilitou a manutenção e testes das muitas partes que interagiam entre si.

CoffeeScript: Linguagem intermediária que compila para JavaScript e nos permitiu ganho de produtividade, pois é uma linguagem que simplifica tarefas como a definição de classes. Ainda usamos o Rehab, módulo desenvolvido pela Vizir, para o gerenciamento de dependências de arquivos CoffeeScript.

Amazon Cloud AWS: Utilizamos instâncias EC2 da Amazon AWS para agilizar a criação de ambientes de testes e produção, além de agilizar a escalabilidade da aplicação. Além disso utilizamos o Puppet para automatizar o gerenciamento de dependências dos servidores.

Testes: Por ser uma aplicação complexa tanto no cliente (browser) como no servidor, foi preciso garantir através de testes unitário e testes de integração que a aplicação estava funcionando corretamente durante todo o ciclo de desenvolvimento. Usamos o Mocha e o PhantomJS, um browser que não tem engine gráfica, mas que lê, interpreta e executa seu HTML, CSS, e JavaScript, possibilitando os testes automáticos de um browser. Testes de carga foram executados usando instâncias AWS EC2 criadas dinamicamente simulando clientes usando a aplicação.