Senior #async_hooks#asynclocalstorage#context#tracing
AsyncLocalStorage dùng để làm gì? Truyền context request không cần tham số
⚡ Trả lời nhanh
AsyncLocalStorage (async_hooks) giữ một store gắn với chuỗi thực thi bất đồng bộ, như thread-local của Node. Dùng để mang request id, user, tenant, transaction qua mọi await/callback mà không truyền tham số. Có chi phí nhỏ và store mất nếu bị vỡ context (một số thư viện dùng pool/queue).
const { AsyncLocalStorage } = require('node:async_hooks');
const als = new AsyncLocalStorage();
app.use((req, res, next) => {
als.run({ reqId: req.headers['x-request-id'] ?? crypto.randomUUID() }, next);
});
// Ở bất kỳ tầng sâu nào, kể cả sau await
async function repoQuery() {
await db.query('select 1');
console.log('reqId =', als.getStore()?.reqId);
}
Use case: logger tự gắn request id, multi-tenancy (tenant id), truyền transaction/unit of work, tracing (OpenTelemetry dùng cơ chế tương tự).
| Điểm cần nhớ | Ghi chú |
|---|---|
run(store, fn) | store tồn tại trong fn và mọi async con của nó |
enterWith | Đặt store cho phần còn lại của execution hiện tại; dễ rò context, hạn chế dùng |
| Mất context | Khi dùng connection pool/queue tự quản lý callback, hoặc thư viện callback cũ; dùng AsyncResource để bind |