Database connection pool trong Rails

Đăng bởi Lưu Đại vào ngày 09-04-2023

1. Database connection là gì? 

  • Mỗi khi app Rails cần thao tác với dữ liệu trong database thì nó sẽ sử dụng một kết nối với database. Kết nối này sử dụng phương thức TCP handshake và được gọi là Database connection.

2. Vấn đề với database connection.

  • Một trong những cách dùng đơn giản nhất của database connection là khi nào cần truy vấn vào database thì sẽ tạo một connection, sau khi dùng xong thì hủy nó đi. Tuy nhiên cách này tốn thời gian để tạo connection vô hình chung sẽ làm tăng thời gian query vào database lên. Nên người ta nghĩ ra cách là để sẵn một số N connections khi nào sử dụng thì sẽ dùng luôn những connection đang chờ sẵn mà không cần phải khởi tạo lại. 
  • Vấn đề mất thời gian khi tạo connection vào database đã được giải quyết. Tuy nhiên lại phát sinh câu hỏi là đặt số lượng connection chờ thế nào cho hợp lý. Bởi vì có những ứng dụng traffic chỉ tăng trong một thời điểm nhất định sau đó traffic sẽ giảm đi chỉ còn lèo tèo vài request mỗi ngày ví dụ như ứng dụng đăng ký học. Khi đó nếu để quá nhiều connection thì rất phí tài nguyên. Để giải quyết vấn đề này người ta đặt thời gian mà 1 connection có thể chờ (idle_timeout) nếu kết thúc khoảng thời gian chờ này mà connection vẫn chưa được sử dụng thì nó sẽ bị hủy. 
  • Trong trường hợp số lượng request lớn hơn số lượng connection tối đa đang chờ thì sao. Lúc này request này sẽ phải chờ cho tới khi một connection được nhả ra (thời gian chờ mặc định là 5s). Tuy nhiên nếu hết 5s mà không tìm thấy connection nó sẽ raise exception Timeout, nếu vấn đề xảy ra thường xuyên thì có 2 hướng giải quyết một là nâng thời gian timeout (không recommend) hoặc nâng connection pool (recommend)

3. Config database connection trong Rails.

Có thể config các thông số về connection trong file database.yml 
  • pool: Số lượng tối đa connection sẽ chờ request 
  • idle_timeout: Như giải thích trong phần vấn đề ý thứ 2 đây là thời gian tối đa một connection có thể chờ ở trong hàng chờ (mặc định 300s).
  • checkout_timeout: Như giải thích trong phần vấn đề ý thứ 3 đây là thời gian tối đa một request có thể chờ connection nếu hết thời gian này thì sẽ raise lỗi timeout (mặc định 5s).