Utilizando JavaScript no servidor para construir aplicações em tempo real com Node.js
1. PONTIFÍCIA UNIVERSIDADE CATÓLICA DE MINAS GERAIS
FACULDADE DE SISTEMAS DE INFORMAÇÃO
UTILIZANDO JAVASCRIPT NO SERVIDOR PARA CONSTRUIR
APLICAÇÕES EM TEMPO REAL E ALTA CONCORRÊNCIA NA
INTERNET COM NODE.JS
AUTOR
LUCAS SIMON RODRIGUES MAGALHÃES
MONOGRAFIA DE CONCLUSÃO DO CURSO DE SISTEMAS DE INFORMAÇÃO
Orientador(a):
Pasteur Ottoni de Miranda Júnior
Belo Horizonte, 25 de Fevereiro de 2013.
LUCAS SIMON RODRIGUES MAGALHÃES
2. UTILIZANDO JAVASCRIPT NO SERVIDOR
PARA CONSTRUIR
APLICAÇÕES EM TEMPO REAL E ALTA
CONCORRÊNCIA NA INTERNET COM NODE.JS
Monografia apresentada ao Departamento de
Sistemas de Informação da Pontifícia
Universidade Católica de Minas Gerais, como
exigência parcial para a obtenção do título de
Bacharel em Sistemas de Informação.
Profª orientadora: Pasteur Ottoni de Miranda Júnior
Belo Horizonte, 25 de Fevereiro de 201
4. 4
1 Tema
Pretende-se com esta proposta de pesquisa investigar e elaborar aplicações em tempo
real, para a internet, utilizando a linguagem JavaScript no servidor -Node.Js-.
Atualmente a internet tem crescido mais depressa que o rádio e a televisão. Hoje a Inter-
net, como mídia de comunicação, tem o mais amplo de todos os alcances do que as mídias ci-
tadas anteriormente. E para continuar a oferecer serviços e informações, com rapidez e até
mesmo em tempo real, é necessário nos preocupar com a quantidade de milhões de usuários
simultâneos, que cresce exponencialmente, e vencermos barreiras tecnológicas de escalabili-
dade e desempenho nos servidores.
Segundo TILKOV (2010) para resolver problemas de que lidam com múltiplas entradas e
saídas (E/S), como manipular múltiplas requisições de clientes em servidores, os programado-
res adotaram utilizar técnicas de programação multithread, ou técnicas de programação para-
lela, dividindo o processamento da aplicação em vários núcleos dos processadores da CPU ou
até mesmo utilizando computação distribuída. Até então este modelo de programação para
atender múltiplas entradas e saídas é fácil de entender, implementar e permite executar os
processos de forma rápida e eficiente. Porém este modelo apresenta algumas falhas, por
exemplo, quando uma thread consome um recurso X de processamento ou operação de entra-
da e saída e em seguida o aplicativo executa uma nova thread que necessita consumir este
mesmo recurso, teremos um deadlock (bloqueio) o qual é necessário esperar a primeira thre-
ad terminar sua execução, liberar o recurso e então prosseguir com o processamento da se-
gunda thread. Como dito por TILKOV:
Mesmo que muitos desenvolvedores tenham tido sucesso em usar multithread em
aplicações de produção, muitos concordam que a programação multithread é nada
fácil. É cheia de problemas que podem ser difíceis de serem isolados e corrigidos,
assim como bloqueios e falhas em proteger recursos compartilhados entre as threads.
Os desenvolvedores também perdem algum grau de controle quando desenvolvem
em multithreading porque o sistema operacional normalmente decide qual thread
será executa e por quanto tempo.(TILKOV, 2010, p.80)
Além do fator descrito anteriormente temos um complemento e um novo problema apre-
sentado por Abernethy:
Em linguagens como Java™ e PHP, cada conexão cria uma nova thread que potenci-
almente tem um acompanhamento de 2 MB de memória com ele. Em um sistema
¹ Geohash é um algoritmo que foi criado por Gustavo Niemeyer em 2008. Intercalando latitude e longitu-
de de um modo bit a bit, é gerada uma string composta que identifica um ponto geográfico. Esta cadeia pode
então ser facilmente armazenadas ou usadas para transmitir os dados de ponto de localização.
5. 5
que possui 8 GB de memória RAM, que coloca teoricamente o numero máximo de
conexões concorrentes em cerca de 4.000 usuários. Como sua base de clientes au-
mentou, se você quiser que seu aplicativo web suporte mais usuários, você tem de
adicionar mais e mais servidores. Somando-se a estes custos, temos os possíveis pro -
blemas técnicos - um usuário pode usar diferentes servidores para cada requisição,
portanto, qualquer recurso compartilhado tem de estar compartilhado entre todos os
servidores. Por todas essas razões, o gargalo em toda a arquitetura da aplicação web
(incluindo a velocidade de tráfego, velocidade do processador, e velocidade da me -
mória) estaria associado ao número máximo de conexões concorrentes que um servi -
dor pode manipular.(ABERNETHY, 2011)
Portanto, vemos que o escalonamento horizontal, adicionando novos servidores, além do
custo altíssimo, torna a arquitetura do sistema complexa pois será necessário acrescentar ser-
vidores de balanceamento, uma rede bem estruturada de um datacenter confiável, capaz de
suportar um alto tráfego e acompanhamento dos processos do sistema de perto para que os
deadlocks sejam consertados em tempo hábil. A utilização de escalonamento vertical, ou me-
lhor, atualização de hardware - colocando mais processadores ou memória - pode inviabilizar
a arquitetura do sistema, visto que teremos uma barreira de hardware, mais especificamente
placas-mãe que não suportam mais de 8 slots de memória ou determinados modelos de me-
mória RAM, suporte a processadores com mais de 7 núcleos. Além dessas limitações tecnoló-
gicas, temos o agravante do alto custo para atualizar este hardware, processadores com 7 nú-
cleos são caros e dependendo dos casos é necessário trocar todo o equipamento – hardware -
para garantir o devido funcionamento dos componentes.
Pelos problemas citados acima surge a necessidade de resolver este problema, em nível
de software, que permita receber um grande número de conexões simultâneas nos servidores,
capaz de ser escalável e consumir menores índices de memória RAM. Um paradigma adotado
para esta solução é a programação orientada a eventos, onde tudo gira em torno de eventos,
indicando que exite um produtor do evento e um consumidor daquele evento. (Junior, 2012)
Pesquisando sobre as linguagens que suportam o paradigma de programação orientada a
eventos, encontramos o JavaScript como linguagem de programação que fornece o modelo de
eventos assíncronos, funções anônimas e callbacks. Como JUNIOR citou um programa as-
síncrono pode ser exemplificado de tal forma:
Já em um programa assíncrono, ao ser feita uma requisição a um banco de dados,
será especificado o que deve ser feito com os resultados da requisição. O programa
não espera a finalização da requisição, e passa para outras atividades. E apenas quan-
do o resultado é retornado, a lógica de manipulação dos resultados que foi especifi -
¹ Geohash é um algoritmo que foi criado por Gustavo Niemeyer em 2008. Intercalando latitude e longitu-
de de um modo bit a bit, é gerada uma string composta que identifica um ponto geográfico. Esta cadeia pode
então ser facilmente armazenadas ou usadas para transmitir os dados de ponto de localização.
6. 6
cado no momento da requisição é executada [11]. A essa lógica que é executada
após a finalização da requisição dá-se o nome de callback.(JUNIOR, 2012, p.2)
A partir dessa necessidade descrita em paragráfos anteriores surge o ambiente de desen-
volvimento Node.Js, que é melhor descrito por JUNIOR at. al como uma plataforma cujo o
objetivo é a fácil construção de rápidas e escaláveis aplicações de rede. Para isto o Node.Js
emprega o paradigma de programação orientada a eventos utilizando o JavaScript Engine V8
do Google, operações de entradas e saídas em eventos (assíncronos) e não bloqueantes. Abe-
nerthy cita que:
Ao invés de criar novas threads no sistema operacional para cada conexão ( e alocar
a memória RAM que acompanha com as threads), cada conexão dispara um evento
executado no processo motor do Node.JS. Node também afirma que ele nunca irá ter
deadlocks -impasse-, já que bloqueios não são permitidos, e não bloqueia direta -
mente chamadas de entrada e saídas. Node.Js afirma que um servidor pode suportar
dezenas de milhares de conexões simultâneas.(ABENERTHY, 2011)
Isso ocorre porque ao ser invocado um nó de servidor de processos (node server
process), ele roda apenas em uma thread que suporta um alto número de conexões, isso é pos-
sível, pois há um loop implícito que cobre o código, esse loop é denominado de event loop e
tem como função esperar os eventos e repassá-los ao manipulador de eventos. (OLIVEIRA,
2012)
Por fim, buscamos com o Node.Js, o qual será a base para esta proposta de pesquisa, de-
monstrar uma aplicação Web capaz de mostrar, em tempo real, a localização de pessoas ou
dispositivos móveis através das coordenadas de latitude e longitude utilizando o paradigma de
orientação a eventos, com alta concorrência de conexões através desta plataforma de desen-
volvimento.
¹ Geohash é um algoritmo que foi criado por Gustavo Niemeyer em 2008. Intercalando latitude e longitu-
de de um modo bit a bit, é gerada uma string composta que identifica um ponto geográfico. Esta cadeia pode
então ser facilmente armazenadas ou usadas para transmitir os dados de ponto de localização.
7. 7
2 Área de conhecimento
O trabalho se insere na área de engenharia de software, pois propomos solucionar proble-
mas de rede de computadores (altos números de conexões) e escalabilidade (infraestrutura)
com técnicas de programação de software orientadas a eventos.
¹ Geohash é um algoritmo que foi criado por Gustavo Niemeyer em 2008. Intercalando latitude e longitu-
de de um modo bit a bit, é gerada uma string composta que identifica um ponto geográfico. Esta cadeia pode
então ser facilmente armazenadas ou usadas para transmitir os dados de ponto de localização.
8. 8
3 Justificativa
Acreditamos que ao estudar técnicas de programação orientadas por eventos no Node.Js
possa contribuir com o avanço dessa tecnologia e a forma de comunicação da informação
para a população. Hoje, temos a necessidade de obtermos informações em tempo real para to-
mada de decisões eficientes dos nossos negócios e ao processo de ensino e aprendizagem no
setor tecnológico.
¹ Geohash é um algoritmo que foi criado por Gustavo Niemeyer em 2008. Intercalando latitude e longitu-
de de um modo bit a bit, é gerada uma string composta que identifica um ponto geográfico. Esta cadeia pode
então ser facilmente armazenadas ou usadas para transmitir os dados de ponto de localização.
9. 9
4 Problema a ser abordado
No cenário atual, em termos de desenvolvimento web, para garantirmos informações em
tempo real é necessário investimento alto em infraestrutura e largura de banda para receber e
enviar respostas aos clientes. Uma maneira de fazer um simples sistema em tempo real é utili-
zar chamada Ajax a cada 5 segundos para atualizar os dados. Esta não é a maneira mais inteli-
gente de se realizar isso, porque continuaremos a ter consumo de memória no servidor e sere-
mos limitados pelo tamanho da memória RAM.
Como exemplo, durante o desenvolvimento desta pesquisa, propomos desenvolver um
aplicativo em Node.JS capaz de receber os dados da localização (latitude e longitude) de um
celular ou qualquer outro dispositivo e atualizar sua posição em tempo real no Google Maps,
serviço do Google. Este exemplo, similar à um GPS, tem como base os sistemas de rastrea-
mento veiculares que traçam uma rota pelo caminho percorrido do veículo e que necessitam
recarregar a página para visualizar sua posição atual.
Não pretendemos fazer um sistema complexo como os já existentes no mercado de rastre-
amento veicular, mas sim um aplicativo simples capaz de aceitar inúmeras conexões e visuali-
zar os resultados em tempo real. Com isso atingiremos nosso objetivo de demonstrar a capaci-
dade do Node.Js de resolver este problema de conexões em servidores .
¹ Geohash é um algoritmo que foi criado por Gustavo Niemeyer em 2008. Intercalando latitude e longitu-
de de um modo bit a bit, é gerada uma string composta que identifica um ponto geográfico. Esta cadeia pode
então ser facilmente armazenadas ou usadas para transmitir os dados de ponto de localização.
10. 10
5 Objetivos
Intentamos com esta pesquisa investigar e demonstrar como o paradigma da linguagem
orientada a eventos no Node.Js é capaz de realizar funcionalidades em tempo real em conjun-
to com a biblioteca JavaScript Socket.Io.
Um segundo objetivo que procuramos demonstrar é a capacidade do Node.Js responder a
milhares de requisições com um simples servidor web, sem a necessidade de uma infraestru-
tura (escalonável) de alta tecnologia.
¹ Geohash é um algoritmo que foi criado por Gustavo Niemeyer em 2008. Intercalando latitude e longitu-
de de um modo bit a bit, é gerada uma string composta que identifica um ponto geográfico. Esta cadeia pode
então ser facilmente armazenadas ou usadas para transmitir os dados de ponto de localização.
11. 11
6 Resultados Esperados
Apresentar o software executando corretamente, demonstrando mudanças de comporta-
mento e execuções no processamento em tempo real para os entrevistadores através de uma
simples aplicação com o poucos usuários conectados a aplicação. Em seguida, demonstrar/si-
mular uma quantidade massiva de usuários conectados ao servidor tendo respostas as requisi-
ções. Para isso, utilizar simuladores de teste de carga com uma quantidade alta de conexões
entrantes e exibir os testes de processamento/benchmark dos servidores e da aplicação.
¹ Geohash é um algoritmo que foi criado por Gustavo Niemeyer em 2008. Intercalando latitude e longitu-
de de um modo bit a bit, é gerada uma string composta que identifica um ponto geográfico. Esta cadeia pode
então ser facilmente armazenadas ou usadas para transmitir os dados de ponto de localização.
12. 12
7 Contextualização
Utilizaremos o livro Getting Started with GEO, CouchDB, and Node.js, de Mick Thomp-
son, como base do desenvolvimento do aplicativo e da proposta de pesquisa que se segue pois
ele se propõe a criar um aplicativo resgatando os dados da geo localização e API’s de dispo-
sitivos móveis e então manipular esses dados com o conjunto de ferramentas a seguir: No-
de.Js, banco de dados CouchDB, GeoJSON, Geohash¹, e GDAL ( Geospatial Data Abstracti-
on Library).
Também utilizaremos outras referências bibliográficas para assegurar o entendimento e a
qualidade do servidor Node.Js, como What is Node? (Brett McLaughlin), Node: Up and Run-
ning (Tom Hughes-Croucher e Mike Wilson, 2012), Learning Node (Shelley Powers, 2012) e
em particular Construindo aplicações Node com MongoDB e Backbone (Mike Wilson, 2013)
que possui demonstrações do uso da biblioteca JavaScript Socket.Io responsável por aplicati-
vos em tempo real nos navegadores e dispositivos móveis.
¹ Geohash é um algoritmo que foi criado por Gustavo Niemeyer em 2008. Intercalando latitude e longitu-
de de um modo bit a bit, é gerada uma string composta que identifica um ponto geográfico. Esta cadeia pode
então ser facilmente armazenadas ou usadas para transmitir os dados de ponto de localização.
13. 13
8 Metodologia
Iremos dividir o processo de desenvolvimento da arquitetura e do sistema como um todo
em cinco etapas.
A primeira etapa, consistem em, desenvolver um sistema em Node.Js, utilizando o siste-
ma arquitetural RESTFul. Seguindo o conceito da arquitetura REST, iremos descrever atra-
vés de API’s as URI’s ( Identificador Uniforme de Recurso) de acesso e manipulação do(s)
recurso(s), que em primeiro momento será somente identificado como dispositivos móveis.
Como base inicial para o projeto proposto, teremos uma URI para cadastrar os celulares que
estão utilizando o sistema, salvando os dados em um banco de dados NoSQL, a ser definido.
Outra nova URI será utilizada com o objetivo de identificar quando o aplicativo Android ini-
ciar e transmitir os dados iniciais da geo localização do dispositivo, salvando os dados no
banco. E por fim e o mais importante, criar uma URI capaz de receber as coordenadas do dis-
positivo móvel, e atualizar as coordenadas do dispositivo móvel no banco de dados de acordo
com o id daquele dispositivo, data timestamp e claro as coordenadas.
Feito todo o desenvolvimento em ambiente de desenvolvimento, iremos hospedar o siste-
ma Node.Js em um servidor web em produção.
A segunda etapa, compreende em construir uma aplicação Android utilizando sua API in-
terna de geo localização para coletar os dados e transmiti-los para o servidor Node.Js criado
na etapa anterior. Descrevendo brevemente o funcionamento deste aplicativo, teremos um en-
vio de dados de latitude, longitude, e os dados do aparelho assim que o aplicativo iniciado. E
a cada mudança das coordenadas na API de geo localização os dados serão transmitidos para
o servidor com a finalidade de atualização das coordenadas conforme descrito na etapa anteri-
or.
Na terceira etapa iremos construir a visão exibindo e traduzindo os dados coletado pelo
dispositivo móvel e renderizar no Google Maps.
A quarta etapa será os testes do sistema como um todo. Primeiramente iremos distribuir o
aplicativo Android para amigos e familiares, que possuem um smartphone com este sistema
operacional , e estejam disponíveis para contribuir com os testes. Terá como pré-requisito um
plano de pacote de dados para transmitir os dados. Com esta etapa concluiremos o nosso pri-
meiro objetivo.
¹ Geohash é um algoritmo que foi criado por Gustavo Niemeyer em 2008. Intercalando latitude e longitu-
de de um modo bit a bit, é gerada uma string composta que identifica um ponto geográfico. Esta cadeia pode
então ser facilmente armazenadas ou usadas para transmitir os dados de ponto de localização.
14. 14
A quinta etapa, consiste em realizar um teste de carga no servidor Node.Js simulando a
conexão de vários dispositivos móveis, em coordenadas aleatórias, dentro de um raio pré fixa-
do. Em seguida atualizar as coordenadas a cada 7 segundos, por exemplo, para atingir o se-
gundo objetivo. Com a simulação citada poderemos quantificar a porcentagem uso da CPU e
da memória RAM no servidor e tê-los como base de prova do Node.Js e seu propósito.
¹ Geohash é um algoritmo que foi criado por Gustavo Niemeyer em 2008. Intercalando latitude e longitu-
de de um modo bit a bit, é gerada uma string composta que identifica um ponto geográfico. Esta cadeia pode
então ser facilmente armazenadas ou usadas para transmitir os dados de ponto de localização.
15. 15
9 Cronograma
Atividade Produto Resposável Entrega Data Valor
Alocação de - Cronogra- Coordenação Disponível De 04/2/2013 N/A
alunos e pla- ma do se- de TCC no SGA a 15/02/2013
nejamento do mestre
semestre - Alunos alo-
cados
1. Elabora- - Proposta de Aluno, sob a Em papel Até 20
ção da pro- monografia, supervisão (orientador) 01/04/2013
posta de mo- cf. modelo do orientador e no SGA
nografia
3. Redação - Resenhas Aluno, sob a N/A Até 20
de resenhas (mínimo de supervisão 06/05/2013
de textos in- 5), cf. mode- do orientador
dicados pelo lo
orientador
4. Produção - Monografia Aluno, sob a Em papel Até 60
da versão 1 versão 1, for- supervisão (orientador) 10/06/2013
da monogra- matada no do orientador e no SGA
fia (referen- padrão PUC
cial teórico e Minas.
metodologia)
¹ Geohash é um algoritmo que foi criado por Gustavo Niemeyer em 2008. Intercalando latitude e longitu-
de de um modo bit a bit, é gerada uma string composta que identifica um ponto geográfico. Esta cadeia pode
então ser facilmente armazenadas ou usadas para transmitir os dados de ponto de localização.
16. 16
10 Bibliografia
ABERNETHY,Michael. JustwhatisNode.js?. Abril/2011. Disponível em: <http://www.ibm.-
com/developerworks/library/os-nodejs/index.html> Acesso em: 29 MAR. 2013.
Construindo aplicações Node com MongoDB e Backbone, de Mike Wilson (O'Reilly). Copy-
right 2013 Mike Wilson, 978-1-449-33739-1
CouchDB – Apache CouchDB. Disponível em: <http://couchdb.apache.org/> Acesso em: 30
MAR. 2013
Gdal - Geospatial Data Abstraction Library. Disponível em: <http://www.gdal.org/> Acesso
em: 30 MAR. 2013
GeoJson - JSON Geometry and Feature Description. Disponível em: <http://www.geoj-
son.org/> Acesso em: 30 MAR. 2013
Getting Started with GEO, CouchDB, and Node.js, de Mick Thompson (O'Reilly). Copyright
2011, Mick Thompson, 978-1-4493-0752-3
http://shop.oreilly.com/product/0636920020806.do
JAVASCRIPT V8. Disponível em <https://developers.google.com/v8/> Acesso em: 25 MAR.
2013
JUNIOR, Francisco de Assis Ribeiro. Programação Orientada a Eventos no lado do servidor
utilizando Node.js. 2012. Disponível em: <http://www.infobrasil.inf.br/userfiles/16-S3-3-
97136-Programa%C3%A7%C3%A3o%20Orientada___.pdf > Acesso em: 20 ABR. 2013.
Learning Node, de Shelley Powers (O'Reilly). Copyright 2012, Shelley Powers, 978-1-449-
32307-3
¹ Geohash é um algoritmo que foi criado por Gustavo Niemeyer em 2008. Intercalando latitude e longitu-
de de um modo bit a bit, é gerada uma string composta que identifica um ponto geográfico. Esta cadeia pode
então ser facilmente armazenadas ou usadas para transmitir os dados de ponto de localização.
17. 17
Node: Up and Running, de Tom Hughes-Croucher and Mike Wilson (O'Reilly). Copyright
2012, Tom Hughes-Croucher and Mike Wilson, 978-1-449-39858-3
OLIVEIRA, Rômulo Reis. Desenvolvimento de jogos eletrônicos online em tempo real, para
múltiplos jogadores e multiplataformas. 2012. 80f. Monografia (Conclusão do curso) - Insti-
tuto Federal Sul-Rio-Grandense, Campus Passo Fundo, Passo Fundo.
Socket.Io. Disponível em: <http://socket.io/> Acesso em: 30 MAR. 2013
Tilkov. S, S. “Node.js: Using Javascript to Build Gugh Performance Network Programs”.
Internet Computing IEEE, 2010.
What is Node? de Brett McLaughlin Published by O'Reilly Media, Inc., 1005 Gravenstein
Highway North, Sebastopol, CA 95472, 978-1-449-31005-9
¹ Geohash é um algoritmo que foi criado por Gustavo Niemeyer em 2008. Intercalando latitude e longitu-
de de um modo bit a bit, é gerada uma string composta que identifica um ponto geográfico. Esta cadeia pode
então ser facilmente armazenadas ou usadas para transmitir os dados de ponto de localização.