Họ đang đo gì
Bạn có biện luận từ mẫu truy cập dữ liệu không, và có dám nói “ở quy mô của chúng ta thì Postgres là đủ” không.
Trả lời ngắn~30 giây
Mình chọn theo hình dạng truy vấn chứ không theo quy mô. Nếu dữ liệu được đọc theo đúng một khoá và không cần join thì kho khoá–giá trị hoặc document phù hợp hơn. Nếu bạn cần truy vấn tuỳ ý, ràng buộc, và transaction nhiều bảng thì Postgres thắng, và nó chịu được lưu lượng cao hơn nhiều so với người ta tưởng. Ngưỡng thật hay gặp không phải “dữ liệu quá lớn” mà là “ghi vượt khả năng của một node”.
Giải thích sâu
Điều đáng nói là phần lớn hệ thống không bao giờ chạm ngưỡng đó. Một node Postgres cỡ vừa xử lý được hàng nghìn giao dịch mỗi giây và hàng terabyte dữ liệu; nếu bạn chưa đo mà đã chọn Cassandra vì “sau này sẽ lớn”, bạn đang trả trước cái giá của mô hình dữ liệu cứng nhắc để mua một thứ có thể không bao giờ cần. Đây là quyết định khó đảo ngược nhất trong kiến trúc, nên đáng để trì hoãn.
Khi NoSQL thật sự đúng, lý do thường rất cụ thể. Cassandra khi bạn cần ghi cực cao và chấp nhận truy vấn chỉ theo khoá phân mảnh đã định trước. Redis khi truy cập là khoá–giá trị nóng, dữ liệu có thể mất được. Elasticsearch khi bài toán là tìm kiếm toàn văn và xếp hạng theo độ liên quan. MongoDB khi tài liệu thật sự không đồng nhất và bạn đọc theo cả cụm. Mỗi cái đổi một thứ cụ thể lấy một thứ cụ thể.
Điều ứng viên hay bỏ sót: Postgres đã lấn sang phần lớn các trường hợp đó. jsonb với index GIN cho bạn document store có transaction; pg_trgm và full-text search phủ được tìm kiếm mờ ở quy mô vừa; LISTEN/NOTIFY và SKIP LOCKED làm hàng đợi ổn. Nói ra điều này cho thấy bạn đánh giá theo năng lực hiện tại của công cụ, chứ không theo bảng so sánh của năm 2014.
Câu hỏi tiếp theo họ sẽ hỏi
?Vậy khi nào Postgres thật sự hết đường?
Khi lưu lượng GHI vượt một node và bạn không phân mảnh được theo nghiệp vụ; khi bạn cần ghi đa vùng địa lý với độ trễ thấp; hoặc khi mô hình thật sự là chuỗi thời gian/đồ thị ở quy mô lớn. Đọc thì mở rộng bằng replica dễ hơn nhiều so với ghi.
?Dùng cả hai thì sao?
Rất phổ biến và hợp lý — Postgres làm nguồn sự thật, Redis làm cache, Elasticsearch làm tìm kiếm. Giá phải trả là đồng bộ giữa chúng, và đó là chỗ sinh bug: dữ liệu lệch nhau khi một bên ghi thành công còn bên kia thì không. Outbox pattern là cách xử lý phổ biến.
Trả lời thế này là mất điểm
- “NoSQL mở rộng tốt hơn” như một mệnh đề chung. Mở rộng cái gì? Đọc, ghi, hay dung lượng — ba thứ này mở rộng theo ba cách khác nhau.
- “Không cần schema nên phát triển nhanh hơn”. Schema vẫn tồn tại, chỉ là nó chuyển vào code ứng dụng và không ai kiểm tra được nó.
Nguồn
- PostgreSQL — JSON Types và index GIN cho `jsonb`
- Martin Kleppmann, Designing Data-Intensive Applications, ch. 2 — mô hình dữ liệu chọn theo mẫu truy cập