Trocar de Linguagem, Java consome muita memória RAM

Olá, no inicio do ano passado comecei a estudar programação web, desde do fronte-end até os bancos de dados NOSQL, e claro, a linguagem de programação backend foi Java, heeee!.. Conforme fui aprendendo de programação, percebi que o mais importante sempre foi a lógica mesmo. Por isso evitei muitos Frameworks que otimizava o ‘trabalho pesado’.

Agora que já estou criando aplicações com NoSQLs para rodarem em conjuntos em um VPS, juntamente com o Lucene como index/search, ou seja, eu vou precisar do máximo da memória RAM para o meus bancos, pois eles armazenam os dados na memória RAM.

Por causa do consumo de memória RAM que o java tem para cada conexão e além de ocupar muito espaço(não sei exatamente como, mas algumas horas atrás me deparei com a linguagem Node.js, que é o javascript rodando no servidor), estou quase trocando Java por Node.js.

Pelo que já estudei, e os testes que já fiz com o Node.js, percebi que será muito fácil em aprender e adaptar-me a essa linguagem. Pois é javascript, e javascript já estou bem acostumado no lado do cliente.

As únicas coisas que estão me impedindo até agora de fazer isso, é a respeito da segurança da linguagem, que ainda não sei(pois em java eu já conheço a segurança) e o motor de indexação e busca que eu usava, pois Lucene não tem suporte para essa linguagem. Até achei uma alternativa como o Norch, mas não sei como ele é em comparação ao Lucene do Java.

Queria saber então a opinião de segurança da linguagem e motor de indexação/pesquisa tão bom quanto o Lucene, para quem já tem costume de usar essa linguagem. Como ela é? E quais alternativas que ela tem para o Lucene?

Comecei a estudar Angular.js um framework MVVM que trabalha bem no lado cliente, como te falei sou iniciante nesta linguagem mas gostei bastante sobre o que vi até agora, o que posso lhe indicar, claro se houver interesse, são as vídeo aulas de Rodrigo Branas, tem lá no youtube.

Talvez eu posso usar esse framework no lugar de jquery, porque o AngularJS, como você mesmo disse, e pelo que eu já pesquisei a respeito, é para o lado do cliente, na interface. Só que minha questão é que eu desenvolvo aplicação do lado do servidor, ou seja, linguagens como ASP.NET, JAVA, Ruby, Python, PHP, etc… E no meu caso, eu uso o JAVA(JAVAEE).

O que eu quero é trocar a linguagem do servidor. E o Node.js é uma plataforma(assim como o java) para desenvolvimento servi-side, onde a linguagem que ele utiliza é javascript.
Eu vi que ele tem uma velocidade e leveza muito grande, perfeita para uma aplicação onde o numero de acesso é alto, e tudo em tempo real.

Um exemplo que vi, é que para cada usuário acessando um site desenvolvido em java, lá no servidor o java reserva 2MB da RAM para esse processo, ou seja, um computador com 8GB de RAM, a grosso modo, vai suportar no máximo 4 mil acessos simultâneos, mais que isso, é necessária uma nova maquina. E como meu banco de dados, armazena todos os dados no cache da memoria RAM(não no disco do HD), eu não quero que esse espaço da RAM seja devorada pelo JAVA.
A mesma maquina, com 8GB de RAM, para um site desenvolvido em Node.js, suporta dezenas de milhares de acessos simultâneos sem “comer” minha memória RAM.

Resumo: Quanto mais memória RAM eu tiver de sobra, mais espaço de memória para meu banco super rápido eu vou ter.

A questão mesmo, é só o suporte para index/search (como o framework Lucene do java), e a segurança que que essa linguagem oferece. Inclusive material de estudo para essa linguagem, tem bastante na internet. E pelo que eu estou estudando agora, acho que com duas semanas já estarei desenvolvendo aplicações igual como se fosse em java. Só que mais rápido e com menos códigos, pois a linguagem é muito mais simples do que o java.

blz, não li direito, entendi que era client side, foi mal.

Consegui tira minha duvida a respeito das alternativas do Lucene, como motor de indexação para a plataforma NodeJS. Se alguém mais tiver essa mesma duvida que eu tive, pode consultar esse Tópico que eu mesmo me respondo.

Seguinte, se o seu servidor utiliza discos SSD para o banco de dados eu não usaria RAM para isso, não sei, mas acredito que a semântica de uso seja melhor aplicada, deixando RAM para processos voláteis e só isso.

Enfim, comparar consumo de memória é complicado, pois depende muito de como a tecnologia foi aplicada, sacou? Uma implementação ruim de Java ou Node pode comprometer sua visão sobre uma ou outra plataforma.

Eu arriscaria utilizar uma arquitetura voltada a serviços com AngularJS, dá para distribuir a carga de processamento/memória.

Tb acho que ele tá precisando de SSDs e não Node.js.

Também concordo. Não é preciso querer ser diferente a esse ponto de usar banco de dados em memória volátil. Uma solução radical dessas é acompanhada de novos problemas que poucos lidam.

colocar o banco de dados na memória é a solução tradicional pra quem quer aumentar a performance. Com o banco de dados em memória evita ter de mover os dados do armazenamento toda hora que precisar deles.

Estou com dificuldades de entender o que vc quis dizer, sinceramente.

Uma linguagem não usa mais ou menos memoria. Vc tem um overhead natural dependendo da linguagem mas no fim das contas o programa vai fazer o que vc programou pra ele fazer. Se vc cria muitos objetos, se armazena grandes estruturas, possivelmente vc vai usar mais memória.

Quando estudamos algoritmos, estudamos a complexidade espacial do que estamos fazendo e é possivel estimar a quantidade de memoria necessaria para fazer uma determinada tarefa.

A JVM tem uma série de ajustes no que diz respeito ao gerenciamento de memoria. Se vc não estuda isso, não importa qual linguagem vc vai estudar, vc sempre vai ter problema, mais cedo ou mais tarde.

Por exemplo, é muito comum vc querer cachear o resultado de uma operação para evitar o calculo dela uma segunda vez, e colocar no cache requer memoria. As vezes isso é implicito, por exemplo vc tem o cache de Strings no Java, vc tem o cache dos inteiros entre -127 a 128 ( do Wrapper ), etc. No garbage collector, dependendo de qual vc utiliza e quais as configurações vc pode ter objetos que jamais serão coletados e vão existir por todo o ciclo de vida da aplicação.

Eu vejo vc perguntando sobre segurança, sobre node.js, pra mim vc esta perdido e não sabe se expressar. O que tem haver segurança? No seu caso eu investiria tempo para entender os diferentes garbage collectors, em como fazer fine-tuning, em como fazer profiling do uso de memoria, que padrões de projeto vc pode usar para diminuir o consumo, quais algoritmos vc pode usar que possam ser mais eficientes, etc.

Memoria é apenas um dos items que devemos pensar quando desenhamos uma solução. CPU, I/O, disponibilidade, tudo isso entra no calculo. Vc só troca de linguagem se tem certeza em como analisar o problema atual e em como EXATAMENTE a linguagem y vai ajudar.

Por exemplo, talvez vc encontre uma solução em C++ que seja mais eficiente por ter menos overhead do que Java. honestamente? eu duvido que seja o problema, mais facil vc querer fazer o contrario.

Talvez vc ache uma solução em Erlang que seja mais adequada, agora vc tem que estudar bem para desenhar a sua aplicação numa linguagem funcional. Talvez uma parte dela faça sentido.

Não sei que problema vc quer resolver com Lucene, mas eu acho que o programa em questão é dinheiro e não memoria RAM. Talvez vc esteja lidando com volume de dados e de requests que vc precise de uma solução melhor do que simplesmente um VPS.

De cara eu vejo que vc roda na mesma maquina o Lucene e a sua aplicação. Isso me parece arriscado, não tem como escalar isso ai direito. Uma forma profissional seria vc ter maquinas para o Lucene ( em algum tipo de Cluster ) e maquinas para a sua aplicação, pois elas escalam provavelmente de forma diferentes.

Perceba que vc fala em 4 mil requests simultaneos, porém apenas isso não quer dizer muita coisa. De onde surgiu esse numero? Vc tem um load balancer na frente com max-conn 4 mil? vc sabe qual a rajada maxima? é chute? qual o tempo medio de um request?

com Vert.x vc pode programar em java e ter um estilo de programação não bloqueante que pode te ajudar a servir mais conexões, contudo se a sua aplicação recebe o request e repassa para o Lucene, não é o Java que vc tem que se preocupar e sim o Lucene em si. Provavelmente vc quer dividir isso em varias maquinas para poder trabalhar em paralelo, por exemplo.

Vc abre uma conexão por request ou vc tem um poll de conexões? Isso faz toda a diferença.

Vc tem quantos niveis de cache? precisa?

Seus requests podem ser cacheados do lado do cliente via tempo ou ETAG?

4000 é o seu pior caso?

é muito facil desenvolver uma app para um request. para multiplos vc precisa desenhar a aplicação, precisa de um design adequado. vc pode ter problemas com escrever em log, com coisas que não tem haver com a aplicação original.

Eu jamais consideraria migrar para node.js se eu não soubesse a resposta para ao menos metade dessas perguntas.

ps: esqueci de dizer que muitos mecanismos de busca precisam manter indices e chaves em memoria, as vezes uns 10% do total, para serem realmente eficientes. mais um motivo para isolar em maquinas diferentes ou então em containers/zones diferentes no minimo ( e se vc não sabe como SWAP ou OOM-Killer funcionam, por exemplo, se vc não sabe a diferença em gerenciamento de recursos entre Linux e BSD, eu acho que vc tem poucas chances de sucesso).

1 curtida

No lado servidor você pode olhar com mais cuidado para o java “nio”, canais não bloqueantes, e também ajustar um pool de conexões. Isso fara’ muita diferença, eu mesmo já usei java.nio com mais de 60 mil conexões simultâneas e fiquei impressionado com ele, sendo que a memoria tem a ver com criar objetos e destrui-los. Em relação a Java / Node.js(javascript) no lado servidor, Java tem uma base de desenvolvedores muito maior e mais madura. De qualquer forma seja qual for a sua decisão, “Bons Codigos”.