Async Hook

Diego Telles
Diego Telles
Published in
4 min readJul 8, 2019

O módulo async_hooks chegou no node 8v e ainda encontra-se em fase experimental nos dias de hoje com a versão 12.

Vou responder umas perguntas aqui que me fiz antes de estudar sobre esse recurso:

  • O que éasync_hooks?
  • Onde usar async_hooks
  • Porque usar async_hooks
  • Vantagens x Desvantagens

Let’s the talk…

O async_hooks facilita o rastreamento de recursos com facilidade e fornece uma API para registrar callback's rastreando o tempo de
vida dos recursos que foram criados dentro de qualquer aplicação em Node.js.

Legal, mas o que isso faz de incrível?
Bom…Podemos ver como nossa aplicação se comporta por completo e medir o tempo de execução que cada chamada realiza e poder tomar as medidas cabíveis para a melhoria de cada uma delas.

Pense como seria monitorar sua aplicação usando o debbug do navegador

Aba: Performace (Google Chrome)

Ou poderiamos usar o domain do node, mas infelizmente (ou felizmente) ele está deprecado

Domain deprecated

Mas como funciona o async_hooks ?

Imagina que voce tem uma api, melhor vamos criar uma servidor aqui e retornar um Hello Word.
Fariamos dessa forma:

Start server in nodejs

Com isso só teremos a informação de retorno que é nosso Hello World, mas se nós quisermos trabalhar com o async_hooks podemos fazer assim (ou de outras formas):

Nesse trecho de código, alem de iniciar nosso servidor com o Hello Word, temos a saida no terminal:

Output

Você começa inicializando-o com um objeto de callbacks: init, before, after e destroy.

const async_hooks = require('async_hooks')const hooks = {
init: init,
before: before,
after: after,
destroy: destroy
}
const async_hook = asyncHooks.createHook(hooks)

Onde na nossa saída:
TCPSERVERWRAPé o servidor que recebe as conexões.
TickObject é o ID do evento assíncrono.
TCPWRAPé a nova conexão do cliente.
TIMERWRAP o tempo que recebe as conexões.
HTTPPHASER Processar as informações
TIMEOUT fim do processo

Temos outros types também que vocês podem achar na Documentação, eles são:

FSEVENTWRAP, 
FSREQCALLBACK,
GETADDRINFOREQWRAP,
GETNAMEINFOREQWRAP,
HTTPINCOMINGMESSAGE,
HTTPCLIENTREQUEST,
JSSTREAM,
PIPECONNECTWRAP,
PIPEWRAP,
PROCESSWRAP,
QUERYWRAP,
SHUTDOWNWRAP,
SIGNALWRAP,
STATWATCHER,
TCPCONNECTWRAP,
TCPSERVERWRAP,
TCPWRAP,
TTYWRAP,
UDPSENDWRAP,
UDPWRAP,
WRITEWRAP,
ZLIB,
SSLCONNECTION,
PBKDF2REQUEST,
RANDOMBYTESREQUEST,
TLSWRAP,
Microtask,
Timeout,
Immediate,
TickObject

O typeé uma cadeia que identifica o tipo de recurso que causou inita ser chamado. Geralmente, corresponderá ao nome do construtor do recurso.

Há também o tipo de recursoPROMISE, que é usado para rastrear Promise instanciadas e trabalhos assíncronos programados por eles.

  • Para habilitar os retornos de chamada, você deve usar:
async_hook.enable ();
  • Para desativar os retornos de chamada, você deve usar:
async_hook.disable ();

O nosso init() temos como argumentos asyncId, type ,triggerId e resource, cada um deles é responsável por algo:

* asyncId é nosso ID exclusivo para cada recurso assíncrono.
* type identificar qual tipo de recurso fará com que a função init() seja chamada.
* triggerId é o novo recurso a ser chamado.
* resource é o objeto que representa o recurso assíncrono real que foi inicializado.

O async_hooks é baseado em um conceito de recursos. Um recurso dispara callbacks async_hooks de cima para serem chamados, e pode ser qualquer coisa de TTYWRAP para SSLCONNECTION para aquele que você definiu com a API do Embedder.

Se você quiser operações com tempo voce pode usar o on-async-hook que vai te devolver o tempo de execução de cada step da sua aplicação. (Fica para um próximo artigo).

Concluindo:

* A vantagem é que você pode monitorar sua aplicação inteira e fazer monitoramento de promise usando o seu próprio type, pode também ter um controle de quanto está consumindo de tempo e memória.

  • Uma das desvantagens é o uso da CPU que ainda pode ser alto dependendo do tamanho da sua aplicação, o que acaba tornando inviável o uso do async_hooks, mas podemos controlar o uso dele com os métodos enable/disabled, mais um ponto negativo é o fato desse modulo estar em versão experimental onde tudo pode mudar, pode ser que numa próxima release os nomes dos métodos mudem por completo.

Espero que tenham gostado desse pequeno artigo que fala como e para que serve o async_hooks .

--

--

Diego Telles
Diego Telles

Pós-graduando em IA, exp. em NodeJs e IoT, palestrante, voluntário na Mozilla e fundador da @JScriptWorld e @NodeREDBrasil .