Bất kỳ endpoint trả về collection nào cũng cần giới hạn và định hình kết quả. Ba mối quan tâm — phân trang, lọc, sắp xếp — đều nằm trong query string.
Phân trang: offset vs cursor
Offset (theo trang) — ?page=3&limit=20 hoặc ?offset=40&limit=20.
Bất kỳ endpoint trả về collection nào cũng cần giới hạn và định hình kết quả. Ba mối quan tâm — phân trang, lọc, sắp xếp — đều nằm trong query string.
Offset (theo trang) — ?page=3&limit=20 hoặc ?offset=40&limit=20.
GET /orders?offset=40&limit=20 HTTP/1.1
Đơn giản và cho phép nhảy tới trang bất kỳ, nhưng có hai vấn đề khi quy mô lớn: OFFSET 100000 buộc database quét và bỏ 100k dòng (chậm), và nếu có dòng bị chèn/xoá giữa các request, các phần tử dịch chuyển khiến bạn thấy trùng lặp hoặc bỏ sót.
Cursor (keyset) — client truyền một con trỏ opaque tới phần tử cuối đã thấy.
GET /orders?limit=20&cursor=eyJpZCI6MTAyMH0 HTTP/1.1
HTTP/1.1 200 OK
{
"data": [ /* 20 orders */ ],
"page": { "next_cursor": "eyJpZCI6MTA0MH0", "has_more": true }
}
Server dịch cursor thành WHERE id > 1020 ORDER BY id LIMIT 20 — một truy vấn dùng index, nhanh ở mọi độ sâu và ổn định trước các thao tác chèn. Đánh đổi: không truy cập ngẫu nhiên tới "trang 500".
Offset → dataset nhỏ, admin UI, "nhảy tới trang N"
Cursor → feed lớn/vô hạn, dữ liệu real-time, cuộn trên mobile
GET /orders?status=shipped&min_total=100&sort=-created_at,id HTTP/1.1
status=shipped). Whitelist các field cho phép.sort; tiền tố - nghĩa là giảm dần (-created_at). Hỗ trợ nhiều khoá để thứ tự ổn định.limit (vd. tối đa 100) để client không thể yêu cầu cả triệu dòng.Đây là một trong những câu thiết kế API thực dụng nhất vì gần như mọi endpoint danh sách đều gặp phải, và lựa chọn có hệ quả hiệu năng thật. Người phỏng vấn thường dò đánh đổi offset-vs-cursor: ứng viên dùng offset ở mọi nơi chưa nếm nỗi đau OFFSET 1000000 quét cả bảng, hay bug "kết quả dịch chuyển" khi người dùng cuộn feed vô hạn thấy cùng một bài hai lần vì có bài mới được chèn. Cursor pagination sửa cả hai bằng cách biến truy vấn thành keyset lookup dùng index, đó là lý do mọi API quy mô lớn (Twitter, Stripe, Slack) dùng nó cho feed. Câu trả lời mạnh còn nhắc các lan can vận hành — whitelist field lọc/sắp xếp (tránh truy vấn không index và injection) và giới hạn limit (bảo vệ database) — điều tách người đã vận hành endpoint này trong production khỏi người chỉ đọc lý thuyết.
Thư viện câu hỏi phỏng vấn IT với đáp án chi tiết — từ Junior đến Senior.
Ủng hộ