O que é armazenamento local assíncrono no Node.js. v14?

server.listen(1337).on('request', (req) => {
  // some synchronous operation (save state)
  // some asynchronous operation
  // some asynchronous operation
})

Considere esta sequência de eventos:

  1. O usuário 1 acessa o servidor na porta 1337
  2. O nó começa a executar o código de operação síncrona
  3. Enquanto o nó estava executando esse código síncrono, outro Usuário 2 atinge o servidor.
  4. O nó continuaria executando o código síncrono, enquanto isso, a solicitação para processar a segunda solicitação HTTP está aguardando na fila de tarefas.
  5. Quando o Nó termina a parte da operação síncrona e chega à parte da operação assíncrona, ele o joga na fila de tarefas e começa a processar a primeira tarefa na fila de tarefas – a segunda solicitação HTTP.
  6. Desta vez, ele está executando esse trecho de código síncrono, mas em nome da solicitação do Usuário 2. Quando esse código síncrono para o Usuário 2 é concluído, ele retoma a execução assíncrona do Usuário 1 e assim por diante.

Agora, e se você quiser persistir dados específicos com esse usuário específico sempre que o código assíncrono específico a eles estiver sendo chamado? Aqui é quando você usa AsyncStorage – armazenamento para fluxos assíncronos no Nó.

Considere este exemplo diretamente dos documentos oficiais:

const http = require('http');
const { AsyncLocalStorage } = require('async_hooks');

const asyncLocalStorage = new AsyncLocalStorage();

function logWithId(msg) {
  const id = asyncLocalStorage.getStore();
  console.log(`${id !== undefined ? id : '-'}:`, msg);
}

let idSeq = 0;
http.createServer((req, res) => {
  asyncLocalStorage.run(idSeq++, () => {
    logWithId('start');
    // Imagine any chain of async operations here
    setImmediate(() => {
      logWithId('finish');
      res.end();
    });
  });
}).listen(8080);

http.get('http://localhost:8080');
http.get('http://localhost:8080');
// Prints:
//   0: start
//   1: start
//   0: finish
//   1: finish

Este exemplo está mostrando nada além da “aderência” do idSeq com a respectiva solicitação. Você pode imaginar como o Express preenche o objeto “req.session” com o usuário correto todas as vezes, em uma etapa semelhante, essa é uma API de baixo nível usando uma construção de nível inferior no Node chamada async_hooks que ainda é experimental, mas é muito legal saber!

atuação

Antes de começar a lançar isso na produção, cuidado com o fato de que isso não é algo que eu realmente recomendo a todos, se não for absolutamente loucamente necessário. Isso ocorre porque o desempenho do seu aplicativo não é desprezível. Isso ocorre principalmente porque a API subjacente do async_hooks ainda é um WIP, e a situação deve melhorar gradualmente.

Conclusão

É basicamente isso! Uma breve introdução muito simples ao que é o AsyncStorage no Nó 14 e qual é a ideia geral de alto nível para ele. Se você quiser aprender tudo sobre os novos recursos do Node.js, confira este vídeo para isso:

Ademais, se você é um adaptador inicial, experimente codedamn – uma plataforma para os desenvolvedores aprenderem e se conectarem. Estive lançando alguns recursos interessantes para você experimentar! Fique ligado.

Paz!