</>
⌕
Senior #database#pool#postgres#performance

Connection pooling database trong Node.js: cỡ pool, leak và nhiều instance

⚡ Trả lời nhanh

Mở kết nối DB tốn kém nên dùng pool tái sử dụng. Cỡ pool nên nhỏ (vài chục) vì DB bị giới hạn max_connections; tổng = pool size x số instance phải thấp hơn giới hạn đó. Luôn release connection (finally), tránh giữ connection qua thao tác chậm, và dùng PgBouncer khi scale lớn.

const { Pool } = require('pg');
const pool = new Pool({
  max: 10,                       // mỗi process
  idleTimeoutMillis: 30_000,
  connectionTimeoutMillis: 2_000 // chờ lấy connection quá lâu thì lỗi, không treo
});

async function transfer(a, b, amt) {
  const c = await pool.connect();
  try {
    await c.query('BEGIN');
    // ... các câu lệnh dùng cùng c
    await c.query('COMMIT');
  } catch (e) { await c.query('ROLLBACK'); throw e; }
  finally { c.release(); }       // quên là leak, pool cạn
}
  • Transaction bắt buộc dùng cùng một connection; pool.query mỗi lần có thể lấy connection khác.
  • Tính toán: max_connections DB = 100, chạy 10 pod, mỗi pod max: 10 là đã chạm trần.
  • Pool đầy thì request xếp hàng chờ; tăng pool không giúp nếu bottleneck là DB.
  • Serverless/nhiều instance: dùng proxy pooling (PgBouncer, RDS Proxy).
🃏 Ôn bằng flashcard