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
query { landedCost(id: "123") { id createdBy shipToCountry }}Rincian biaya: 5 (query dasar) + 1 (objek Landed cost) = 6 poin
Bidang skalar (id, name, currency) gratis.
Contoh: Query dengan beberapa objek
{ orders(first: 10, filter: { status: COMPLETED }) { edges { cursor node { id } } }}Rincian biaya: 5 (query dasar) + 10 (10 pesanan × 1 poin masing-masing) = 15 poin
Contoh: Mutasi
mutation { landedCostCalculate(input: { ... }) { id }}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:
zonos-query-complexity: 58Header 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:
{ landedCost(id: "landed_cost_123") { id createdAt } order(orderId: "order_123") { id status createdAt }}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.
query { order(orderId: "order_123") { id status createdAt updatedAt items { id name quantity amount } shipments { id } }}Paginasi dataset besar
Saat meminta beberapa objek, gunakan ukuran halaman yang wajar:
{ orders(first: 100, filter: { status: COMPLETED }) { edges { cursor node { id } } }}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.
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.