server.listen(1337).on('request', (req) => {
// some synchronous operation (save state)
// some asynchronous operation
// some asynchronous operation
})Considere esta sequência de eventos:
- O usuário 1 acessa o servidor na porta 1337
- O nó começa a executar o código de operação síncrona
- Enquanto o nó estava executando esse código síncrono, outro Usuário 2 atinge o servidor.
- 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.
- 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.
- 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: finishEste 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!
