Ana içeriğe geç

Yan yana

gRPCvsGraphQL

gRPC ile GraphQL arasındaki fark nedir?

Güncellendi 2 dk okuma7 fark

Kısaca

gRPC, tipli uzak metotları HTTP/2 üzerinden ikili Protobuf mesajlarıyla çağırır; GraphQL'de ise istemci tek endpoint'ten tam istediği JSON alanlarını sorgular.

gRPC

gRPC, uzak sunucudaki fonksiyonları yerelmiş gibi çağırmaya yarayan açık kaynaklı framework'tür; Protocol Buffers ve HTTP/2 ile hızlı, tipli mesajlar taşır.

gRPC sayfasını oku

GraphQL

GraphQL, istemcilerin tam ihtiyaç duyduğu veriyi, çoğunlukla tek bir endpoint üzerinden tek istekte istemesini sağlayan API sorgu dili ve çalışma zamanıdır.

GraphQL sayfasını oku

gRPC ve GraphQL karşılaştırması

ÖzellikgRPCGraphQL
TarzUzak yordam çağrıları: tipli mesajlar alan metotlarTipli bir veri grafiği üzerinde sorgular
SözleşmeProtocol Buffers ile yazılan .proto dosyalarıGraphQL şema dilinde yazılmış bir şema
Yanıtın biçimiMetodun mesaj tipiyle sabittirİstemci tarafından, alan alan seçilir
Kodlamaİkili Protocol BuffersJSON
TaşımaHTTP/2; tek ya da iki yönde akışlaGenellikle tek bir endpoint'e HTTP POST; güncellemeler için subscription'lar
Tarayıcı desteğigRPC-Web ya da bir proxy gerekirHerhangi bir HTTP istemcisiyle çalışır
En uygun olduğu yerServisler arası çağrılar, yüksek hacim, akışEsnek, iç içe veriye ihtiyaç duyan ön yüzler

Fark, açıklamalı

gRPC bir uzak yordam çağrısı (RPC) framework'üdür: servisleri ve metotları bir .proto dosyasında tanımlar, istemci ve sunucu kodunu üretir ve uzak metotları yerel fonksiyonlarmış gibi çağırırsınız; mesajlar HTTP/2 üzerinden ikili Protocol Buffers olarak kodlanır. GraphQL ise API'ler için bir sorgu dilidir: sunucu tipli bir şema yayımlar, her istemci de tam olarak istediği alanları adlandıran bir sorgu gönderir; bu genellikle tek bir endpoint'e HTTP üzerinden JSON olarak yapılır.

Farklı çağıranlar için tasarlanmışlardır. gRPC, backend servisleri arasında hızlı ve katı bir iletişimi hedefler: kompakt mesajlar, pek çok dilde üretilmiş tipler, son tarihler (deadline) ve tek ya da iki yönde akış. GraphQL ise kullanıcı arayüzleri için esnek veri çekmeyi hedefler: bir web ya da mobil ekran, birkaç kaynaktan iç içe veriyi tek istekte toplayabilir ve yalnızca gösterdiği alanları alır.

Yani gRPC'de yanıtın biçimini sunucunun mesaj tipleri belirler, GraphQL'de ise istemci seçer. Bu da gRPC'yi öngörülebilir ve verimli ama katı; GraphQL'i ise esnek ama önbelleğe alınması, hız sınırı konulması ve pahalı sorgulara karşı korunması daha zor kılar. Tarayıcılar gRPC'yi doğrudan çağıramaz, gRPC-Web'e ya da bir proxy'ye ihtiyaç duyar; GraphQL ise herhangi bir HTTP istemcisinden çalışır.

Pek çok sistem ikisini birlikte kullanır: mikroservisler birbiriyle gRPC üzerinden konuşur, önlerindeki bir GraphQL ağ geçidi de tarayıcılara ve mobil uygulamalara hizmet verir; bu ağ geçidinin resolver'ları gRPC servislerini çağırır. Sık yapılan bir yanlış, GraphQL'in bir veritabanı ya da daha hızlı bir taşıma yöntemi olduğunu düşünmektir; o bir API katmanıdır ve hızı arkasındaki resolver'lara bağlıdır.

Hangisini kullanmalısınız?

gRPC şu durumlarda doğru seçim:

  • Backend servisleri birbirini yüksek hacimde çağırıyor ve düşük gecikmeye ihtiyaç duyuyor.
  • Katı sözleşmeler ve birkaç dilde üretilmiş istemciler istiyorsunuz.
  • Tek ya da iki yönde akışa ihtiyacınız var.

GraphQL şu durumlarda doğru seçim:

  • Web ve mobil istemcilerin aynı verinin farklı dilimlerine ihtiyacı var.
  • Tek bir ekran, birkaç servisten ya da veritabanından gelen iç içe veriyi birleştiriyor.
  • Ön yüz ekipleri, yeni endpoint'leri beklemeden ne çektiklerini değiştirebilmeli.

Bir kullanıcıyı gRPC ile ve GraphQL ile çekmek

gRPCjavascript
// gRPC: call a method generated from user.proto
const client = new UserServiceClient("users.internal:50051", credentials);

// Binary Protobuf over HTTP/2; returns the whole User message
const user = await client.getUser({ id: 42 });
console.log(user.name, user.email);
GraphQLjavascript
// GraphQL: ask one endpoint for exactly the fields you need
const response = await fetch("https://api.example.com/graphql", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    query: `{ user(id: 42) { name posts(last: 3) { title } } }`,
  }),
});
const { data } = await response.json(); // JSON shaped like the query

Sık sorulan sorular

gRPC, GraphQL'den daha mı hızlı?

Ham servisler arası çağrılarda genellikle evet; çünkü ikili Protobuf mesajları JSON'dan küçüktür ve daha hızlı ayrıştırılır, HTTP/2 de pek çok çağrıyı tek bağlantıda taşır. GraphQL ise birkaç gidiş-dönüşü tek bir sorguyla değiştirerek ön yüzlere yine de zaman kazandırabilir.

GraphQL ve gRPC birlikte kullanılabilir mi?

Evet. Yaygın bir tasarım, gRPC mikroservislerinin önüne bir GraphQL ağ geçidi koymaktır: istemciler ağ geçidini sorgular, onun resolver'ları da servisleri çağırır.

Bir tarayıcı gRPC API'sini çağırabilir mi?

Doğrudan çağıramaz. Tarayıcılar genellikle çağrıları çeviren bir proxy aracılığıyla gRPC-Web kullanır ya da gRPC servislerinin önünde duran bir REST veya GraphQL API'siyle konuşur.

Daha fazla

Ayarlar