Monitoria do Canal da Piracema: Uso do MongoDB e do Node.js como parte da solução Thiago Bitencourt, Luis Valdés, Gustavo Valiati e David Jourdain [email protected] , [email protected] , [email protected] e [email protected] Celtab – Centro Latino-americano de Tecnologias Abertas www.celtab.org.br – 18 de Julho de 2014 – Foz do Iguaçu/PR – Brasil Abstract We were questioned about what a kind of technology would the better one to develop a whole system, integrating hardware and software (which means: development framework, language, data base and web services) to RFID system monitoring. In a certain time of the process, were evaluated that the Node.js joint with mongoDB would be the most consistent solution to integrate on that development. And so we did. Now, this article will describe some issues to justify why these technologies are in use on the project, in detriment from other technologies, also evaluated, but not totally adherent in a concept we considered: The closest architecture to a "real time" concept, for system answers. 1o – Introdução Os biólogos da Itaipu tem mantido sobre relativo controle dados referentes ao fluxo de peixes sobre o canal artificial desenvolvido para permitir a manutenção do processo migratório, alterado após a construção da barragem da Itaipu. Entretanto, a solução que encontra-se ainda em uso atende parcialmente a este controle, bem como não garante a qualidade dos dados coletados e não permite que a aferição feita possa garantir de que os dados coletados representem a veracidade dos fatos. Fator elementar: Neste modelo em uso, não há persistência de dados, cruzamento de dados ou até mesmo um banco de dados que permita tal cruzamento de forma segura. Sob este contexto, o Celtab foi acionado para elaborar um estudo e uma proposta de solução que, após apresentada enquanto projeto, foi iniciado o desenvolvimento de protótipos para atenderem a esta temática diária dos biólogos da Itaipu. Este artigo visa apresentar brevemente a justificativa da escolha de parte das soluções adotadas no desenvolvimento. A saber: O banco de dados e o web service. Monitoria do Canal da Piracema: Uso do MongoDB e do Node.js como parte da solução Pg 1 2o – Contextualização da problemática Quando a problemática foi trazida para o Celtab, foi nos apresentado de que o “problema” era a monitoria dos peixes. Entretanto, após análise detalhada da problemática, ficou claro para a equipe de pesquisadores que os peixes não eram o elemento principal da problemática. Outrossim, a problemática real era a monitoria eficiente de dispositivos RFIDs. Inicialmente, de um modelo e fabricante específico, para atender a uma necessidade preexistente. Contudo, havia ficado claro para os pesquisadores de que esta solução deveria ser pensada de forma a permitir a maior flexibilidade possível, fosse para a mudança de RFID, de antenas e leitores, bem como sobre a problemática do armazenamento dos dados adquiridos a partir da leitura dos RFIDs, bem como da melhor aderência aos aplicativos distintos a serem desenvolvidos. Mesmo que todo o desenvolvimento tenha sido pensado de forma modular (seja para que diversos RFIDs ou leitores sejam assimilados na solução, seja para a adição de código para estes novos dispositivos), a solução final deve ser considerada “como um todo”, com elementos embarcados, e não como um produto segmentado, que não mantém a arquitetura planejada. Alterações nesta arquitetura estável requisitam um volume considerável de retrabalho de código. 3o – Levantamento de requisitos Quando da avaliação dos requisitos a serem considerados para o estudo e a prototipagem de uma solução que atendesse as demandas dos biólogos da Itaipu, o Celtab, sem receber claras restrições, fosse para hardware ou para software, os pesquisadores avaliaram diversas soluções que poderiam ser integradas ao projeto. De Julho/2013 a Novembro/2013, foram feitas avaliações de diversos bancos de dados, SQL's e NoSQL's, assim como de tecnologias para web services que fossem mais aderentes aos bancos de dados estudados. Apenas a partir de Dezembro/2013 que MongoDB e Node.js começam a fazer parte da solução, depois de avaliações comparativas com diversos bancos de dados. Após a apresentação de proposta inicial, feita ao Comitê Gestor no dia 17/07/2013, a coordenação técnica do Celtab também foi questionada, se haveria alguma limitação que deveria ser considerada. A única limitação apresentada pelo coordenador técnico é que deveriam ser observados o custo do protótipo final e o tempo de resposta do sistema como um todo. Tendo apenas estas restrições iniciais, foram avaliadas uma considerável gama de tecnologias que pudessem ser aderentes ao conceito inicial proposto pela coordenação técnica do Celtab, e que está contido no “Abstract”: “The closest architecture to a "real time" concept, for system answers”. Monitoria do Canal da Piracema: Uso do MongoDB e do Node.js como parte da solução Pg 2 4o – Desenvolvimento modular da solução Para o projeto de monitoramento do canal da piracema, tendo como premissa o princípio do desenvolvimento modular, para a criação de uma solução final integrada, um dos objetivos foi a centralização dos dados em um servidor que se comunique diretamente com os pontos de coleta de dados, para sincronização e monitoramento destes pontos de coleta, com o menor tempo de resposta possível. Neste contexto, foram considerados diversos aspectos. Entre eles, o banco de dados foi um dos principais. Outro ponto considerado foi um servidor Web orientado a eventos, para elaboração de serviços para o usuário final. Neste caso específico, os biólogos da Itaipu. Por fim, foram avaliadas as linguagens de programação e frameworks a serem considerados no processo de desenvolvimento. Obs.: Cabe salientar que um dos fatores que também permeou todas as escolhas foi o de que o resultado final deveria considerar o menor tempo de resposta entre unidade de leitura e web service, assim como atender a um grande número de usuários e que solução oferecida deveria atender a diversas problemáticas distintas, com campos de atuação semelhantes. Pensando nisso, a solução a ser implementada foi pensada, estruturada e desenvolvida para atender a outras realidades semelhantes em qualquer parte do mundo, desde o início das atividades do projeto. O problema abordado na Itaipu consiste em alguns pontos de coleta se comunicando com um servidor, que será responsável pela centralização dos dados. Porém, em um ambiente mais amplo, com milhares de pontos de coleta distribuídos remotamente, este mesmo sistema terá que atender a uma demanda em expansão, e assim será, já que as tecnologias utilizadas suportam expansão de maneira nativa (sem necessitar de nenhuma alteração) e sem perda de desempenho. De acordo com as características do projeto a ser desenvolvido e com os conhecimentos prévios dos pesquisadores envolvidos, foram selecionadas as seguintes tecnologias. No ponto de coleta, para desenvolver o sistema de monitoramento, foi utilizada linguagem de programação C++ com framework Qt. No sistema servidor, foi utilizado Node.js, que é um Servidor Web orientado a eventos e que utiliza a linguagem JavaScript como backend, e que tem como banco de dados mais alinhado a persistência o MongoDB[1]. Monitoria do Canal da Piracema: Uso do MongoDB e do Node.js como parte da solução Pg 3 O Node.js possibilita a conexão com um grande número de pontos de coletas, simultaneamente, sem perder performance. Esta tecnologia é utilizada para atender a grandes números de conexões de maneira paralela, sem que uma conexão interfira na outra e sem que uma conexão impossibilite que outras conexões aconteçam: Ou seja: Uma nova conexão sempre será aceita. Isso porque todas as tarefas realizadas no Node.js são executadas paralelamente e de maneira não bloqueante. Com isso, uma tarefa é enviada para execução e outra já é executada paralelamente, sem que haja a necessidade de esperar o término da tarefa anterior. O Node.js possibilita utilizar MongoDB como base de dados de maneira nativa. Tendo o Node.js e o MongoDB trabalhando de forma integrada, a conexão e a manutenção dos dados acontece de uma maneira muito mais simples e rápida. Essa característica por si só garante desempenho ao trabalhar com dados sob persistência. Além disso, outras características pontuam a favor da base de dados MongoDB junto com o Node.js, sendo elas: • MongoDB é o banco de dados mais utilizado pela comunidade para desenvolvimento de aplicações web. Em função disso existem muitos fóruns e documentação disponíveis sobre desenvolvimento utilizando esta arquitetura. Um exemplo é o MEAN Stack que fomenta o desenvolvimento de aplicações web utilizando MongoDB, Express, Angular.js e Node.js[1]. • MongoDB é um bando de dados NoSQL orientado a documentos, o que possibilita o crescimento dos dados armazenados sem perda de desempenho. Além disso, não precisa ter um esquema fixo e permite uma configuração de escrita que otimiza a persistência dos dados. Todas as informações relevantes a um determinado registro são persistidas com apenas um comando para a base de dados[1]; • MongoDB permite a conexão e a gerência de muitas conexões simultâneas a mesma base de dados, possibilitando a leitura e a escrita “ao mesmo tempo”, por conexões distintas[1]; • Possibilita que a base de dados tenha um crescimento horizontal, através da utilização de replica set. Em uma base de dados relacional convencional, conforme o número de dados armazenados cresce, é necessário: + processamento, + armazenamento e + memória na máquina onde a base de dados esta persistida. Portanto, quando a base de dados é extremamente grande, é necessário equipamentos com grande poder computacional e de custos relativamente altos (tanto para aquisição quanto para manutenção). O replica set do MongoDB possibilita que os dados sejam distribuídos em diferentes servidores de maneira fácil e de rápido acesso a cada ponto, e possibilita a expansão da quantidade de dados sem acrescentar em complexidade e sem perder performance. Essa característica permite ainda a alta disponibilidade dos dados armazenados[1]; Monitoria do Canal da Piracema: Uso do MongoDB e do Node.js como parte da solução Pg 4 • Considerando que o MongoDB é orientado a documentos, a consulta dos dados é otimizada. Todas as informações relevantes são armazenadas em um mesmo documento, o que agiliza a recuperação das informações. Ou seja: Em uma base de dados relacional para buscar todos os dados relacionados, seria necessárias várias consultas a base de dados (o que se torna um problema quando a quantidade de dados é muito grande), enquanto que, com MongoDB, uma única consulta traz todas as informações necessárias. Este mesmo efeito acontece na inclusão e na alteração de dados[1]. Um dos objetivos considerados em cada um dos projetos de pesquisa é estudar e identificar as melhores soluções para atender a um determinado problema e, devido as características e possibilidades de expansão do projeto de monitoramento do canal da piracema, essas tecnologias se mostraram capazes de atender as necessidades do projeto, da forma mais robusta e que menos impacte no processo de expansão de seu uso. 5o – Custo da migração O projeto de monitoramento do canal da piracema se encontra em uma fase avançada, com protótipos sendo preparados para implantação nos cinco pontos de monitoramento, no canal da piracema. O sistema servidor, responsável por se comunicar com os pontos de coleta e centralizar os dados, já está preparado para ser implantado. Para uma eventual alteração na base de dados será necessário um estudo, replanejamento e reimplementação do sistema servidor, sem que isso possa garantir o mesmo grau de eficiência estudado na proposta desenvolvida. Como já mencionado, o Node.js e o MongoDB interagem de maneira nativa e, para utilizar uma nova base de dados, será necessário a utilização de um driver para comunicação, o que eliminará o benefício da interação nativa entre ambos. O MongoDB tem estrutura e características completamente distintas de banco de dados relacionais convencionais. Portanto, para migrar a base de dados, será necessário reimplementar a base de dados para que seja relacional e também será necessário reimplementar todos os comandos de consultas, inserções e alterações de dados. Com isso, toda a parte de comunicação e interação com a base de dados (além da própria base de dados em si) deverá ser reimplementada. É conveniente salientar de que, mesmo tendo sido desenvolvido de forma modular, devemos considerar as tecnologias Node.js e o MongoDB como elementos embarcados da solução final. Por isso, toda alteração que impacte em sua remoção também impactará no redesenho da solução em si. Monitoria do Canal da Piracema: Uso do MongoDB e do Node.js como parte da solução Pg 5 Foi considerada a execução de um benchmark para comparação entre bancos de dados relacionais e NoSQL's. Entretanto, conforme diversas fontes salientam, por se tratarem de métodos de armazenamento e chamada distintos, as comparações mediante apenas avaliação do fator segurança de dados poderia ser tendenciosa, já que ambos apresentam robustez. Quanto ao tempo de resposta, por conta da forma de acesso aos dados, bancos NoSQL's tendem a ter um tempo de resposta consideravelmente menor, sem que isso represente demérito para bancos SQL's, considerando de que bancos NoSQL's tem aplicabilidades específicas, distintas de bancos SQL's[2]. Para realizar todas essas alterações, será necessário um tempo para estudos, definições, implementações, testes e eventuais correções, sem que isso represente que esta modificação oferecerá o mesmo tipo de desempenho. 6o – Contextualização do MongoDB • MongoDB é um banco de dados NoSQL orientado a documentos o que facilita bastante o crescimento dos dados armazenados já que não precisa ter um esquema fixo e permite uma configuração de escrita que otimiza a persistência de dados, uma forma fácil de explicar é que desativando o acknowledge of writes and journal writes é possível escrever muitos dados por segundo recebendo os mesmos de centenas ou milhares de usuários ao mesmo tempo, com isso a escalabilidade do sistema de armazenamento é muito maior que outros bancos de dados existentes no mercado[3]. • O sistema de crescimento do MongoDB é um sistema horizontal, para ter uma capacidade maior de armazenamento somente é necessário adicionar um novo Shard e configurá-lo, esse novo Shard estará composto por um Replica Set de 3 ou mais Nodes, cada shard pode estar fisicamente separado dos outros, permitindo a distribuição dos dados a nível mundial, formando um sistema distribuído de persistência de baixo custo e alta disponibilidade, em comparação com outros sistemas de bancos de dados relacionais que somente podem crescer de forma vertical (supercomputadores com alto custo de compra e manutenção)[4]. 7o – Conclusão Em concordância com solicitação efetuada mediante email no dia 15/07/2014, será feito o devido planejamento e a modificação para adoção do PostgreSQL, para o protótipo. Considerando o prazo executado para o desenvolvimento da aplicação, com os devidos enlaces para o mongoDB e o Node.js, estimasse uma extensão na conclusão do produto final entre 4 a 6 meses[5]. Monitoria do Canal da Piracema: Uso do MongoDB e do Node.js como parte da solução Pg 6 Contudo, É conveniente salientar de que a solução final, com a modificação efetuada para uso com o PostgreSQL, não estará plenamente aderente ao conceito inicial avaliado para a solução final, apresentado no “Abstract”. Sob esta ótica, segue sendo o binômio “MongoDB + Node.js” o mais aderente ao desenvolvimento iniciado, de acordo com todos os estudos feitos desde Julho/2013. Inclusive, diversos autores acreditam e defendem tecnicamente de que o MongoDB (ou melhor, NoSQL's) atende de forma mais efetiva, no que tange o tempo de resposta final, permitindo um acréscimo fractal de dados, sem que haja risco de formação de “gargalo” para a chamada aos dados[6]. Para alguns tipos específicos de serviços, como para uma rede social, esta forma de manipulação de dados não se apresenta como a mais apropriada. Entretanto, para a coleta e o acesso a dados, em uma estrutura equivalente ao campo de estudo (coleta de dados de RFID's para a monitoria do fluxo migratório de peixes), NoSQL's se revelam soluções robustas, estáveis, de rápida resposta e as mais indicadas para este fim[6]. REFERÊNCIAS [1] Node.js and MongoDB - http://mean.io [2] MongoDB vs PostreSQL : Comparancy - http://blog.pingoured.fr/index.php?post/2012/05/20/PostgreSQL-vs-MongoDB - http://vschart.com/compare/postgresql/vs/mongodb - http://db-engines.com/de/system/MongoDB%3BPostgreSQL%3BRedis - http://dba.stackexchange.com/questions/57448/mongodb-performance-vs-postgresql-with-5-5-million-rows-documents [3] Write Concern and Journaling - http://docs.mongodb.org/manual/core/write-concern [4] Vertical versus Horizontal scaling - http://docs.mongodb.org/manual/core/sharding-introduction [5] MongDB vs PostgreSQL, with node.js app - http://stackoverflow.com/questions/18776088/mongodb-vs-postgres-in-a-nodejs-app [6] When not use MongoDB - http://www.sarahmei.com/blog/2013/11/11/why-you-should-never-use-mongodb/ Monitoria do Canal da Piracema: Uso do MongoDB e do Node.js como parte da solução Pg 7