DOCS

Giới hạn tốc độ GraphQL API

Giới hạn tốc độ GraphQL API

Tìm hiểu cách Zonos tính chi phí truy vấn dựa trên độ phức tạp.

Zonos giới hạn tốc độ các yêu cầu GraphQL API dựa trên độ phức tạp của truy vấn thay vì số lượng yêu cầu. Điều này đảm bảo sử dụng công bằng trong khi cho phép bạn yêu cầu chính xác dữ liệu bạn cần.

Tại sao giới hạn tốc độ dựa trên độ phức tạp? 

API REST truyền thống sử dụng giới hạn tốc độ dựa trên yêu cầu trong đó mỗi yêu cầu tiêu thụ cùng một số tín chỉ, cho dù bạn tìm nạp một trường hay hàng trăm, và cho dù bạn đọc hay sửa đổi dữ liệu—mặc dù có sự khác biệt đáng kể về tải máy chủ.

Phương pháp giới hạn tốc độ dựa trên độ phức tạp của truy vấn GraphQL giải quyết vấn đề này bằng cách tính chi phí dựa trên dữ liệu thực tế được yêu cầu và các hoạt động được thực hiện. Điều này cung cấp cho bạn linh hoạt hơn để yêu cầu những gì bạn cần trong khi cung cấp tải máy chủ có thể dự đoán được.

Giới hạn tốc độ 

Zonos sử dụng hệ thống dựa trên điểm trong đó mỗi truy vấn trừ điểm dựa trên độ phức tạp của nó. Bạn có một bể các điểm có sẵn mà:

  • Được lấp đầy lại với 3.000 điểm mỗi giây (30.000 điểm mỗi 10 giây)
  • Có dung lượng tối đa là 300.000 điểm

Điều này cho phép bạn thực hiện các đợt truy vấn phức tạp thỉnh thoảng trong khi duy trì tốc độ yêu cầu bền vững.

Cách tính chi phí truy vấn 

Mỗi yêu cầu GraphQL có chi phí được tính trước khi thực thi:

Chi phí cơ bản

  • Truy vấn: 5 điểm
  • Mutation: 10 điểm
  • Đối tượng: 1 điểm cho mỗi đối tượng được trả về
  • Trường vô hướng: 0 điểm (miễn phí)

Các trường vô hướng như chuỗi, số nguyên, ID và boolean không thêm chi phí. Bạn chỉ trả tiền cho hoạt động cơ bản và các đối tượng được trả về.

Ví dụ: Truy vấn đơn giản

1query {
2 landedCost(id: "123") {
3 id
4 createdBy
5 shipToCountry
6 }
7}

Phân tích chi phí: 5 (truy vấn cơ bản) + 1 (đối tượng chi phí hạ cánh) = 6 điểm

Các trường vô hướng (id, name, currency) là miễn phí.

Ví dụ: Truy vấn với nhiều đối tượng

1{
2 orders(first: 10, filter: { status: COMPLETED }) {
3 edges {
4 cursor
5 node {
6 id
7 }
8 }
9 }
10}

Phân tích chi phí: 5 (truy vấn cơ bản) + 10 (10 đơn hàng × 1 điểm mỗi) = 15 điểm

Ví dụ: Mutation

1mutation {
2 landedCostCalculate(input: { ... }) {
3 id
4 }
5}

Phân tích chi phí: 10 (mutation cơ bản) + khoảng 50 (đối tượng được trả về) = 60 điểm

Một phép tính chi phí hạ cánh điển hình có chi phí khoảng 60 điểm về độ phức tạp.

Xem độ phức tạp truy vấn 

Mỗi phản hồi API bao gồm tiêu đề zonos-query-complexity cho biết chi phí truy vấn của bạn:

1zonos-query-complexity: 58

Tiêu đề này cho bạn biết chính xác bao nhiêu điểm truy vấn đã tiêu thụ. Sử dụng nó để theo dõi sử dụng API của bạn và tối ưu hóa các truy vấn tốn kém.

Xử lý giới hạn tốc độ 

Nếu bạn vượt quá giới hạn tốc độ của mình, bạn sẽ nhận được thông báo lỗi. Để xử lý hiệu quả các giới hạn tốc độ:

Theo dõi độ phức tạp của bạn

Kiểm tra tiêu đề zonos-query-complexity trong các phản hồi để hiểu chi phí truy vấn của bạn và xác định các mẫu tốn kém.

Thực hiện logic thử lại

Nếu bạn chạm đến giới hạn tốc độ, hãy thực hiện logic thử lại và quay lại theo cấp số nhân. Vì bể tái lấp đầy ở 3.000 điểm mỗi giây, hãy tính thời gian chờ thích hợp dựa trên độ phức tạp truy vấn của bạn.

Hàng loạt hiệu quả

GraphQL cho phép bạn yêu cầu nhiều truy vấn trong một yêu cầu duy nhất:

1{
2 landedCost(id: "landed_cost_123") {
3 id
4 createdAt
5 }
6 order(orderId: "order_123") {
7 id
8 status
9 createdAt
10 }
11}

Các phương pháp hay nhất 

Chỉ yêu cầu những gì bạn cần

Độ phức tạp truy vấn tỷ lệ thuận với dữ liệu bạn yêu cầu. Cấu trúc truy vấn của bạn để chỉ tìm nạp các trường và đối tượng bạn sẽ thực sự sử dụng.

1query {
2 order(orderId: "order_123") {
3 id
4 status
5 createdAt
6 updatedAt
7 items {
8 id
9 name
10 quantity
11 amount
12 }
13 shipments {
14 id
15 }
16 }
17}

Phân trang tập dữ liệu lớn

Khi yêu cầu nhiều đối tượng, hãy sử dụng kích thước trang hợp lý:

1{
2 orders(first: 100, filter: { status: COMPLETED }) {
3 edges {
4 cursor
5 node {
6 id
7 }
8 }
9 }
10}

Yêu cầu 10-50 mục tại một thời điểm và phân trang qua các kết quả khi cần, thay vì yêu cầu hàng trăm đối tượng trong một truy vấn duy nhất.

Tránh lồng không cần thiết

Mỗi đối tượng lồng nhau thêm vào độ phức tạp của bạn. Chỉ yêu cầu dữ liệu lồng nhau khi bạn thực sự cần nó.

Trang này có hữu ích không?