REST - (g)RPC - GraphQL karşılaştırması 🧮

REST - (g)RPC - GraphQL karşılaştırması 🧮

Onur Keskin

İstemci-sunucu ve sunucu-sunucu arasında popüler olan bu üç adet iletişim formunu ne zaman seçileceği her zaman zor bir karar olmuştur. Kısaca yeteneklerini, avantaj ve dezavantajlarını özetlemek iyi olabilir.

REST, eski dost

Yetenekler;

  • HTTP yolları veriyi tanımlar
  • Kolayca keşfedilebilir veri seti, örneğin tüm CRUD (create, read, update, delete) operasyonları HTTP yolları ile tanımlanabilir
  • POST/PUT genelde veri oluşturmak, GET okumak, POST/PUT güncelleme ve DELETE silmek için kullanılır
  • Genel kullanımda id ile POST yapmak varolan veriyi günceller. id kullanılmadan POST yapmak ise yeni veri ekler.
  • id ile PUT ise bu iki işlemi birleştirir. id varsa o verinin üzerine yazar, yoksa yeni veri oluşturur.

Avantajlar;

  • Öğrenmesi ve uygulaması kolay
  • RFC 2616'da iyice tanımlanmış yaygın HTTP fiilerini kullanır
  • Hata ayıklama yapması kolay ve pratik. Modern web tarayıcılarının "inspect" araçları, Wireshark gibi araçlar kullanılabilir.

Dezavantajları;

  • Verimsiz. Tüm API'ler her kullanım durumu için yeniden yazılmalıdır.
  • JSON çıktısı büyüktür, yeterince sıkıştırılamaz ve tekrarlı veri içerebilir.

(g)RPC, orada bir fonksiyon var uzakta

Yetenekler;

  • Mikro servis mimarisine geçmeyi teşvik eder.
  • Genelde protobuf nesneleri kullanır.
  • Servisler protobuf olarak tanımladıktan sonra sunucu uygulaması yapılır.
  • İstemci kütüphaneleri her dil için protobuf kodlarından türetilir.

Avantajlar;

  • Polygot (çok dilli)
  • Protobuf verinin transferi aşamasında verimlidir.
  • Yenilenme, ağ sorunları gibi durumları otomatik olarak çözmeye çalışır.
  • İstemci ve sunucu kodunu yazdığınız/kullandığınız dilde üretir. Mühendislik zamanını düşürür.

Dezavantajları;

  • Ağ üzerinden araya girilerek takip etmek, okunması zordur.
  • Tüm API'ler her kullanım durumu için yeniden yazılmalıdır.

GraphQL, gönder gelsin

Yetenekler;

  • Tüm işlemler için POST kullanılır.
  • Tek bir HTTP yolu vardır.
  • JSON içerisinde tanımlanan, sorgu ve mutasyon olarak tanımlanan iki farklı operatörü vardır.
  • Sorgu ile veriler okunur.
  • Mutasyon ile yeni veri ekleme, güncelleme ve silme yapılabilir.
  • Sorgulanan veri alanları, istemciden sunucuya iletilen HTTP isteğinde yer alır.
  • Bu veri alanları sunucuda değerlendirilip, cevap olarak iletilir.
  • Veri yapıları GraphQL şemalarında ön tanımlıdır.

Avantajlar;

  • REST ve gRPC'deki fazla veya eksik veri getirme sorununu çözer.
  • Sadece istenen alanlardaki veri içeriğini gönderir.

Dezavantajları;

  • Sorgular hep 200 OK durum kodu ile döndüğü için hatalar gizlenmiş olabilir. Bu durumları incelemek ve yönetmek için daha karmaşık bir istemci mantığı uygulanmalıdır.
  • JSON çıktısı kullandığı için yine de cevap boyutu büyüktür.