Senior #streams#backpressure#buffer
Streams, backpressure và Buffer trong Node.js
⚡ Trả lời nhanh
Stream xử lý dữ liệu theo từng chunk nên dùng ít bộ nhớ với file/response lớn. Backpressure là cơ chế báo bên ghi chậm để bên đọc tạm dừng (write() trả false, chờ drain); pipeline() xử lý việc này và dọn lỗi. Buffer là vùng nhớ nhị phân kích thước cố định.
import { createReadStream, createWriteStream } from "node:fs";
import { pipeline } from "node:stream/promises";
import { createGzip } from "node:zlib";
await pipeline(
createReadStream("big.log"),
createGzip(),
createWriteStream("big.log.gz")
); // tự xử lý backpressure, đóng stream khi lỗi
Backpressure thủ công: if (!writable.write(chunk)) await once(writable, "drain"). Ngưỡng là highWaterMark (mặc định 16 KiB với byte stream, 16 object với object mode). pipe() cũng xử lý backpressure nhưng không tự dọn khi lỗi.
Buffer:
Buffer.from("xin chào", "utf8"),buf.toString("base64"),Buffer.concat([a, b]).Buffer.alloc(n)được xóa về 0;Buffer.allocUnsafe(n)nhanh hơn nhưng có thể chứa dữ liệu cũ trong bộ nhớ, chỉ dùng khi sẽ ghi đè hết.buf.lengthlà số byte, không phải số ký tự.