Compartilhamento de contexto de recurso assíncrono significa compartilhar dados de contexto dentro de um ciclo de vida de solicitação de rede ou cadeia de chamada de recurso assíncrona.
Antes de responder a esta pergunta, devemos primeiro entender o que são recursos assíncronos.
Recursos assíncronos podem ser entendidos como objetos com retornos de chamada, como, entre outros, Promises, Timeouts, TCPWrap, UDP, etc. Consulte a lista de tipos de recursos assíncronos para obter detalhes.
A definição oficial é a seguinte:
Um recurso assíncrono representa um objeto com um retorno de chamada associado. Este retorno de chamada pode ser chamado várias vezes, como o evento 'connection' em net.createServer(), ou apenas uma única vez como em fs.open. ().Um recurso também pode ser fechado antes que o retorno de chamada seja chamado.
Aqui apresentamos AsyncLocalStorage, a solução de compartilhamento de contexto assíncrono fornecida oficialmente pelo Node.js. Este recurso ainda era um recurso experimental antes da versão 16.4.0 e está estável desde a versão 16.4. .0.
AsyncLocalStorage pode compartilhar dados em uma cadeia de operações assíncronas.
A instância de AsyncLocalStorage asyncLocalStorage possui os seguintes métodos principais:
exemplo:
const store = { id: 1 }; //Substitui a loja anterior pelo objeto de loja fornecido asyncLocalStorage.enterWith(loja); asyncLocalStorage.getStore(); // Retorna o objeto armazenado someAsyncOperation(() => { asyncLocalStorage.getStore(); // Retorna o mesmo objeto });
O primeiro parâmetro da função asyncLocalStorage.run() é armazenar os dados compartilhados que precisamos acessar na chamada assíncrona, e o segundo parâmetro é uma função assíncrona.
Veja a seguir um exemplo para demonstrar como usar AsyncLocalStorage para implementar o compartilhamento assíncrono de contexto de recursos:
Saída:
runA 8f19ebef-58d7-4b1a-8b9b-46d158beb5d2 2022/5/24 20:26:17 esta é uma mensagem de log runB 8f19ebef-58d7-4b1a-8b9b-46d158beb5d2 2022/5/24 20:26:17 esta é uma mensagem de log
Na mesma função assíncrona executada por meio de asyncLocalStorage.run, as funções runA e a função runB serão executadas, e runA e runB podem ser acessado aos mesmos dados de contexto.
AsyncLocalStorage fornece uma excelente travessia para implementarmos facilmente o compartilhamento de contexto de recursos assíncronos em Node.js, mas cada operação de recursos assíncronos acionará ganchos assíncronos, o que inevitavelmente terá um certo impacto no desempenho de nosso aplicativo Node. Então, quão grande é o impacto?
De acordo com uma medição real da Kuzzle, o uso do AsyncLocalStorage causará perda adicional de desempenho de cerca de 8%. É claro que diferentes cenários de negócios podem ter desempenho diferente. Se você está preocupado com esta parte do desempenho, também pode adicionar testes comparativos ao seu negócio para testar o impacto específico no desempenho.
---- | Log com | AsyncLocalStorage | Registrar |
---|---|---|---|
req/s | de diferença clássica2613 | 2842 | ~8% |
Em outras linguagens multithread, cada HTTP cria um novo thread e cada thread tem sua própria memória. Você pode armazenar o estado global na memória do thread e recuperar o estado global de qualquer lugar do seu código.
No Node.js, como o Node.js é de thread único e compartilha memória entre todas as solicitações HTTP, cada solicitação HTTP não pode conter um estado global isolado um do outro.
AsyncLocalStorage pode isolar efetivamente o status entre diferentes operações assíncronas e desempenha um papel muito importante em cenários como rastreamento de solicitação HTTP, ferramentas APM, rastreamento de log de contexto e rastreamento de log de link completo baseado em solicitação.