
Mục lục bài viết 9 phần
Hai request GraphQL có thể khác nhau hàng trăm lần về chi phí dù cùng endpoint và cùng HTTP status. Capacity test phải mô hình hóa query shape, resolver fan-out, cache, batching và quyền truy cập; RPS đơn lẻ dễ che N+1 hoặc một truy vấn sâu làm cạn CPU/database.
Bài viết giúp bạn
- Vì sao RPS không đủ cho GraphQL
- Topology và điều kiện đo
- Biến số phải kiểm soát
Vì sao RPS không đủ cho GraphQL
#GraphQL cho client chọn trường và quan hệ cần lấy. Một query nông có thể hit cache; query khác với nested collection tạo hàng nghìn resolver/database call. Batching còn cho phép nhiều operation/object trong một network request, nên rate limit chỉ theo HTTP request có thể đánh giá sai tải và rủi ro.
Test objective phải nêu user journey, schema version và delivery semantics. Đo query/mutation/subscription riêng; bài này tập trung query/mutation qua HTTP. Không suy kết quả sang subscription/WebSocket nếu chưa có workload riêng.
Topology và điều kiện đo
#Topology gồm load agent, CDN/WAF/API gateway, GraphQL server/federation gateway, resolver/service, cache và database. Gắn operation name, persisted-query hash, tenant/user class và correlation ID để nối client latency với trace/resolver/database.
Chuẩn bị dataset có cardinality đại diện: user ít/nhiều object, quan hệ sâu, cache nóng/lạnh và quyền khác nhau. Nếu dataset quá nhỏ, N+1 vẫn nhanh và cache hit gần tuyệt đối; kết quả sẽ không đại diện production.

Biến số phải kiểm soát
#Khóa schema/build, query document, variables, depth, field count, list size, batching, concurrency, cache state, authentication và rate-limit policy. Ghi rõ HTTP/1.1, HTTP/2, compression, keep-alive và client retry.
Tách cache warm/cold; DataLoader/batching bật/tắt chỉ khi đó là biến cần đo. Khóa autoscaling hoặc ghi lại event để không nhầm capacity mới xuất hiện với hiệu năng code. Generator phải được calibration về CPU, connection pool và response validation.
KPI và bằng chứng
#Đo operation throughput, latency p50/p95/p99, error theo GraphQL/HTTP, timeout, query complexity score, resolver count/time, database query count/time, cache hit, CPU/memory, queue và cost per operation. HTTP 200 vẫn có thể chứa errors; validator phải đọc response body.
N+1 được chứng minh bằng quan hệ giữa list size và số backend call, không chỉ latency. Lưu trace có sampling hợp lý, DB slow query, cache metric và client result. Với mutation, xác minh correctness/idempotency, không chỉ tốc độ.
- Workload: query phổ biến · Mục tiêu: baseline/capacity · KPI chính: p99, ops/s, cache hit · Guardrail: SLO ứng dụng
- Workload: nested list · Mục tiêu: phát hiện N+1 · KPI chính: resolver/DB calls · Guardrail: depth/list/complexity
- Workload: batch request · Mục tiêu: hiệu quả/rủi ro · KPI chính: operations/request, CPU · Guardrail: batch/object limit
- Workload: mutation · Mục tiêu: correctness dưới tải · KPI chính: success, duplicate, lock · Guardrail: auth/idempotency
- Workload: query bị cấm · Mục tiêu: xác minh protection · KPI chính: reject code/time · Guardrail: không chạy resolver
Ma trận workload và guardrail
#Kết hợp query shape (nhẹ/vừa/nặng), cache (hot/cold), user class, dataset cardinality và concurrency. Phân bổ theo production thay vì chạy 100% query nặng rồi gọi đó là capacity bình thường. Spike/soak test cần profile riêng.
Kiểm chứng depth limit, complexity limit, timeout, object limit và rate limit. OWASP lưu ý batching có thể làm một request chứa nhiều thao tác; vì vậy policy cần tính theo object/operation hoặc server time tùy thiết kế. Negative case phải xác nhận request bị chặn sớm và không tiếp tục tiêu thụ backend.
Test plan tải và failure
#- Kiểm tra schema/version, query corpus và dữ liệu thử.
- Chạy một user, validate field/error và trace end-to-end.
- Calibration generator; xác nhận không chạm giới hạn trước SUT.
- Baseline cache cold rồi warm với workload production mix.
- Tăng concurrency theo bậc, giữ query mix cố định.
- Tăng list cardinality để phát hiện N+1.
- Thử batch và query sâu trong phạm vi an toàn; kiểm tra guardrail.
- Làm chậm một dependency, quan sát timeout/circuit/retry.
- Chạy soak, theo dõi memory/connection leak.
- Reconcile mutation và rollback test data.
Checklist vận hành
#- Có operation name/persisted hash cho mọi query test.
- Validator đọc GraphQL errors, không chỉ HTTP code.
- Dataset/cardinality đại diện production.
- Theo dõi resolver và DB call để bắt N+1.
- Tách cache hot/cold và retry on/off.
- Rate limit tính đến batching/complexity.
- Negative query không tới resolver/backend.
- Secret/PII không đi vào trace và report.

Giới hạn của kết luận
#Kết quả gắn với schema, resolver, dataset, cache, quyền, service dependency và query mix đã đo. RPS cao với query nhẹ không chứng minh chịu được query nặng; query synthetic cũng không đại diện toàn bộ client thật.
Complexity score là heuristic do implementation quyết định, không phải đơn vị chuẩn chung. Guardrail quá chặt có thể chặn use case hợp lệ; quá lỏng gây resource exhaustion. Báo cáo phải ghi công thức/phiên bản policy.
Khái niệm cần nhớ
#- Resolver: Hàm lấy dữ liệu cho field GraphQL.
- N+1: Một truy vấn cha kéo theo nhiều truy vấn con lặp lại.
- Query complexity: Điểm ước lượng chi phí query theo rule của hệ thống.
- Batching: Gom nhiều operation/object trong một request hoặc batch resolver access.
- Persisted query: Query được nhận diện bằng hash thay vì gửi document đầy đủ.
- Cardinality: Số lượng phần tử/quan hệ ảnh hưởng fan-out.
Khái niệm cần nhớ
- DUT / SUT
- Thiết bị hoặc toàn bộ hệ thống đang là đối tượng của bài kiểm thử.
- Steady state
- Giai đoạn tải đã ổn định và đủ điều kiện để lấy số liệu đại diện.
- Pass / fail
- Kết luận dựa trên ngưỡng đã thống nhất, luôn đi cùng topology, cấu hình và điều kiện đo.
TÀI LIỆU ĐỐI CHIẾUTài liệu tham khảo4 nguồn +
Nội dung được biên soạn độc lập, theo hướng vendor-neutral và đối chiếu các tài liệu gốc dưới đây. Tính năng sản phẩm cần được kiểm tra lại theo phiên bản đang sử dụng.
NetVali ưu tiên nguồn tiêu chuẩn và tài liệu chính thức; phân biệt khuyến nghị triển khai với yêu cầu của tiêu chuẩn; không công bố thông số sản phẩm chưa gắn với phiên bản và điều kiện đo.
