DOCS

GraphQL API Hız Sınırlaması

GraphQL API hız sınırlaması

Zonos'un sorgu maliyetlerini karmaşıklığa dayalı olarak nasıl hesapladığını öğrenin.

Zonos, GraphQL API isteklerini istek sayısı yerine sorgu karmaşıklığına göre hız sınırlar. Bu, adil kullanımı sağlarken size ihtiyaç duyduğunuz verileri tam olarak isteme özgürlüğü verir.

Bu dokümanı ne zaman referans almalısınız

Hız sınırlaması, bir müşterinin saniye başına yapabileceği API isteklerinin sayısını sınırlayarak sistemimizi korumanın bir yoludur. Bunu API çağrıları için bir hız sınırı gibi düşünün.

Bu ne zaman karşımıza çıkabilir?

  • Müşteri neden hız sınırı hatası aldığını sorar
  • Geliştirici API kullanım sınırları hakkında sorar
  • Birisi "kaç istek yapabiliriz?" sorusuyla gelir

Hızlı referans: Müşteriler saniyede 3.000 puan (300.000 maksimum kapasite) alır. Sorgu maliyetleri karmaşıklığa göre değişir - aşağıda daha fazla bilgi ve örnekleri görebilirsiniz.

Neden karmaşıklığa dayalı hız sınırlaması? 

Geleneksel REST API'leri, her isteğin bir veya yüzlerce alan alıp almadığı, veri okuması mı yoksa değiştirmesi mi olduğu fark etmeksizin aynı kredileri tükettiği istek temelli hız sınırlaması kullanır - sunucu yüküne göre önemli bir farklılık olmasına rağmen.

GraphQL'in sorgu karmaşıklığı tabanlı yaklaşımı bunu, istenen veriler ve yapılan işlemlere dayalı maliyetler hesaplayarak çözer. Bu size ihtiyacınız olan şeyleri isteme konusunda daha fazla esneklik verirken tahmin edilebilir bir sunucu yükü sağlar.

Hız sınırı 

Zonos, her sorgunun karmaşıklığına göre puanlar çıkardığı puan tabanlı bir sistem kullanır. Şu özellikler bulunan puanlarınız vardır:

  • Saniyede 3.000 puanla yenilenir (10 saniyede 30.000 puan)
  • 300.000 puanın maksimum kapasitesi vardır

Bu, karmaşık sorguların zaman zaman patlamalarını yapabilirken sürdürülebilir bir istek hızını koruyabilmenizi sağlar.

Sorgu maliyeti nasıl hesaplanır 

Her GraphQL isteğinin yürütülmeden önce hesaplanmış bir maliyeti vardır:

Temel maliyetler

  • Sorgu: 5 puan
  • Mutasyon: 10 puan
  • Nesne: döndürülen nesne başına 1 puan
  • Skalar alanlar: 0 puan (ücretsiz)

Dizeler, tamsayılar, kimlikler ve boole değerleri gibi skalar alanlar maliyete eklenmez. Sadece temel işlem ve döndürülen nesneler için ödeme yaparsınız.

Örnek: Basit sorgu

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

Maliyet dağılımı: 5 (temel sorgu) + 1 (landed cost nesnesi) = 6 puan

Skalar alanlar (id, name, currency) ücretsizdir.

Örnek: Çoklu nesneler içeren sorgu

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

Maliyet dağılımı: 5 (temel sorgu) + 10 (10 sipariş × 1 puan) = 15 puan

Örnek: Mutasyon

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

Maliyet dağılımı: 10 (temel mutasyon) + yaklaşık 50 (döndürülen nesneler) = 60 puan

Tipik bir landed cost hesaplaması karmaşıklık açısından yaklaşık 60 puana mal olur.

Sorgu karmaşıklığını görüntüleme 

Her API yanıtı sorgunuzun maliyetini gösteren zonos-query-complexity başlığını içerir:

1zonos-query-complexity: 58

Bu başlık, sorgunun kaç puan tükettiğini tam olarak gösterir. Bunu, API kullanımınızı izlemek ve pahalı sorguları optimize etmek için kullanın.

Hız sınırlarını işleme 

Hız sınırınızı aşarsanız bir hata mesajı alırsınız. Hız sınırlarını etkili bir şekilde işlemek için:

Karmaşıklığınızı izleyin

Sorgu maliyetlerinizi anlamak ve pahalı desenleri tanımlamak için yanıtlardaki zonos-query-complexity başlığını kontrol edin.

Yeniden deneme mantığı uygulayın

Hız sınırına ulaşırsanız, üstel geri çekilme ve yeniden deneme mantığı uygulayın. Kova saniyede 3.000 puan yenilediği için, sorgu karmaşıklığınıza göre uygun bekleme sürelerini hesaplayın.

Verimli bir şekilde toplayın

GraphQL, tek bir istekte birden fazla sorgu istemenize izin verir:

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}

En iyi uygulamalar 

Sadece ihtiyacınız olan şeyleri isteyin

Sorgu karmaşıklığı, istediğiniz verilerle orantılıdır. Sorgularınızı, gerçekten kullanacağınız alanları ve nesneleri yalnızca getirmek için yapılandırın.

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}

Geniş veri kümelerini sayfalandırın

Birden fazla nesne isterken, makul sayfa boyutlarını kullanın:

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

Bir seferde yüzlerce nesne istemek yerine aynı anda 10-50 öğe isteyin ve sonuçlar arasında sayfalandırın.

Gereksiz iç içe geçmeyi önleyin

Her iç içe geçmiş nesne karmaşıklığınıza eklenir. Sadece gerçekten ihtiyacınız olduğunda iç içe geçmiş verileri isteyin.

Bu sayfa faydalı mıydı?