System Design

Connection pool: 45ms mở kết nối mới vs. 0,2ms mượn lại

Tóm tắt

Mỗi kết nối mới tới database phải qua bắt tay TCP, TLS và xác thực — khoảng 45ms trong video. Connection pool giữ sẵn một nhóm kết nối để mượn lại trong ~0,2ms. Khi lưu lượng vượt số kết nối trong pool, request phải chờ đến lượt.

Ba tình huống

Tình huốngThời gian lấy kết nốiGhi chú
Không có pool~45ms mỗi requestTCP → TLS → AUTH lặp lại mỗi lần
Có pool, tải nhẹ~0,2msMượn lại kết nối có sẵn, không bắt tay lại
Burst 14 request, pool 4 kết nối10ms, 20ms, 30ms…10 request xếp hàng chờ kết nối rảnh

Hết burst, các kết nối rảnh bị đóng theo idle timeout.

Áp dụng thế nào?

  • Luôn dùng pool cho ứng dụng có lưu lượng ổn định (HikariCP cho Java, pgBouncer cho PostgreSQL, pool có sẵn trong hầu hết ORM).
  • Pool to hơn chưa chắc nhanh hơn: database có giới hạn kết nối; quá nhiều kết nối làm DB chậm vì tranh chấp tài nguyên.
  • Đo “thời gian chờ lấy kết nối” như một chỉ số riêng — nó tăng là dấu hiệu pool quá nhỏ hoặc query giữ kết nối quá lâu.
  • Serverless: mỗi instance có pool riêng dễ làm cạn kết nối DB — dùng proxy như RDS Proxy hoặc pgBouncer.