DOCS

Pembatasan Laju GraphQL API

Pembatasan laju GraphQL API

Pelajari cara Zonos menghitung biaya query berdasarkan kompleksitas.

Zonos membatasi permintaan GraphQL API berdasarkan kompleksitas query daripada jumlah permintaan. Ini memastikan penggunaan yang adil sambil memungkinkan Anda meminta data yang tepat.

Mengapa pembatasan laju berbasis kompleksitas? 

REST API tradisional menggunakan pembatasan laju berbasis permintaan di mana setiap permintaan menggunakan kredit yang sama, baik Anda mengambil satu bidang atau ratusan, dan apakah Anda membaca atau mengubah data—terlepas dari perbedaan signifikan dalam beban server.

Pendekatan berbasis kompleksitas query GraphQL memecahkan ini dengan menghitung biaya berdasarkan data aktual yang diminta dan operasi yang dilakukan. Ini memberi Anda lebih banyak fleksibilitas untuk meminta apa yang Anda butuhkan sambil memberikan beban server yang dapat diprediksi.

Batas laju 

Zonos menggunakan sistem berbasis poin di mana setiap query mengurangi poin berdasarkan kompleksitasnya. Anda memiliki kumpulan poin yang tersedia yang:

  • Diisi ulang pada 3.000 poin per detik (30.000 poin per 10 detik)
  • Memiliki kapasitas maksimum 300.000 poin

Ini memungkinkan Anda membuat lonjakan query kompleks sesekali sambil mempertahankan kecepatan permintaan yang berkelanjutan.

Cara biaya query dihitung 

Setiap permintaan GraphQL memiliki biaya yang dihitung sebelum eksekusi:

Biaya dasar

  • Query: 5 poin
  • Mutasi: 10 poin
  • Objek: 1 poin per objek yang dikembalikan
  • Bidang skalar: 0 poin (gratis)

Bidang skalar seperti string, integer, ID, dan boolean tidak menambah biaya. Anda hanya membayar operasi dasar dan objek yang dikembalikan.

Contoh: Query sederhana

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

Rincian biaya: 5 (query dasar) + 1 (objek Landed cost) = 6 poin

Bidang skalar (id, name, currency) gratis.

Contoh: Query dengan beberapa objek

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

Rincian biaya: 5 (query dasar) + 10 (10 pesanan × 1 poin masing-masing) = 15 poin

Contoh: Mutasi

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

Rincian biaya: 10 (mutasi dasar) + sekitar 50 (objek yang dikembalikan) = 60 poin

Perhitungan Landed cost yang umum memakan biaya sekitar 60 poin dalam kompleksitas.

Melihat kompleksitas query 

Setiap respons API menyertakan header zonos-query-complexity yang menampilkan biaya query Anda:

1zonos-query-complexity: 58

Header ini memberi tahu Anda berapa banyak poin yang dikonsumsi query. Gunakan untuk memantau penggunaan API Anda dan mengoptimalkan query yang mahal.

Menangani batas laju 

Jika Anda melampaui batas laju Anda, Anda akan menerima pesan kesalahan. Untuk menangani batas laju secara efektif:

Pantau kompleksitas Anda

Periksa header zonos-query-complexity dalam respons untuk memahami biaya query Anda dan mengidentifikasi pola yang mahal.

Implementasikan logika percobaan ulang

Jika Anda mencapai batas laju, implementasikan backoff eksponensial dan logika percobaan ulang. Karena bucket diisi ulang pada 3.000 poin per detik, hitung waktu tunggu yang sesuai berdasarkan kompleksitas query Anda.

Batch secara efisien

GraphQL memungkinkan Anda meminta beberapa query dalam satu permintaan:

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}

Praktik terbaik 

Minta hanya apa yang Anda butuhkan

Kompleksitas query sebanding dengan data yang Anda minta. Struktur query Anda untuk mengambil hanya bidang dan objek yang benar-benar akan Anda gunakan.

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}

Paginasi dataset besar

Saat meminta beberapa objek, gunakan ukuran halaman yang wajar:

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

Minta 10-50 item sekaligus dan paginasi melalui hasil sesuai kebutuhan, daripada meminta ratusan objek dalam satu query.

Hindari nesting yang tidak perlu

Setiap objek bersarang menambah kompleksitas Anda. Hanya minta data bersarang saat Anda benar-benar membutuhkannya.

Pesan demo

Apakah halaman ini bermanfaat?