Série Node.js: O tal do log…

Oi!

[English Version]

Esta é a parte 3 de uma série de posts dedicados a documentar minhas experiências ao adotar o Node.js na empresa, para que as pessoas possam aprender com meus erros e ter uma boa vantagem em seus próprios esforços. Se você gostaria de ver as postagens anteriores, visite-as aqui , aproveite e deixe-me saber o que você pensa!

Logar é extremamente importante, isso você já sabia. Eu passei os últimos 10 anos de minha carreira lidando com ferramentas de integração que não eram exatamente de alto desempenho, não eram exatamente tolerantes com o seu dinheiro em infraestrutura e especialmente em licenciamento, mas cara, elas podem logar. Tanto que a maioria das equipes de banco de dados que lida com esses produtos possuem batches de limpeza semanais, se não diários, para que possam acompanhar a quantidade de informações, a maior parte delas, na verdade, desnecessárias, que esses produtos criam.

Lidar com codificação convencional exige que sua equipe esteja sempre ciente de o quão importante é registrar os passos de seus processos e, considerando que a equipe era, assim como eu, proveniente da linguagens de produtos privados, levou um pouco de tempo para perceber exatamente quanto log era muito básico e quanto era demais. Você vai encontrar vários artigos sobre isso na web, mas no final o seu negócio quem irá na maioria das vezes ditar o que você pode registrar, o que você deveria e o que você definitivamente deve registrar. Nosso negócio realmente exige bastante registro de logs pesados ​​e eles devem ser mantidos por alguns anos, então precisávamos de uma ferramenta simples, mas de alta capacidade para aceitar nossos logs e armazená-los com segurança.

É exatamente quando winston logging chegou ao nosso playground, como eles mesmos dizem, um logger para quase tudo. Winston é uma ferramenta de registro muito confiável, mas há algumas coisas que você deve considerar antes de instalar no npm e forçá-lo ao seu ambiente de produção, e essas são as opções que eu quero lhe contar.

Logo de cara, você verá que o winston lhe apresenta exemplos muito bons e simples de registro em arquivos, e mesmo que isso possa atender a maioria, quando você está lidando com os micro-serviços de alta concorrência apresentados em soluções corporativas, o log de arquivos provavelmente não será a melhor escolha para você.

Ao longo da minha carreira, vi muitas empresas confiarem apenas na solução de registro de arquivos, levando-as a verem seus sistemas não apenas sobrecarregados com alta throughput, mas também sendo forçados a investir em dispositivos de armazenamento incrivelmente caros, porque falharam em prever esta situação ou simplesmente em rever a estratégia.

Provedores na nuvem são especialmente inflexíveis com esse tipo de estratégia, se você é preguiçoso em definir como você usa seus recursos, espere GRANDES faturas no final do mês.

O Winston, no entanto, está preparada para que a maioria das pessoas não o considere uma solução pronta para a empresa, por isso desenvolveram o conceito de Transportes. Então, quando você importa o seu winston no código assim:


const winston = require ("winston");

[/código]

Você também terá que assinar um ou mais transportes, como o de arquivos neste exemplo:



const logger = winston.createLogger({
  level: 'debug',
  format: winston.format.json(),
  transports: [
    new winston.transports.File({ filename: 'output.log' })
  ]
});

E essa é a beleza disso, neste momento você pode escolher a ferramenta favorita que receberá seus dados. E eles têm uma ampla variedade de Transportes disponíveis para você escolher aqui . No entanto, foi o meu caso que o desenho da solução não se encaixaria a nenhum desses, não que eles não fossem bons, mas como eu disse, essa ferramenta permite uma grande flexibilidade e como eu tinha um modelo de solução que exigiria um servidor de mensagens recebendo o logs, eu não tive que mudar a ideia, só tinha que personalizar o meu próprio transporte, e eu o fiz para o RabbitMQ.

Esse caminho foi escolhido porque pretendia uma pequena transformação de dados nos logs antes do armazenamento e não queria ver meu desempenho de serviços degradado por elas, então meus logs foram direcionados para uma instância RabbitMQ. Se você acha que sua solução pode precisar disso, faça o download aqui mesmo , se precisar um pouco de personalização, sinta-se à vontade para fazer um fork aqui.

Caso você esteja se perguntando onde é o último local de descanso dos meus logs, é uma instância do MongoDB, onde é muito fácil pesquisar. Você, no entanto, pode precisar de uma solução diferente! Deixe-me saber como você resolveu isso comentando!

Esse foi outro episódio da nossa cruzada para a migração Node.js, para saber mais e manter-se atualizado sobre esta série, por favor, siga-me no twitter em @vrsbrazil .

Obrigado!

Série Node.js: Escolhendo o web container ou, na verdade, nem mesmo tendo um

Olá de novo e bem vindo!

[English Version]

Este é o segundo post da minha “Série Node.js”, então, se você não leu o primeiro post, aqui está, aproveite!

Então, como mencionado no post anterior, muitos problemas foram encontrados quando decidimos nos aprofundar no mundo do #NodeJS. Vindo de um mundo Java / SOA, o pouso no paradigma microservices e #NodeJS não é exatamente tão suave como se deve imaginar e isso não é culpa de #NodeJS ou de microservices! Ah não! A questão é que nos acostumamos tanto à verbosidade e impraticabilidade de linguagens enterprise, que a simplicidade pode, na verdade, parecer juvenil ou até errada.

Minha primeira visão disso aconteceu quando comecei a procurar pelo que conhecia como Web Containers, apesar de Java e .Net hoje em dia já ofereçam uma ampla variedade de frameworks onde você não precisa de um contêiner web para ver seus códigos atendendo a solicitações HTTP, é ainda mais comumente visto nas empresas instâncias muito grandes de contêineres Web e servidores de aplicativos em execução, e ninguém deve ser surpreendido com isso. As soluções Cloud serverless estão crescendo mais e mais, no entanto a maioria ainda não conseguiu encontrar o equilíbrio correto para suas próprias empresas implementá-las, resultando em contas incrivelmente altas no final do mês ou simplesmente assistindo suas aventuras na nuvem falharem por falta de conhecimento ou planejamento.

Isso não poderia acontecer agora, então mesmo que o serverless seja nosso objetivo desde o início, foi a decisão da equipe apostar na estratégia de instâncias reservadas, já que isso já era algo de conhecimento comum em todas as equipes de infraestrutura e desenvolvimento. O que isso significava era que uma maneira de executar esses códigos #NodeJS em uma instância reservada tinha que ser encontrada e, depois de algumas pesquisas, uma estrutura de simplicidade surpreendente chamava minha atenção, o framework #ExpressJS. O código abaixo foi exatamente o primeiro código que eu executei para os meus testes. O objetivo do código era simples: obter um serviço HTTP / REST para responder a uma chamada. O que obtive foi isso:


var express = require('express');
var app = express();

app.get('/hello', function (req, res) {
  res.send('Hello! Servidor em operação!!');
});

app.listen(3000, function () {
  console.log('Online on port 3000!');
});

É isso, sério.

Isso não é apenas o código que usei na minha primeira tentativa, na verdade é a solicitação que ainda uso para verificar se meus servidores estão ativos.

Minha segunda bem recebida surpresa foi o quanto de memória virtual custou para o código ser executado. Eu acabo de rodar o código aqui para que eu pudesse obter número exato: 12MB

Na verdade, você pode executar basicamente o mesmo código sem usar #ExpressJS, mas o que faz você querer usar #ExpressJS é a quantidade de serviços que eles fornecem em sua API muito ampla. Vale a pena. E é grátis e de código aberto! Vá conferir!

Estava bem claro agora que com a simplicidade deste código, muito poderia ser entregue com um prazo razoável.

Esse certamente não foi o único problema que enfrentamos em nossa missão. Muito mais tinha que ser descoberto.

Por favor, siga-me na minha conta do Twitter recentemente reaberta @vrsbrazil para que você possa ficar sabendo do resto de nossos esforços com #Microservices e #NodeJS.

Obrigado!

Por que escolhemos #NodeJS

[English Version]

Primeiro de tudo é importante entender que eu nunca fui um fã de javascript. Sempre considerei uma linguagem incompreensível e vacilante que está sempre tentando apunhalá-lo pelas costas assim que você começa a confiar nela.

Também nunca fui fã de programação de front-end, então qualquer linguagem que remotamente me lembre de montar uma tela é como água e óleo, então você pode ver que para isso funcionar, a linguagem REALMENTE precisava me animar para ser levada em consideração.

No entanto, assim que fui contratado para a empresa para a qual trabalho atualmente, me foi dada a difícil tarefa de definir uma tecnologia que não só reduziria os custos operacionais e de desenvolvimento, como também precisaria reunir o que era na época, duas equipes bem separadas de desenvolvedores Java / Oracle SOA e .Net que, pelo que me foi dito na época, apesar de em pouco tempo perceber que essa era uma impressão muito errada, não apenas não concordavam muito, mas não estavam extremamente inclinados a aprender novas tecnologias.

Nunca tinha ouvido falar do #NodeJS antes, então eu nem sabia por onde começar. Trabalhei com Java antes deste trabalho por cerca de 18 anos, então você pode imaginar que a minha opinião sobre Java ou .Net seria altamente tendenciosa, o que significa que não poderia ser uma opção. Alguma pesquisa estava definitivamente no meu horizonte.

Muitas línguas foram consideradas e mesmo que eu ainda esteja mantendo Python como minha escolha para o futuro próximo em nossos esforços de ML, poucas línguas realmente chamaram minha atenção, até que decidi, como uma das demandas também era redução custos, buscar soluções PAAS em nuvem e acabei esbarrar em muitos provedores de serviços cloud que oferecem hospedagem de baixo custo em serviços de javascript, o nome #NodeJS apareceu pela primeira vez. Como pode ser, eu pensei comigo mesmo, o javascript não é uma linguagem de solução corporativa, seria preciso ser louco para escolher uma coisa dessas!

Mesmo ainda sendo muito cético sobre isso, decidi abordar todos os desenvolvedores em ambos os grupos distintos para que pudesse ver quantos deles tinham usado ou ainda usam o javascript diariamente, e, como você pode imaginar, não foi difícil descobrir muitos deles não só tinham conhecimento prévio mas alguns deles estavam até fazendo suas próprias experiências #NodeJS em seus projetos pessoais.

Depois de muita codificação para provar a mim mesmo que poderia realmente ser uma boa aposta. Com a ajuda do livro listado abaixo, além de mais documentos e contribuições que a comunidade de código aberto publica constantemente, é importante mencionar aqui o Rising Stack, o grupo de diretores decidiu que valeu a pena tentar o nosso primeiro projeto.

Obviamente, houveram muitos problemas na estrada, muitas lições aprendidas, mas, uma vez que o projeto estava online, o desempenho da solução foi tão impressionante, a necessidade de poder de processamento tão generoso que não demorou muito para outros gerentes de projeto entrarem em contato com nossa equipe para que eles também pudessem usar a solução em suas próprias demandas.

Nas próximas semanas, meu plano é enviar muito mais posts sobre os problemas que tivemos, as soluções que encontramos usando o poder da comunidade open source, os produtos que decidimos usar e como eles se comportaram no mundo real.

Por favor, siga-me no Twitter em @vrsbrazil para que você possa ver como o primeiro projeto evoluiu e muito mais.

Obrigado.

Vinícius Santos