Cách chạy SQLite trên production không lo rớt query

Cách chạy SQLite trên production không lo rớt query

Ổ NVMe giờ nhanh đến mức độ trễ mạng tới database còn chậm hơn cả bản thân cái query.

Một bài hướng dẫn kỹ thuật trên MicroLogics vừa chỉ cách tối ưu SQLite cho web server có độ truy cập đồng thời cao. Chạy SQLite trực tiếp bên trong process của app sẽ loại bỏ hoàn toàn độ trễ mạng, đẩy tốc độ thực thi query xuống dưới 1 millisecond. Mặc định, SQLite ưu tiên an toàn dữ liệu hơn là throughput, nên bạn sẽ cần chỉnh lại vài thông số trước khi đem ra gánh tải production thật.

Vì sao lại quan trọng: Các database dạng client-server truyền thống như PostgreSQL đều tốn độ trễ mạng cho mỗi query. SQLite bỏ qua bước qua mạng này, nhưng do dùng cơ chế single-writer (chỉ cho một tiến trình ghi tại một thời điểm), nếu không config lại thì khi có nhiều lệnh ghi cùng lúc sẽ bị văng lỗi SQLITE_BUSY. Tối ưu đúng cách sẽ giúp bạn đạt throughput ghi cực cao trên các mô hình edge single-tenant mà không cần thêm hạ tầng server phức tạp.

Tóm gọn lại các bước để đưa lên production:

  • Bật WAL mode: Chạy PRAGMA journal_mode = WAL; để các tiến trình đọc và ghi không còn block lẫn nhau.
  • Giảm nghẽn ổ đĩa: Dùng WAL kèm với PRAGMA synchronous = NORMAL; để chỉ ghi xuống đĩa vào những thời điểm thực sự cần thiết mà vẫn an toàn.
  • Set busy timeout: Thêm PRAGMA busy_timeout = 5000; để SQLite tự thử lại các lệnh ghi bị lock trong tối đa 5 giây thay vì báo lỗi ngay lập tức.
  • Tránh deadlock: Mở các tác vụ ghi bằng BEGIN IMMEDIATE TRANSACTION; để lấy lock ghi ngay từ đầu chứ không chờ đến giữa chừng transaction.

Hóa ra layer mạng DB nhanh nhất lại chính là... không dùng layer mạng nào cả.