Diyarbakır Yazılım LogoDİYARBAKIR
>Ana Sayfa>Projeler>Atölye>Yazılar
>Ana Sayfa>Projeler>Atölye>Yazılar
durum: inşa ediliyor
GraphQL ve REST: Kurumsal Karar Verme Rehberi
  1. Anasayfa
  2. Yazılar
  3. GraphQL ve REST: Kurumsal Karar Verme Rehberi

GraphQL ve REST: Kurumsal Karar Verme Rehberi

Diyarbakır Yazılım
Diyarbakır Yazılım
16.08.2026
#Yazılım#Teknoloji#Topluluk

Kurumsal API projelerinde GraphQL ve REST seçimi çoğu zaman gereğinden erken bir teknoloji yarışına dönüşüyor. On yıllık yazılım mimarisi deneyimimde daha sağlıklı sonuçların, protokol isminden önce tüketici türü, veri modeli, güvenlik, cache, ekip kapasitesi ve operasyon gereksinimleri konuşulduğunda ortaya çıktığını gördüm. GraphQL ve REST: Kurumsal Karar Verme Rehberi, iki yaklaşımı kazanan ve kaybeden şeklinde sıralamak yerine hangi API yüzeyinde hangi modelin daha savunulabilir olduğunu açıklamayı amaçlıyor. GraphQL mi REST mi kurumsal projelerde hangisi kullanılmalı sorusuna tek cümlelik cevap vermek yerine performans, güvenlik, ölçeklenebilirlik, yönetişim, versioning ve toplam sahip olma maliyetini birlikte değerlendireceğiz. Rehberin sonunda public API, partner entegrasyonu, mobil BFF, microservice iletişimi ve hibrit kurumsal mimari için uygulanabilir bir karar çerçeveniz olacak.

GraphQL vs REST Tartışmasında Asıl Soru Nedir?

Asıl soru GraphQL veya REST'in genel olarak daha güçlü olup olmadığı değildir. Doğru soru belirli API yüzeyi, tüketici grubu ve operasyon modeli için hangi yaklaşımın daha uygun olduğudur. Aynı kurumda mobil uygulama için GraphQL kullanılırken partner entegrasyonlarında REST tercih edilebilir. Internal service iletişiminde ise REST yerine farklı bir güçlü contract modeli değerlendirilebilir. Kararı teknoloji popülerliğinden çıkarıp kullanım bağlamına taşıdığınızda tartışma çok daha üretken hâle gelir.

“Hangisi Daha İyi?” Sorusu Neden Yanlış?

“Hangisi daha iyi?” sorusu bütün API ihtiyaçlarının aynı olduğunu varsayar. Oysa public developer API ile yalnızca tek mobil uygulamanın kullandığı BFF aynı sözleşme, cache ve güvenlik ihtiyaçlarına sahip değildir. REST HTTP semantiği ve cache altyapısıyla bazı yüzeylerde doğal avantaj sağlar. GraphQL ise çok sayıda farklı istemcinin değişken veri ihtiyacında ciddi esneklik sunabilir. Bu nedenle doğru karşılaştırma ürün bazında değil kullanım yüzeyi ve gereksinimler bazında yapılmalıdır.

API Surface Bazlı Karar Verme

API surface yaklaşımı kurumun dışarı sunduğu veya içeride kullandığı farklı API yüzeylerini ayrı değerlendirir. Public, partner, internal, BFF ve service-to-service yüzeyleri aynı protokolü kullanmak zorunda değildir. Her yüzey için consumer kontrolü, contract ömrü, cache ihtiyacı ve güvenlik modeli ayrı ölçülmelidir. Bu model tek kurumsal standart belirleme baskısını azaltırken tamamen kontrolsüz teknoloji çeşitliliğini de önler. Sonuçta kurum teknoloji değil kullanım amacı üzerinden standart oluşturabilir.

Tek Kurum İçinde GraphQL ve REST Birlikte Kullanılabilir mi?

Evet, birçok kurumsal mimaride en anlamlı çözüm hibrit kullanımdır. GraphQL web ve mobil uygulamalar için aggregation katmanı olurken REST public veya partner API olarak kullanılabilir. Backend servisleri kendi aralarında REST veya daha sıkı contract sunan başka protokollerle konuşabilir. Büyük dosyalar object storage üzerinden taşınırken metadata yine GraphQL veya REST ile yönetilebilir. Önemli olan her protokol için ownership, gözlemlenebilirlik, güvenlik ve governance standardının açık olmasıdır.

REST Nedir?

REST kaynakları HTTP üzerinden tanımlayan ve web'in mevcut semantiğinden yararlanan bir API yaklaşımıdır. Resource URI'ları, HTTP method'ları, status code'lar ve cache header'ları tasarımın önemli parçalarıdır. REST tek bir framework veya standart belge formatı değildir, bu yüzden farklı ekiplerin uygulamaları arasında kalite farkları görülebilir. Kurumsal kullanımda OpenAPI, naming standardı ve ortak error contract bu farkı azaltır. Basit resource modellerinde REST'in anlaşılır yapısı operasyon ve entegrasyon tarafında büyük kolaylık sağlayabilir.

Resource-Oriented API Modeli

REST yaklaşımında API genellikle müşteri, sipariş, fatura veya ürün gibi kaynaklar etrafında şekillenir. URI kaynağı tanımlar ve HTTP method operation niyetini ifade eder. Bu model business entity ve servis sınırları doğru hizalandığında son derece okunabilir bir sözleşme sunar. Aşırı action endpoint üretmek resource modelinin değerini azaltabilir. Buna rağmen her business operation'ı zorla CRUD modeline sokmaya çalışmak da iyi bir REST tasarımı değildir.

HTTP Method'ları

HTTP method'ları REST API'nin operation semantiğini açık biçimde ifade eder. GET okuma, POST yeni işlem başlatma, PUT bütün kaynak değiştirme, PATCH kısmi değişiklik ve DELETE kaldırma niyetini gösterebilir. Bu semantik proxy, cache, güvenlik ürünü ve developer tooling tarafından anlaşılır. Method seçiminde sadece framework routing kolaylığına göre hareket edilmemelidir. Idempotency ve retry davranışı da method semantiğiyle birlikte değerlendirilmelidir.

GET

GET bir kaynağı veya kaynak koleksiyonunu okumak için kullanılır. Safe operation kabul edildiği için sistem state'ini business anlamda değiştirmemesi beklenir. GET response'ları HTTP cache mekanizmalarından doğal biçimde yararlanabilir. Query parametreleri filtreleme, pagination veya sparse fieldset için kullanılabilir. Hassas parametrelerin URL ve loglarda görünme ihtimali güvenlik tasarımında ayrıca düşünülmelidir.

POST

POST yeni resource oluşturmak veya bir command niteliğindeki işlemi başlatmak için kullanılabilir. Varsayılan olarak idempotent kabul edilmediği için network retry senaryosu dikkatle ele alınmalıdır. Payment veya order creation gibi operation'larda idempotency key önemli olabilir. Request body karmaşık input modelleri taşıyabilir. Başarılı işlemde uygun resource reference veya operation sonucu dönmek contract kullanımını kolaylaştırır.

PUT

PUT genellikle belirli bir kaynağın bütün representation'ını verilen state ile değiştirme amacı taşır. Aynı request birden fazla kez uygulandığında aynı sonuç üretmesi beklenir. Bu özellik belirli retry senaryolarında avantaj sağlar. Ancak uygulamalar PUT ve PATCH ayrımını her zaman aynı biçimde kullanmayabilir. Kurumsal API style guide method semantiğini açıklaştırmalıdır.

PATCH

PATCH kaynağın belirli alanlarında kısmi değişiklik yapmak için kullanılabilir. Büyük resource'larda tüm representation'ı yeniden göndermek gerekmediği için pratik avantaj sağlar. Patch document formatı kurum genelinde standartlaştırılmalıdır. Authorization yalnızca route seviyesinde değil değiştirilen alanlar seviyesinde de gerekebilir. Concurrent update ve optimistic locking ihtiyacı ayrıca düşünülmelidir.

DELETE

DELETE belirli bir resource'un kaldırılması veya artık erişilebilir olmaması niyetini ifade eder. Fiziksel silme yerine soft delete uygulanması business ve compliance gereksinimine göre değişebilir. Aynı delete request'in tekrar gönderilmesi mümkün olduğu için response semantics önceden belirlenmelidir. İlişkili verilerin silinme davranışı domain kuralıdır. API endpoint yalnızca bu business operation'ın transport yüzeyidir.

Statelessness

REST'in önemli özelliklerinden biri server'ın istemci session state'ine zorunlu biçimde bağımlı olmamasıdır. Her request işlemin tamamlanması için gerekli bağlamı mümkün olduğunca kendisi taşır. Bu durum horizontal scaling ve request routing işlemlerini kolaylaştırabilir. Authentication token veya session mekanizması kullanılması stateless yaklaşımı tamamen ortadan kaldırmak zorunda değildir. Business workflow state'i ise doğal olarak database veya başka kalıcı sistemlerde tutulabilir.

HTTP Status Code Semantiği

REST HTTP status code modelinden güçlü biçimde yararlanabilir. 2xx başarı, 4xx istemci kaynaklı sorun ve 5xx server problemi gibi sınıflar gateway ve monitoring katmanında anlamlı sinyaller sağlar. Ancak her domain error için farklı status code icat etmek iyi sonuç vermez. Standard error body business error code ve açıklamayı ayrıca taşıyabilir. Route, status ve latency verileri operasyon ekipleri için anlaşılır bir gözlemlenebilirlik modeli oluşturur.

REST'in Kurumsal Avantajları

REST'in en büyük kurumsal avantajlarından biri HTTP altyapısıyla doğal uyumudur. CDN cache, reverse proxy, WAF, browser debugging ve standart monitoring araçları kolay uygulanabilir. Public ve partner entegrasyonlarında curl gibi basit araçlarla test yapılabilmesi developer experience açısından değerlidir. OpenAPI kullanıldığında dokümantasyon ve client generation süreçleri standartlaştırılabilir. Küçük platform ekiplerinde operasyon modelinin nispeten anlaşılır olması da önemli bir avantajdır.

REST'in Kurumsal Sınırları

REST çok sayıda farklı client aynı domain verisini farklı şekillerde istediğinde endpoint sayısını artırabilir. Bir ekran için birkaç resource endpoint'ine ardışık çağrı yapmak mobile network üzerinde latency maliyeti yaratabilir. Client-specific endpoint üretimi zamanla BFF benzeri ayrı katmanlara ihtiyaç doğurabilir. Deep relational veri için response shape yönetimi zorlaşabilir. Yine de bu sorunların her biri otomatik olarak GraphQL gerektirdiği anlamına gelmez.

GraphQL Nedir?

GraphQL schema üzerinden client'ın ihtiyaç duyduğu alanları açıkça seçmesine izin veren API query modelidir. Query, mutation ve subscription operation türleri üzerinden farklı etkileşimler kurulabilir. Type system API contract'ını güçlü biçimde görünür kılar. Resolver yapısı requested field'ların hangi kaynaktan üretileceğini belirler. Bu esneklik özellikle web ve mobil istemcilerin aynı veri graph'ından farklı response shape istediği kurumsal ürünlerde anlamlı olabilir.

Schema-Driven API Modeli

GraphQL API merkezinde açık ve sorgulanabilir schema bulunur. Type, field, argument ve relation'lar bu schema içinde tanımlanır. Client schema'yı kullanarak hangi alanların mevcut olduğunu görebilir. Code generation ve autocomplete developer deneyimini güçlendirebilir. Schema büyüdükçe ownership ve breaking-change governance süreçleri de zorunlu hâle gelir.

Query

Query data okuma operation'larını temsil eder. Client gerekli field ve nested relation'ları tek operation içinde seçebilir. Bu esneklik response payload'ın ekran ihtiyacına göre şekillenmesini sağlar. Bunun karşılığında server requested query'nin gerçek compute ve downstream maliyetini hesaplamak zorunda kalabilir. Query execution yalnızca tek HTTP request olması nedeniyle otomatik olarak ucuz kabul edilmemelidir.

Mutation

Mutation sistem state'ini değiştiren operation'ları temsil eder. Business action isimleri mutation contract'ını daha anlaşılır kılabilir. Payment veya order operation'larında idempotency yine transporttan bağımsız biçimde tasarlanmalıdır. Mutation sonucunda client'ın ihtiyaç duyduğu updated field'lar seçilebilir. Authorization ve audit kontrolleri yalnızca mutation adına değil affected object'lere göre uygulanmalıdır.

Subscription

Subscription server'da oluşan değişikliklerin client'a gerçek zamanlı aktarımı için kullanılabilir. Genellikle sürekli bağlantı gerektiren transportlarla birlikte çalışır. Connection lifecycle, authorization ve reconnect davranışı production tasarımında önemlidir. Her real-time ihtiyacını GraphQL subscription ile çözmek zorunlu değildir. Server-Sent Events, webhook veya event sistemleri bazı kullanım senaryolarında daha uygun olabilir.

Type System

GraphQL type system schema contract'ının merkezindedir. Scalar, object, interface, union ve enum gibi yapılar domain verisini açıklamak için kullanılabilir. Nullability özellikle client beklentilerini etkileyen kritik tasarım kararıdır. Type değişiklikleri breaking-change analiziyle yönetilmelidir. Güçlü type information client code generation süreçlerinde önemli üretkenlik sağlar.

Resolver Modeli

Resolver belirli field veya operation'ın verisini nasıl üreteceğini tanımlar. Resolver database, service veya başka data source çağırabilir. Küçük resolver'lar birlikte büyük execution tree oluşturduğu için fan-out ve N+1 riski ortaya çıkar. Resolver seviyesinde latency ve error metric toplamak production debugging için değerlidir. Business logic'i resolver'lara dağıtmak yerine onları orchestration sınırında tutmak daha sürdürülebilir sonuç verir.

GraphQL'in Kurumsal Avantajları

GraphQL çok sayıda farklı client'ın aynı business graph'tan farklı field kombinasyonları istemesi durumunda ciddi esneklik sağlar. Frontend ekipleri yalnızca ihtiyaç duyduğu field'ları seçebilir. Schema introspection, autocomplete ve code generation geliştirici akışını hızlandırabilir. BFF katmanında birçok backend servisinden gelen veriyi client odaklı tek contract altında sunmak mümkündür. Schema governance ve güçlü platform ownership varsa bu model büyük organizasyonlarda etkili çalışabilir.

GraphQL'in Kurumsal Maliyetleri

GraphQL'in esnekliği server tarafında daha fazla operasyon sorumluluğu oluşturur. Query complexity, N+1, field authorization, persisted operations ve resolver observability üretim ortamında ciddiye alınmalıdır. Standart HTTP cache mekanizmalarından yararlanmak REST kadar doğrudan olmayabilir. Tek endpoint route-level metric'leri daha az anlamlı hâle getirir ve operation-level telemetry gerektirir. Platform ownership olmadan büyüyen schema zamanla yönetimi zor bir merkezî katmana dönüşebilir.

GraphQL ve REST Arasındaki Temel Mimari Fark

GraphQL ve REST API arasındaki farklar nelerdir sorusunun en önemli yanıtı response ownership ve API modelidir. REST'te server endpoint'in response shape'ini belirlerken GraphQL'de client schema sınırları içinde ihtiyaç duyduğu field'ları seçer. REST resource merkezli düşünürken GraphQL ilişkili data graph'ı üzerinde query çalıştırır. Bu fark client esnekliğini ve server sorumluluğunu farklı biçimde dağıtır. Mimari karar verirken yalnızca request syntax değil bu sorumluluk dağılımı değerlendirilmelidir.

REST'te Server-Defined Response

REST endpoint genellikle response contract'ını server tarafında önceden belirler. Client verilen representation içinden ihtiyacı olan alanları kullanır. Yeni client ihtiyacı response shape değişikliği veya yeni endpoint gerektirebilir. Sparse fieldset veya expansion gibi pattern'ler bu esnekliği artırabilir. Server-defined contract public API gibi öngörülebilir yüzeylerde önemli avantaj sağlayabilir.

GraphQL'de Client-Defined Response

GraphQL client'a schema içindeki alanlardan kendi response shape'ini oluşturma imkânı verir. Aynı query root farklı ekranlarda farklı selection set ile kullanılabilir. Bu durum frontend release'lerini backend endpoint tasarımından daha bağımsız hâle getirebilir. Ancak client requested field kombinasyonu server için beklenmeyen maliyet üretebilir. Query complexity ve field cost kontrolü bu yüzden production modelinin parçası olmalıdır.

Multiple Endpoint vs Single Graph

REST genellikle farklı resource ve operation'lar için birden fazla URI sunar. GraphQL çoğu uygulamada tek endpoint üzerinden birçok operation çalıştırır. Bu fark networking kadar observability ve gateway politikalarını da etkiler. REST route bazlı rate limit kolayken GraphQL operation veya query cost bazlı kontrol gerektirebilir. Tek endpoint kullanımının sistemin arkasında tek servis olduğu anlamına gelmediğini unutmamak gerekir.

Resource Model vs Data Graph

REST resource representation etrafında düşünmeyi teşvik eder. GraphQL ise entity ve relation'ları birleşik bir data graph olarak sunabilir. Deep relational veri ve çok domain'li ekranlarda graph modeli frontend için daha doğal olabilir. Basit CRUD resource sisteminde ise GraphQL ek platform maliyeti getirebilir. Veri modelinin gerçek yapısı kararın güçlü sinyallerinden biridir.

Complexity Client'ta mı Server'da mı?

REST bazı aggregation işini client veya özel BFF endpoint'lerine bırakabilir. GraphQL bu esnekliği server execution engine ve resolver modeline taşır. Böylece client code sadeleşebilir fakat server query planning ve cost control açısından daha fazla sorumluluk alır. İki yaklaşımda da toplam iş ortadan kaybolmaz. Mimari yalnızca bu işin hangi katmanda yönetileceğini değiştirir.

Karardan Önce API Consumer'larını Sınıflandırın

Kurumsal projelerde protokol seçmeden önce API'yi kimin tükettiğini açıkça sınıflandırmak gerekir. Web, native mobile, partner, public developer, internal microservice ve IoT istemcileri farklı değişim hızlarına sahiptir. Client kontrolünün kurumda olup olmaması contract evolution kararını doğrudan etkiler. Network kalitesi ve tooling kapasitesi de tüketici türüne göre değişir. Consumer haritası çıkarılmadan verilen GraphQL veya REST kararı önemli bağlamı kaçırır.

Web Application

Web uygulaması genellikle backend ile aynı kurum tarafından geliştirildiği için client ve API ekipleri yakın çalışabilir. Ekran veri ihtiyacı sık değişiyorsa GraphQL önemli esneklik sağlayabilir. Server-side rendering veya CDN cache hedefleri REST'i belirli alanlarda daha güçlü hâle getirebilir. Browser debugging ve network tooling her iki modelde de mümkündür. Karar ekranların kaç domain'e dokunduğu ve frontend release hızına göre verilmelidir.

Native Mobile

Native mobile uygulamalar düşük veya değişken network kalitesinde çalışabilir. Eski app version'larının uzun süre production'da kalması contract evolution'ı önemli hâle getirir. GraphQL client'ın yalnızca gerekli field'ları almasına imkân vererek bandwidth kullanımını azaltabilir. Buna karşılık client cache ve operation registry gibi ek altyapılar yönetilmelidir. Mobil ürünlerde gerçek network testleri protokol kararını benchmark'tan daha iyi yönlendirir.

Partner Integration

Partner entegrasyonlarında tüketici sizin release takviminizin dışında hareket eder. Contract stability, auditability ve açık versioning bu nedenle güçlü önem taşır. REST ve OpenAPI birçok partner ekibinin alışık olduğu araçlarla rahat çalışabilir. GraphQL kullanılacaksa persisted operation veya açık schema governance mekanizması düşünülmelidir. Entegrasyon kolaylığı yalnızca payload esnekliğinden ibaret değildir.

Public Developer API

Public developer API'de consumer sayısı ve kullanım biçimi tam olarak bilinmeyebilir. HTTP semantics, rate limit dokümantasyonu, örnek curl çağrıları ve uzun ömürlü version contract önemli olur. REST bu özelliklerde doğal avantaj sunabilir. GraphQL public API olarak kullanılabilir fakat query abuse, schema discovery ve operation cost yönetimi daha güçlü platform gerektirir. Unknown consumer problemi kararın en kritik noktalarından biridir.

Internal Microservice

Internal microservice iletişiminde browser veya UI esnekliği çoğu zaman ana gereksinim değildir. Sıkı contract, düşük latency ve basit operasyon daha önemli olabilir. REST kullanılabilir fakat bazı servisler daha güçlü contract veya streaming ihtiyacı nedeniyle başka protokolleri değerlendirebilir. GraphQL service-to-service için kullanılabilir ancak çoğu zaman BFF rolünde daha anlamlıdır. Internal iletişim kararını frontend API kararıyla aynı kabul etmek doğru değildir.

Admin Panel

Admin paneller çok sayıda domain bilgisini tek ekranda birleştirebilir. Client kurum içinde olduğu için schema değişiklikleri daha koordineli yönetilebilir. GraphQL aggregation ve field selection açısından faydalı olabilir. Buna karşılık kullanıcı sayısı düşükse basit REST BFF aynı problemi daha az platform yüküyle çözebilir. Admin uygulamanın düşük trafik alması güvenlik ve authorization gereksinimini azaltmaz.

IoT / Edge Client

IoT ve edge istemciler sınırlı bandwidth, compute veya connection kalitesine sahip olabilir. Protocol overhead ve request sayısı burada daha görünür hâle gelir. GraphQL yalnızca gerekli field'ları seçme avantajı sunabilir fakat query engine ve client library maliyeti cihaz sınıfına göre ağır olabilir. Basit REST veya özel compact contract daha uygun olabilir. Karar gerçek cihaz ve network koşullarında test edilmelidir.

Third-Party Automation

Otomasyon araçları ve script'ler basit, kararlı ve kolay debug edilen API contract'larını tercih eder. REST endpoint'leri çoğu dilde ek client library olmadan kullanılabilir. GraphQL tek endpoint ve güçlü schema sunarken query document yönetimi gerektirir. Public automation için rate limit ve credential modeli özellikle önemlidir. Consumer teknik seviyesi ve kullanım sıklığı kararın parçasıdır.

API Surface Matrisi Oluşturmak

API Surface Matrisi kurumun tüm entegrasyon yüzeylerini aynı tabloda görünür hâle getirir. Her yüzey için consumer tipi, güvenlik modeli, cache ihtiyacı, contract ömrü ve ownership yazılabilir. Böylece bütün kurum için tek bir protokol standardı koymak yerine kontrollü bir portföy oluşturulur. GraphQL ve REST API gateway caching versioning ve entegrasyon stratejileri bu matris üzerinden daha tutarlı planlanabilir. Mimari review sırasında yeni API'nin hangi surface kategorisine ait olduğu kolayca belirlenebilir.

Public API

Public API dış geliştiriciler tarafından kontrolünüz dışında tüketilir. Contract stability ve deprecation communication temel gereksinimlerdir. REST bu kullanımda HTTP semantics ve yaygın tooling sayesinde güçlü adaydır. GraphQL tercih edilecekse query cost, introspection ve schema evolution çok daha disiplinli yönetilmelidir. Developer portal ve açık kullanım politikası protokolden bağımsız olarak gereklidir.

Partner API

Partner API sınırlı fakat dış organizasyonlar tarafından kullanılan entegrasyon yüzeyidir. Contract değişiklikleri partner release planını etkileyebilir. REST versioning ve webhook modeli birçok B2B senaryosunda anlaşılır sonuç verir. GraphQL partnerin aynı domain verisinde çok değişken ihtiyaçları varsa değerlendirilebilir. Audit ve support süreçleri tasarımın önemli parçalarıdır.

Internal API

Internal API aynı kurum içindeki ekipler tarafından tüketilir. Consumer kontrolü daha yüksek olduğu için contract değişikliği koordinasyonu kolaylaşabilir. GraphQL, REST veya farklı protokoller kullanım amacına göre seçilebilir. Internal olması authentication ve authorization ihtiyacını ortadan kaldırmaz. API catalog ownership ve discoverability açısından yine önem taşır.

BFF API

Backend for Frontend belirli client veya client ailesinin veri ihtiyacını optimize eden katmandır. GraphQL bu rol için güçlü bir seçenektir çünkü frontend farklı domain verilerini tek query içinde isteyebilir. REST BFF de purpose-built endpoint'lerle aynı problemi çözebilir. BFF business logic'in merkezi hâline gelmemelidir. Domain kuralları ilgili backend servislerinde korunmalıdır.

Service-to-Service API

Service-to-service yüzeyde client genellikle başka bir backend servistir. Strong contract, predictable latency ve failure semantics büyük önem taşır. REST yaygın ve basit bir tercih olabilir. Çok düşük latency veya streaming varsa başka contract modelleri değerlendirilebilir. GraphQL'in client-defined query esnekliği burada her zaman gerekli değildir.

Event/Webhook Surface

Senkron API dışında event ve webhook yüzeyleri de contract portföyünün parçasıdır. Domain event, partner webhook veya message stream farklı delivery semantics taşır. GraphQL ve REST bu async iletişimin doğrudan alternatifi değildir. Event contract versioning ve idempotency ayrıca planlanmalıdır. Surface matrisi senkron ve asenkron entegrasyonları birlikte görünür kılar.

Her Surface İçin Ayrı Protokol Seçilebilir mi?

Evet, fakat her farklı protokol platform maliyeti oluşturur. Kurumun security, monitoring ve developer tooling ekipleri bu çeşitliliği destekleyebilmelidir. Aynı ihtiyacı çözen beş farklı yaklaşım kontrolsüz teknik borç yaratabilir. Buna karşılık her yüzeyi zorla tek protokole sokmak da verimsiz olabilir. Approved patterns ve istisna süreci dengeli governance sağlar.

Veri Modeliniz GraphQL Gerektiriyor mu?

GraphQL için en güçlü sinyallerden biri istemcinin çok ilişkili ve değişken veri ihtiyacıdır. Basit resource listeleri ve stabil response shape için REST çoğu zaman yeterlidir. Bir ekran sürekli farklı domain'lerden nested veri istiyorsa GraphQL aggregation değerini artırabilir. Yine de karmaşık veri modeli otomatik GraphQL kararı değildir. Backend fan-out ve ownership yapısı query graph ile birlikte değerlendirilmelidir.

Flat Resource Model

Flat resource model birkaç temel entity ve sınırlı ilişki içerir. Client çoğunlukla tek resource veya küçük listeler alır. Bu durumda REST endpoint'leri anlaşılır ve cache dostu olabilir. GraphQL schema kurmak elde edilen faydadan daha fazla governance maliyeti yaratabilir. API tasarımında business ihtiyacın sadeliği korunmalıdır.

Deeply Relational Data

Deeply relational data birçok entity'nin aynı client ekranında birlikte kullanılmasını gerektirir. GraphQL nested selection bu senaryoda frontend'e doğal bir model sağlar. Client bir order, customer ve related items bilgisini tek operation ile isteyebilir. Ancak server tarafında bu relation'lar çok sayıda downstream çağrıya dönüşebilir. N+1 ve fan-out kontrolü bu nedenle zorunludur.

Graph Traversal

Graph traversal bir entity'den ilişkili diğer entity'lere zincirleme erişimi ifade eder. GraphQL schema bu ilişkiyi doğal olarak gösterebilir. Fakat client'a sınırsız traversal hakkı vermek performans ve güvenlik riski yaratır. Query depth ve list depth limitleri belirlenmelidir. Domain boundary'lerini schema kolaylığı uğruna belirsizleştirmemek gerekir.

Bir Ekranın Kaç Domain'den Veri İstediğini Ölçmek

Karar verirken gerçek ekranları analiz etmek teorik tartışmadan daha değerlidir. Bir mobil ekran üç veya dört backend domain'inden veri topluyorsa aggregation ihtiyacı ölçülebilir hâle gelir. Aynı veriler için kaç network request gerektiği çıkarılmalıdır. GraphQL BFF bu maliyeti azaltabilir fakat backend request sayısını ayrıca ölçmek gerekir. Ekran bazlı veri haritası güçlü bir PoC girdisidir.

Stable Response Shape

Response shape yıllarca çok az değişiyorsa server-defined REST contract güçlü avantaj sağlar. Cache key ve client code daha öngörülebilir olur. Consumer bilinmeyen public API'lerde stabil contract özellikle değerlidir. GraphQL'in field seçim esnekliği burada sınırlı fayda sağlayabilir. Platform maliyetinin bu faydaya değip değmediği sorgulanmalıdır.

Rapidly Changing Response Shape

Frontend ekranlarının veri ihtiyacı sık değişiyorsa sürekli yeni REST endpoint veya response revision ihtiyacı oluşabilir. GraphQL client'a schema içinden farklı selection set oluşturma imkânı verir. Bu durum frontend ve backend release koordinasyonunu azaltabilir. Schema yine additive biçimde gelişmek zorundadır. Field usage telemetry eski alanların güvenli kaldırılması için önem kazanır.

Over-Fetching ve Under-Fetching

Over-fetching client'ın kullanmadığı veriyi alması, under-fetching ise tek ekran için ihtiyaç duyulan veriyi tamamlamak amacıyla ek request'ler yapmasıdır. GraphQL bu iki problemi field selection ve nested query ile azaltmayı hedefler. REST ise purpose-built endpoint, sparse fieldset ve expansion pattern'leriyle aynı sorunlara farklı çözümler sunabilir. Payload optimizasyonu tek başına teknoloji kararını belirlememelidir. Backend compute ve cache etkisi aynı ölçüm modeline dahil edilmelidir.

REST'te Over-Fetching

REST resource representation client'ın ihtiyaç duyduğundan daha fazla alan içerebilir. Mobile network üzerinde büyük payload özellikle önemli maliyet yaratabilir. Sparse fieldset parametresi client'ın belirli alanları seçmesine izin verebilir. Ayrı compact endpoint de bazı kritik ekranlar için kullanılabilir. Over-fetching miktarı gerçek trafik verisiyle ölçülmeden teknoloji migration kararı verilmemelidir.

REST'te Under-Fetching

Under-fetching bir ekran için birden fazla endpoint çağrısı gerektiğinde ortaya çıkabilir. Özellikle yüksek latency mobile network üzerinde ardışık çağrılar kullanıcı deneyimini etkiler. Parallel request veya BFF aggregation bu problemi azaltabilir. GraphQL tek operation ile ihtiyaç duyulan graph'ı sunabilir. Ancak client request sayısının azalması backend işinin de azaldığı anlamına gelmez.

GraphQL Field Selection

GraphQL field selection client'ın yalnızca ihtiyaç duyduğu schema alanlarını istemesine izin verir. Payload size bu sayede ekran ihtiyacına göre optimize edilebilir. Gereksiz büyük listeler veya nested relation'lar yine maliyet yaratabilir. Pagination ve cost limit uygulanmalıdır. Field seçim esnekliği server'ın capacity modelini de daha dinamik hâle getirir.

Tek Request Her Zaman Daha Hızlı mı?

Hayır, tek client request arka tarafta onlarca database veya service çağrısı oluşturabilir. GraphQL query bir HTTP round trip'i azaltırken resolver fan-out nedeniyle daha fazla backend work üretebilir. Kullanıcı yalnızca tek request gördüğü için sistemin ucuz çalıştığı varsayılmamalıdır. P95 ve p99 latency ile downstream call count birlikte izlenmelidir. Gerçek performans end-to-end operation maliyetidir.

Purpose-Built REST Endpoint Alternatifi

Bir ekran birkaç resource'tan veri istiyorsa özel aggregation endpoint oluşturmak basit çözüm olabilir. BFF katmanı backend servislerinden veriyi toplar ve ekrana uygun response döner. Bu yaklaşım GraphQL platformu kurmadan under-fetching problemini azaltabilir. Ancak her ekran için farklı endpoint üretmek zamanla endpoint explosion oluşturabilir. Client çeşitliliği arttıkça GraphQL'in göreceli değeri yükselir.

Sparse Fieldsets ve Expansion Pattern'leri

Sparse fieldset client'ın response içindeki alanları parametreyle seçmesine izin verir. Expansion pattern ilişkili resource'ların aynı response içine eklenmesini sağlayabilir. Bu teknikler REST'in response esnekliğini artırır. Fazla seçenek cache key kombinasyonlarını ve server implementation'ını zorlaştırabilir. Bu yüzden kullanım standardı ve maksimum expansion derinliği tanımlanmalıdır.

Network Round Trip ile Backend Work Aynı Şey Değildir

API performansında en sık yapılan hatalardan biri client request sayısını toplam sistem işiyle eşitlemektir. GraphQL tek network round trip içinde çok sayıda resolver ve downstream dependency çalıştırabilir. REST ise birkaç cacheable request ile daha düşük origin CPU kullanabilir. Gerçek karşılaştırma payload, backend call count, database query count ve latency distribution üzerinden yapılmalıdır. Özellikle kurumsal uygulamalarda GraphQL ve REST performans güvenlik ve ölçeklenebilirlik karşılaştırması bu ayrımı hesaba katmalıdır.

Client Bir Request Görürken Backend Kaç Request Yapıyor?

Frontend developer tek GraphQL operation gönderdiğinde deneyim sade görünebilir. Ancak resolver tree beş microservice ve birkaç database query çalıştırabilir. Bu fan-out production latency ve reliability üzerinde belirgin etki yaratır. Operation tracing backend call graph'ını görünür kılmalıdır. Tek request başarısını gerçek sistem maliyeti olarak yorumlamamak gerekir.

Resolver Fan-Out

Resolver fan-out bir query'nin çok sayıda downstream operation tetiklemesidir. Nested list'ler bu sayıyı hızlı biçimde artırabilir. Batch ve data loader teknikleri gereksiz çağrıları azaltabilir. Yine de domain boundary'leri arasında çok fazla traversal tasarım problemi olabilir. Fan-out sayısı operation-level metric olarak izlenmelidir.

Downstream Dependency Sayısı

Bir operation ne kadar fazla service'e bağımlıysa failure ihtimali ve tail latency o kadar artabilir. Tek bir yavaş dependency tüm query sonucunu etkileyebilir. Partial response bazı GraphQL senaryolarında deneyimi koruyabilir. REST BFF de benzer aggregation riskine sahiptir. Dependency count architecture review sırasında görünür bir kriter olmalıdır.

Tail Latency

Tail latency en yavaş operation grubunun kullanıcı deneyimini gösterir. Çok sayıda downstream çağrı varsa en yavaş dependency toplam sürenin belirleyicisi olabilir. Ortalama latency bu problemi gizleyebilir. P95 ve p99 değerleri bu nedenle önemli SLI'lardır. Timeout budget her dependency'ye kontrollü dağıtılmalıdır.

P50 Yerine P95/P99 Ölçmek

P50 tipik kullanıcının deneyimini gösterir fakat uç problemleri yeterince açıklamaz. Enterprise uygulamalarda kullanıcıların küçük bir bölümü bile sürekli yavaşlık yaşıyorsa destek ve operasyon yükü büyür. GraphQL fan-out p99 üzerinde belirgin etkiler oluşturabilir. REST cache miss senaryoları da benzer tail davranışı gösterebilir. Karar PoC'sinde percentile dağılımı mutlaka ölçülmelidir.

GraphQL N+1 Problemi

N+1 problemi bir üst listeyi almak için bir query, listedeki her öğenin ilişkili verisini almak için ayrıca query çalıştırılmasıdır. GraphQL resolver modelinde bu sorun doğal biçimde ortaya çıkabilir. Aynı problem database ve microservice çağrılarında farklı biçimlerde görülebilir. DataLoader benzeri request-scoped batching teknikleri çağrı sayısını azaltır. Production'a çıkan GraphQL platformunda N+1 regression test ve resolver tracing temel kontroller arasında olmalıdır.

N+1 Nasıl Oluşur?

Önce bir orders listesi getirildiğini düşünelim. Her order için customer resolver ayrı database sorgusu yaparsa toplamda bir artı N sorgu çalışır. Veri sayısı yükseldikçe latency ve connection kullanımı hızla artabilir. Code review sırasında küçük resolver'lar masum göründüğü için problem kolay fark edilmeyebilir. Resolver metrics ve query count testleri bu riski görünür kılar.

Resolver Tree

GraphQL query field'lar arasında bir execution tree oluşturur. Her node kendi resolver'ını çalıştırabilir. Nested list ve relation sayısı arttıkça toplam work kolayca büyüyebilir. Query plan yalnızca schema açısından değil infrastructure maliyeti açısından da incelenmelidir. Resolver tree production tracing içinde operation ile ilişkilendirilmelidir.

Database N+1

Database N+1 aynı relation için çok sayıda küçük query gönderildiğinde oluşur. Connection pool ve database CPU gereksiz yere tüketilebilir. Batch query ile birden fazla identifier tek sorguda getirilebilir. ORM lazy loading de benzer problem oluşturabilir. Load test sırasında database query count operation bazında takip edilmelidir.

Microservice N+1

N+1 yalnızca database problemi değildir. Her listed item için ayrı microservice HTTP çağrısı yapmak daha da yüksek network maliyeti yaratabilir. Downstream servis bulk endpoint veya batch API sunabilir. BFF data source katmanı istekleri birleştirebilir. Domain service API'lerinin GraphQL tüketim modeliyle birlikte tasarlanması gerekebilir.

DataLoader Pattern

DataLoader pattern aynı request içinde benzer key tabanlı fetch çağrılarını batch ederek N+1 etkisini azaltır. Ayrıca aynı key için tekrar eden çağrılar request boyunca deduplicate edilebilir. Loader'ın lifecycle tasarımı çok önemlidir. Request dışında paylaşılan yanlış cache authorization veya stale data problemi yaratabilir. DataLoader query maliyetini kontrol eden tek mekanizma değildir.

Request-Scoped Batching

Request-scoped batching aynı GraphQL operation sırasında oluşan fetch'leri bir araya getirir. Birden fazla customer id tek bulk query içinde istenebilir. Bu yöntem database ve downstream request sayısını azaltabilir. Loader instance'ı request scope'ta tutulduğunda kullanıcılar arasında veri sızıntısı riski azalır. Batch size için güvenli maksimum sınır belirlenmelidir.

Deduplication

Aynı key bir operation içinde birkaç kez istendiğinde tek fetch sonucu paylaşılabilir. Bu durum aynı entity farklı graph yollarından erişildiğinde faydalıdır. Deduplication yalnızca aynı request içindeki tekrarları azaltabilir. Cross-request cache ayrı bir tasarım problemidir. Authorization context deduplication key oluştururken dikkate alınmalıdır.

DataLoader Ne Tür Bir Cache Değildir?

DataLoader çoğu kullanımda uzun ömürlü application veya CDN cache değildir. Temel amacı request içindeki batching ve kısa süreli deduplication sağlamaktır. Verinin dakikalar boyunca cache'te tutulacağını varsaymak yanlış olur. Cross-request cache gerekiyorsa ayrı ownership ve invalidation stratejisi tasarlanmalıdır. Bu ayrım production'da stale data ve yetki hatalarını önlemek açısından önemlidir.

GraphQL ve REST Performansını Nasıl Adil Karşılaştırırsınız?

Adil karşılaştırma aynı business use case'in iki modelde de benzer production koşullarında uygulanmasını gerektirir. Sadece payload boyutu veya request sayısı tek başına yeterli değildir. Origin CPU, database query count, CDN hit ratio, mobile latency ve cost per operation birlikte ölçülmelidir. Test data ve traffic distribution gerçeğe yakın olmalıdır. Karar tek bir benchmark grafiği yerine tüm operation ekonomisini dikkate almalıdır.

Payload Size

Payload size mobile bandwidth ve serialization maliyetini etkiler. GraphQL field selection gereksiz alanları azaltabilir. REST response sparse fieldset veya purpose-built endpoint ile optimize edilebilir. Compression iki yaklaşımda da uygulanabilir. Payload farkı gerçek ekran use case'lerinde ölçülmelidir.

Request Count

Client request count özellikle yüksek latency network'te önemlidir. GraphQL tek operation içinde birden fazla veri ihtiyacını birleştirebilir. REST BFF veya parallel request stratejisi farkı azaltabilir. Request sayısını backend request sayısıyla karıştırmamak gerekir. Kullanıcı deneyimi ve server work birlikte ölçülmelidir.

Origin CPU

GraphQL parsing, validation, query planning ve resolver execution nedeniyle ek CPU kullanabilir. REST routing ve serialization daha basit operation modeli sunabilir. Bu fark uygulama business logic'ine göre küçük veya önemli olabilir. Gerçek production benzeri load test yapılmalıdır. CPU maliyeti request başına finansal metrikle ilişkilendirilebilir.

Database Query Count

Database query count özellikle GraphQL N+1 riskini görünür kılar. Aynı business operation iki protokolde aynı veri miktarını üretse bile query plan farklı olabilir. Batch ve optimized data source farkı azaltabilir. REST endpoint de kötü implementation nedeniyle çok query çalıştırabilir. Metric protokol değil execution kalitesini ölçmeye yardımcı olur.

Resolver Latency

GraphQL resolver latency yavaş field ve dependency'leri bulmak için önemlidir. Operation toplam latency'si tek başına hangi resolver'ın problem olduğunu göstermez. Resolver tracing yüksek cardinality nedeniyle kontrollü toplanmalıdır. P95 değerleri field bazında incelenebilir. Expensive resolver'lar query cost modeline yansıtılabilir.

CDN Hit Ratio

REST GET endpoint'leri standart cache header'larıyla CDN üzerinde yüksek hit ratio sağlayabilir. GraphQL query'leri POST ve dinamik request body nedeniyle daha farklı strateji gerektirebilir. Persisted operation ve GET-based query cacheability'yi artırabilir. Hit ratio origin compute maliyetini ciddi biçimde etkileyebilir. CDN-heavy workload'da bu fark karar için güçlü sinyaldir.

Mobile Network Latency

Mobile network latency sabit data center bağlantısından çok farklıdır. Birden fazla sequential request kullanıcı bekleme süresini büyütebilir. GraphQL aggregation burada değer kazanabilir. REST BFF de benzer biçimde round trip sayısını azaltabilir. PoC gerçek veya simüle edilmiş mobile network koşullarında çalıştırılmalıdır.

P95 ve P99

Ortalama latency yalnızca genel eğilimi gösterir. GraphQL fan-out veya cache miss gibi durumlar tail latency'de daha görünür olabilir. REST'te de downstream aggregation aynı problemi yaşayabilir. P95 ve p99 birlikte takip edilmelidir. SLO'lar tipik kullanıcı kadar yavaş kullanıcı grubunu da korumalıdır.

Cost per Successful Operation

Cost per successful operation infrastructure ve observability maliyetini business işlem sayısına böler. İki protokolün gerçek ekonomik farkını görmek için güçlü bir metrik olabilir. CPU, database, network ve cache kaynakları hesaba dahil edilir. Başarısız operation'ların yeniden deneme maliyeti ayrıca düşünülmelidir. FinOps değerlendirmesi yalnızca aylık toplam faturaya bakmamalıdır.

REST'te Caching Stratejisi

REST HTTP cache modelinden doğal biçimde yararlanabilir. Cache-Control, ETag ve conditional request mekanizmaları browser, CDN ve reverse proxy katmanlarında uygulanabilir. Bu özellik public read-heavy API'lerde origin yükünü önemli ölçüde azaltabilir. Cache key tasarımı authorization ve query parametrelerini dikkate almalıdır. Yanlış cache policy hassas verinin başka kullanıcıya sunulmasına yol açabileceği için güvenlik kontrolü zorunludur.

Cache-Control

Cache-Control response'un nerede ve ne kadar süre cache'lenebileceğini belirtir. public, private, max-age ve no-store gibi direktifler kullanım amacına göre seçilir. Hassas kullanıcı verilerinde shared cache kullanımı özellikle dikkat ister. CDN davranışı header'larla uyumlu yapılandırılmalıdır. Cache policy API contract'ın operasyonel parçası olarak belgelenmelidir.

ETag

ETag belirli representation version'ını tanımlayan validator olarak kullanılabilir. Client aynı veriyi tekrar isterken If-None-Match gönderebilir. İçerik değişmemişse server body yerine 304 response dönebilir. Bu model bandwidth kullanımını azaltır. ETag üretim maliyeti ve representation varyasyonları doğru tasarlanmalıdır.

Conditional Requests

Conditional request istemcinin yalnızca veri değişmişse tam response almasını sağlar. ETag veya zaman temelli validator kullanılabilir. Mobil veya sık polling yapılan ekranlarda bandwidth tasarrufu sağlar. Cache ve concurrency kontrolü bazı operation'larda birlikte kullanılabilir. API client library'leri bu davranışı standartlaştırabilir.

Browser Cache

Browser cache tekrar eden read request'lerin network'e çıkmasını azaltabilir. Cache header'ları doğru olduğunda ek client logic gerekmez. Kullanıcıya özel response'larda private cache kontrolü önemlidir. Authentication değişiminde stale veri riski düşünülmelidir. Browser cache behavior farklı istemcilerde test edilmelidir.

CDN Cache

CDN cache kullanıcıya yakın noktada response sunarak latency ve origin yükünü azaltır. Public catalog veya statik metadata API'leri için yüksek değer sağlar. Cache key'e locale, query ve authorization varyasyonları gerektiğinde dikkat edilmelidir. Purge ve invalidation operasyon süreci açık olmalıdır. Cache hit ratio SLI olarak izlenebilir.

Reverse Proxy Cache

Reverse proxy application önünde ortak cache katmanı oluşturabilir. Internal veya public read endpoint'lerinde origin compute yükünü azaltabilir. Header ve varyasyon kuralları yanlışsa stale veya yetkisiz response riski oluşur. Cache ownership platform ekibi veya API ekibi arasında açıkça tanımlanmalıdır. Gözlemlenebilirlik cache hit ve miss davranışını göstermelidir.

GraphQL'de Caching Stratejisi

GraphQL caching tek bir katmandan oluşmaz. Normalized client cache, resolver data source cache, CDN ve persisted operation cache birbirinden farklı problemlere çözüm sunar. Client-defined response şekli klasik URL cache yaklaşımını daha zor hâle getirebilir. GET-based persisted query bu farkı belirli operation'larda azaltabilir. Cache ownership ve invalidation açık değilse hızlı sistem yerine stale data problemleri oluşabilir.

Normalized Client Cache

Normalized client cache GraphQL response içindeki entity'leri type ve identifier üzerinden ayrı kaydedebilir. Farklı query'ler aynı entity bilgisini paylaşabilir. Mutation sonrasında belirli entity cache'i güncellenebilir. Schema id politikası burada önemli olur. Client cache server veya CDN cache'in yerine geçmez.

Resolver/Data-Source Cache

Resolver data source cache tekrar eden backend erişimini azaltabilir. Database veya external API sonuçları belirli süre tutulabilir. Cache key authorization context'i ve tenant bilgisini dikkate almalıdır. Yanlış key tasarımı veri sızıntısı yaratabilir. Invalidation policy business freshness ihtiyacına göre belirlenmelidir.

CDN Cache

GraphQL CDN caching mümkündür fakat operation kimliği ve variables cache key için açık biçimde kullanılmalıdır. Persisted query veya GET request modeli süreci kolaylaştırabilir. Public query'ler shared cache için daha uygun olabilir. Kullanıcıya özel field içeren response'larda dikkatli davranmak gerekir. CDN strategy schema ve operation registry ile birlikte tasarlanabilir.

Persisted Operations

Persisted operation önceden kayıt edilmiş query'nin kısa identifier ile çağrılmasına izin verir. Request body tekrarını azaltabilir ve stable cache key oluşturmayı kolaylaştırır. Production'da arbitrary query çalıştırma ihtiyacını da azaltır. Registry CI/CD ile güncellenebilir. Operation lifecycle client release'leriyle birlikte yönetilmelidir.

GET-Based Queries

Side effect oluşturmayan GraphQL query'leri uygun formatla GET üzerinden taşınabilir. Bu yaklaşım CDN ve browser cache altyapısıyla daha doğal uyum sağlar. URL length limiti büyük dynamic query'lerde problem olabilir. Persisted operation kullanıldığında query identifier kısa tutulabilir. Sensitive variables URL loglama açısından ayrıca değerlendirilmelidir.

Cache Invalidation

Cache invalidation verinin hangi değişiklik sonrasında güncelleneceğini belirler. Graph ilişkileri bir entity update'inin birden fazla query sonucunu etkilemesine neden olabilir. Normalized client cache bu ilişkiyi belirli ölçüde yönetebilir. Server ve CDN cache için tag veya explicit purge modeli gerekebilir. Freshness requirement business use case üzerinden tanımlanmalıdır.

Cache Ownership

Bir response'un hangi katmanda cache'lendiğinin sahibi açık olmalıdır. Frontend ekibi client cache'i, platform ekibi CDN'i ve domain ekibi data source cache'i yönetebilir. Birden fazla cache katmanı aynı anda kullanıldığında invalidation behavior belgelenmelidir. Incident sırasında hangi cache'in stale veri ürettiği hızlı bulunabilmelidir. Ownership olmadan caching performans iyileştirmesinden operasyon sorununa dönüşebilir.

Persisted Queries ve Trusted Operations

Persisted query ve trusted operation yaklaşımı production GraphQL yüzeyini daha öngörülebilir hâle getirir. Client'ın her türlü arbitrary query göndermesi yerine önceden kaydedilmiş operation'lar kullanılabilir. Bu model cache, güvenlik, cost analysis ve release governance için avantaj sağlar. Operation registry schema registry ile birlikte çalışabilir. Ancak internal exploration ve developer experience ihtiyacı için development ortamında daha esnek politika uygulanabilir.

Persisted Operation Nedir?

Persisted operation query document'in server veya registry tarafında önceden kayıt edilmesidir. Client tam query yerine identifier gönderebilir. Server identifier üzerinden tanımlı operation'ı çalıştırır. Bu model request boyutunu ve parsing çeşitliliğini azaltabilir. Operation değişikliği release pipeline içinde kontrol edilebilir.

Production'da Arbitrary Query Problemi

Arbitrary query client'ın schema üzerindeki izin verilen her kombinasyonu çalıştırabilmesi anlamına gelebilir. Bu esneklik beklenmeyen query cost ve security riskleri doğurabilir. Query complexity limit tek başına her pahalı pattern'i yakalamayabilir. Trusted operations production yüzeyini bilinen operation setiyle sınırlayabilir. Public GraphQL API'de bu yaklaşım ürün gereksinimiyle dengelenmelidir.

Operation Registry

Operation registry izin verilen GraphQL operation'larını merkezi olarak saklar. Hash, operation name ve client version gibi metadata tutulabilir. Schema change sırasında hangi operation'ların etkileneceği görülebilir. Usage analytics de registry bilgisiyle ilişkilendirilebilir. Registry availability production execution modelinde kritik olabilir.

CI/CD Registration

Frontend build sürecinde kullanılan operation'lar registry'ye kaydedilebilir. Schema validation ve breaking-change kontrolü release öncesinde yapılabilir. Yeni client version production'a çıkmadan server uyumluluğu doğrulanır. Rollback için önceki operation set'i korunabilir. CI/CD integration governance'ı manuel süreçten çıkarır.

Allowlist Yaklaşımı

Allowlist yalnızca tanımlı operation'ların production'da çalışmasına izin verir. Query abuse riskini ciddi biçimde azaltabilir. Bu yöntem tüm consumer'ların kontrol edildiği BFF sistemlerinde özellikle uygundur. Public developer graph'ta arbitrary query ürün özelliği olabilir ve allowlist uygulanamayabilir. Karar consumer modeline göre verilmelidir.

Cacheability Kazanımı

Stable operation hash CDN ve application cache key oluşturmayı kolaylaştırabilir. Query document varyasyonları azalır. Variables cache key'in ayrı parçası olarak ele alınabilir. Popular operation'lar için cache hit ratio daha öngörülebilir hâle gelir. Bu avantaj cache policy ile birlikte test edilmelidir.

Security Kazanımı

Trusted operation modeli bilinmeyen query shape'lerinin production'a ulaşmasını engelleyebilir. Depth ve alias abuse gibi bazı saldırı yüzeyleri küçülür. Authorization yine her field ve object için uygulanmaya devam etmelidir. Allowlist authentication'ın yerine geçmez. Security defense-in-depth yaklaşımıyla tasarlanmalıdır.

Rollback ve Version Yönetimi

Client release rollback edildiğinde eski operation'ların registry'de hâlâ mevcut olması gerekebilir. Operation'ları hemen silmek eski mobil version'ları bozabilir. Usage analytics kaldırma zamanını belirlemeye yardımcı olur. Registry lifecycle app version stratejisiyle ilişkilendirilmelidir. Schema deprecation süreci bu modelle birlikte daha güvenli çalışır.

REST ve GraphQL'de API Contract

İki yaklaşımda da contract API'nin en önemli kurumsal varlıklarından biridir. REST için OpenAPI, GraphQL için SDL güçlü sözleşme temelleri sunar. Schema-first, code-first veya contract-first yöntemleri ekip yapısına göre kullanılabilir. Client code generation ve mocking geliştirme hızını artırabilir. Contract'ın repository ve CI/CD içinde version control altında tutulması governance açısından önemlidir.

REST + OpenAPI

OpenAPI REST endpoint, parameter, request body ve response modellerini tanımlamak için kullanılabilir. Developer portal ve client generation süreçlerini destekler. Contract diff breaking change'leri release öncesinde yakalayabilir. Spec'in gerçek implementation ile senkron kalması gerekir. Contract test bu uyumu otomatik doğrulayabilir.

GraphQL + SDL

Schema Definition Language type, field, argument ve operation contract'ını açık biçimde tanımlar. Schema developer tooling tarafından doğrudan kullanılabilir. Breaking-change detection type değişikliklerini analiz eder. Description ve deprecation metadata dokümantasyon kalitesini artırır. Schema ownership büyük graph'larda açık tanımlanmalıdır.

Schema-First

Schema-first yaklaşımda API contract implementation'dan önce tasarlanır. Frontend ve backend ekipleri sözleşme üzerinde erken anlaşabilir. Mock server geliştirme paralelliğini artırabilir. Schema review business terminology hatalarını erken yakalar. Implementation'ın contract'a uyduğu testlerle doğrulanmalıdır.

Code-First

Code-first yaklaşımda schema uygulama type ve metadata'sından üretilir. Geliştirici için tekrar eden tanımları azaltabilir. Ancak public contract'ın implementation detail'e fazla bağlı kalmaması gerekir. Generated schema CI içinde review edilebilir. Breaking-change kontrolü yine zorunludur.

Contract-First Development

Contract-first development consumer ve provider'ın önce dış davranış üzerinde anlaşmasını sağlar. REST veya GraphQL fark etmeksizin API tasarımını kod yapısından bağımsız düşünmeye yardımcı olur. Versioning ve error modeli erken konuşulur. Mocking sayesinde client ekipleri implementation tamamlanmadan ilerleyebilir. Kurumsal entegrasyonlarda coordination riskini azaltır.

Client Code Generation

OpenAPI ve GraphQL schema client type üretimi için kullanılabilir. Manuel model tekrarını azaltır. GraphQL operation-based generation yalnızca kullanılan field'lara göre type oluşturabilir. Generated code'un versioning ve package dağıtımı yönetilmelidir. Code generation kötü API contract'ını iyi hâle getirmez.

Mocking

Contract tabanlı mocking consumer ekiplerin backend hazır olmadan geliştirme yapmasını sağlar. Response örnekleri ve error senaryoları erken test edilebilir. Mock server production behavior'ını tamamen temsil etmez. Performance ve authorization ayrıca gerçek integration test gerektirir. Mock ile contract drift oluşmaması için schema veya spec kaynağından üretim tercih edilebilir.

Kurumsal API Governance

API sayısı arttıkça ortak naming, ownership ve breaking-change politikası olmadan sürdürülebilirlik zorlaşır. Governance ağır toplantılar yerine otomatik linting, contract checks ve API catalog ile günlük geliştirme sürecine entegre edilmelidir. GraphQL ve REST aynı kurumda kullanılıyorsa ortak güvenlik ve lifecycle ilkeleri belirlenmelidir. Protokole özel kurallar ayrı standardlarda tutulabilir. Governance'ın amacı ekipleri yavaşlatmak değil güvenli varsayılan yol sağlamaktır.

API Style Guide

Style guide naming, pagination, error model ve common header kullanımlarını standartlaştırır. REST ve GraphQL için ayrı bölümler bulunabilir. Örnekler soyut kurallardan daha kolay uygulanır. Guide version control içinde tutulmalıdır. Otomatik lint mümkün olan kuralları CI'da kontrol etmelidir.

Naming Convention

İsimler API'nin business dilini yansıtmalıdır. GraphQL field ve type adları ile REST resource isimleri aynı domain kavramlarını tutarlı kullanabilir. Teknik database tablo adlarını public contract'a taşımak uzun vadeli coupling oluşturabilir. Kısaltmalar kurum genelinde kontrollü kullanılmalıdır. Naming review API discoverability'yi iyileştirir.

Ownership

Her API veya schema alanının sorumlu ekibi açık olmalıdır. Incident, security update ve breaking change sırasında ownership belirsizliği ciddi gecikme yaratır. API catalog owner bilgisini tutabilir. GraphQL federation'da field veya type ownership ayrıca önem kazanır. Ownership organizasyon değiştikçe güncellenmelidir.

Breaking Change Policy

Breaking change'in ne olduğu protokole göre açıkça tanımlanmalıdır. REST response field kaldırma veya required input ekleme client'ı bozabilir. GraphQL field type değişimi veya nullability daraltma benzer risk taşır. CI contract diff bu değişiklikleri yakalayabilir. İstisnalar review ve migration planıyla yönetilmelidir.

Architecture Review

Her küçük endpoint için ağır architecture review gerekli değildir. Yeni public surface, federation subgraph veya kritik authorization modeli gibi yüksek etkili değişiklikler review alabilir. Checklist risk seviyesine göre uygulanmalıdır. Otomatik testler manuel kontrol yükünü azaltır. Review kararları kısa ADR ile belgelenebilir.

Automated Linting

Linting naming, description, pagination ve yasak pattern'leri otomatik kontrol edebilir. GraphQL schema ve OpenAPI dokümanı build sırasında analiz edilebilir. Geliştirici problemi pull request aşamasında görür. Kural mesajları düzeltme yolunu açıkça göstermelidir. Çok fazla düşük değerli kural developer experience'ı olumsuz etkileyebilir.

Contract Checks

Contract checks provider değişikliğinin mevcut consumer'ları bozup bozmadığını doğrular. Schema diff, OpenAPI diff veya consumer contract kullanılabilir. CI pipeline breaking change durumunda release'i engelleyebilir. İstisna süreci gerekiyorsa owner ve migration tarihi belirtilmelidir. Bu model production incident'lerini önleyici kontrol sağlar.

API Catalog

API Catalog kurum içindeki servis ve API'lerin bulunabilirliğini artırır. Owner, environment, documentation ve lifecycle status tutulabilir. GraphQL schema ve REST spec'leri katalogdan erişilebilir. Duplicate API üretimi azalır. Catalog güncelliğini otomatik discovery ile korumak daha sürdürülebilir olur.

GraphQL Schema Governance

GraphQL schema kurum büyüdükçe ortak product surface niteliğine dönüşebilir. Field ve type ownership açık olmazsa değişiklikler ekipler arası koordinasyon sorunu yaratır. Schema registry, breaking-change detection ve field usage analytics bu süreci destekler. Deprecation yalnızca directive eklemekten ibaret değildir. Kullanım ölçümü, iletişim ve kontrollü kaldırma birlikte yürütülmelidir.

Field Ownership

Her field'ın veri doğruluğu ve operation davranışından sorumlu ekibi belirlenebilir. Federation ortamında ownership teknik olarak da schema içinde ifade edilebilir. Sahipsiz field security ve deprecation riskidir. Owner değişiklik taleplerini review eder. API catalog ownership bilgisini görünür tutabilir.

Type Ownership

Bir GraphQL type birden fazla domain'den field alabilir. Bu durumda type'ın kavramsal sahibi ve field sahipleri ayrı olabilir. Shared type üzerinde kontrolsüz büyüme domain sınırlarını zayıflatabilir. Federation composition ownership bilgisini daha önemli hâle getirir. Type tasarımı business boundary review ile desteklenmelidir.

Schema Registry

Schema registry yayınlanan schema version'larını merkezi olarak saklar. Subgraph veya monolithic graph değişiklikleri burada takip edilebilir. Breaking-change analysis ve operation compatibility kontrolü yapılabilir. Registry production deployment pipeline'ına entegre edilebilir. Kritik dependency hâline geldiyse availability ve access control ayrıca yönetilmelidir.

Breaking-Change Detection

Schema diff field kaldırma veya type değişikliği gibi breaking değişiklikleri otomatik tespit edebilir. Ancak her teknik breaking change gerçek consumer tarafından kullanılmıyor olabilir. Field usage analytics risk seviyesini daha doğru gösterir. Yine de bilinmeyen consumer varsa güvenli tarafta kalmak gerekir. Detection release sürecinin standart adımı olmalıdır.

Field Usage Analytics

Field usage analytics hangi operation'ların hangi schema alanlarını kullandığını gösterir. Kullanılmayan deprecated field güvenli kaldırma adayı olabilir. High-cost field'lar query optimizasyonunda görünür hâle gelir. Kullanım verisi privacy ve telemetry politikalarına uygun tutulmalıdır. Operation name standardı analytics kalitesini artırır.

Deprecation Policy

Deprecation schema'nın kontrollü değişmesi için lifecycle tanımlar. Field bir anda kaldırılmak yerine önce deprecated olarak işaretlenir. Kullanım ölçülür ve consumer ekiplerine geçiş bilgisi verilir. Belirli süre sonunda kullanım kalmadığında removal yapılabilir. Politika uygulanmazsa schema eski field'larla sürekli büyüyebilir.

Deprecate

İlk adım eski field veya argument'ı açık biçimde deprecated olarak işaretlemektir. Yeni alternatif description içinde belirtilmelidir. Consumer tooling uyarı gösterebilir. Eski field hemen kaldırılmamalıdır. Deprecation tarihi kayıt altına alınmalıdır.

Measure

Deprecated field gerçekten kullanılıyor mu telemetry üzerinden ölçülmelidir. Operation registry kontrollü client'larda yüksek doğruluk sağlayabilir. Public graph'ta bilinmeyen kullanım ayrıca düşünülmelidir. Usage trend geçiş hızını gösterir. Veri olmadan removal kararı risklidir.

Communicate

Consumer ekipler deprecation ve migration planından haberdar edilmelidir. Internal portal, release note veya otomatik uyarı kullanılabilir. Yeni field'a geçiş örneği sunmak adaptasyonu kolaylaştırır. Son tarih çok kısa tutulmamalıdır. Mobile release cycle özellikle dikkate alınmalıdır.

Remove

Removal ancak kullanım kabul edilen seviyeye indiğinde yapılmalıdır. Breaking-change kontrolü final değişikliği doğrular. Eski client version'ları production'da kalıyorsa kaldırma ertelenebilir. Removal release note içinde görünür olmalıdır. Schema graveyard oluşmasını engellemek için bu adım gerçekten tamamlanmalıdır.

REST Versioning Stratejileri

REST API'lerde versioning public ve partner consumer'ların bağımsız release cycle'ını yönetmek için kullanılır. URL veya header versioning yaygın seçeneklerdir. Bununla birlikte her değişiklik yeni major version gerektirmez. Additive evolution çoğu contract değişikliğini mevcut version içinde güvenli biçimde taşıyabilir. Parallel version sayısı arttıkça support ve security maliyeti yükseldiği için sunset policy önemlidir.

URL Versioning

URL içinde /v1 veya /v2 kullanmak version'ı consumer için açık biçimde görünür yapar. Gateway routing ve documentation kolaylaşabilir. Aynı resource için parallel implementation riski oluşur. Her küçük değişiklikte yeni version çıkarılmamalıdır. Sunset tarihi baştan planlanmalıdır.

Header Versioning

Version bilgisini header veya media type içinde taşımak URL'yi daha stabil tutabilir. Client tooling bu modeli desteklemelidir. Debugging sırasında version header'ının görünür olması önemlidir. CDN cache key doğru configuration gerektirir. Kurum genelinde tek model seçmek developer experience'ı iyileştirir.

Additive Evolution

Yeni optional field eklemek çoğu client'ı bozmaz. Yeni endpoint veya optional request parameter da backward compatible olabilir. Consumer'ların bilinmeyen response field'larını tolere etmesi beklenmelidir. Additive evolution version sayısını azaltır. Contract testing yanlışlıkla breaking değişiklik yapılmasını engeller.

Sunset Policy

Eski API version'larının ne kadar süre destekleneceği açık olmalıdır. Partner ve public consumer'lara geçiş için yeterli zaman verilmelidir. Kullanım telemetry'si kapatma kararını destekler. Güvenlik güncellemesi sona eren version'lar risk oluşturur. Sunset communication teknik ve operasyon ekipleri arasında koordineli yürütülmelidir.

Parallel Version Maliyeti

Birden fazla major version aynı anda çalıştığında test ve incident surface genişler. Security patch farklı code path'lere uygulanabilir. Dokümantasyon ve support ekipleri birden fazla davranışı bilmek zorunda kalır. Infrastructure maliyeti de artabilir. Bu nedenle version lifecycle sınırsız tutulmamalıdır.

Client Migration

Yeni version çıkarmak migration planı olmadan yeterli değildir. Client hangi değişiklikleri yapacağını açık biçimde görmelidir. SDK ve örnek kod geçişi kolaylaştırabilir. Usage telemetry migration progress'i gösterir. Kritik partner'larla doğrudan iletişim gerekebilir.

GraphQL'de Versioning Yerine Schema Evolution

GraphQL çoğu zaman tek versioned endpoint yerine schema'nın additive biçimde evrimleşmesini önerir. Yeni field eklenir, eskisi deprecated edilir ve kullanım sona erdiğinde kaldırılır. Bu model mobile ve web client'ların farklı release version'larıyla aynı graph'ı kullanmasını kolaylaştırabilir. Buna karşılık deprecated field'ları gerçekten kaldırmak için telemetry gerekir. Governance yoksa schema yıllar içinde gereksiz eski alanlarla büyüyebilir.

Additive Changes

Yeni optional field veya type eklemek genellikle mevcut query'leri bozmaz. Client kullanmak istediğinde field'ı selection set'e ekler. Server ve client deployment bağımsızlığı artar. Required input değişiklikleri daha dikkatli yönetilmelidir. Additive strateji schema lifecycle'ın temel varsayımıdır.

@deprecated

@deprecated directive eski field veya enum value'nun yeni kullanım için önerilmediğini gösterir. Reason içinde alternatif açıkça belirtilmelidir. Tooling developer'a uyarı sunabilir. Directive tek başına migration sağlamaz. Usage measurement ve communication süreçleriyle tamamlanmalıdır.

Field Usage Telemetry

Field usage telemetry deprecated alanın hâlâ hangi client'lar tarafından kullanıldığını gösterir. Operation name ve client identifier verinin anlamını artırabilir. Removal tarihi gerçek kullanıma göre planlanır. Unknown consumer varsa risk modeli farklıdır. Telemetry privacy politikasına uygun tutulmalıdır.

Breaking Change'leri Engellemek

Schema registry ve CI diff kontrolü breaking change'leri release öncesinde durdurabilir. Field kaldırma veya nullability daraltma otomatik tespit edilebilir. Operation registry hangi client query'sinin kırılacağını gösterebilir. Acil değişikliklerde istisna süreci açık olmalıdır. Prevention sonradan incident çözmekten daha düşük maliyetlidir.

Deprecated Field Graveyard Problemi

Field'lar deprecated edilip hiç kaldırılmazsa schema giderek büyür. Developer autocomplete gereksiz seçeneklerle dolar. Authorization ve resolver maintenance surface genişler. Düzenli cleanup governance bu problemi azaltır. Removal için kullanım verisi ve owner sorumluluğu gerekir.

Error Handling Karşılaştırması

REST ve GraphQL hata modelini farklı şekilde sunar. REST HTTP status code'u operation sonucunun üst seviye sinyali olarak kullanabilir. GraphQL tek response içinde hem data hem errors döndürerek partial success destekleyebilir. Bu esneklik client tarafında daha ayrıntılı error handling gerektirir. Her iki modelde de domain error ile infrastructure failure birbirinden ayrılmalıdır.

REST HTTP Status Codes

REST status code gateway ve monitoring için kolay sınıflandırılabilir sinyal sunar. 404 resource bulunamadığını, 401 authentication eksikliğini ve 5xx server problemini gösterebilir. Domain detayları standard error body içinde ayrıca taşınabilir. Status code seçimi kurum genelinde standardize edilmelidir. Her business durum için özel HTTP anlamı üretmekten kaçınılmalıdır.

Standard Error Body

REST error response ortak code, message ve correlation id alanları taşıyabilir. Validation details gerektiğinde structured biçimde eklenebilir. Client yalnızca human-readable message'e göre business karar vermemelidir. Stable machine-readable error code kullanılabilir. Hassas infrastructure detayları response içinde açıklanmamalıdır.

GraphQL Data + Errors Modeli

GraphQL response aynı anda data ve errors alanlarını içerebilir. Query'nin bir kısmı başarılı olurken başka field hata verebilir. Client partial result kullanıp kullanmayacağına karar verebilir. Error extension alanları machine-readable code taşıyabilir. Infrastructure stack trace production response'a sızdırılmamalıdır.

Partial Success

Partial success dashboard ve aggregation ekranlarında kullanıcı deneyimini koruyabilir. Bir öneri servisi hata verirken temel account bilgisi yine gösterilebilir. Buna karşılık finansal transaction gibi operation'larda partial success uygun olmayabilir. Business semantics önceden tanımlanmalıdır. Client error path üzerinden hangi alanın eksik olduğunu anlayabilir.

Error Path

GraphQL error path hatanın response tree içindeki konumunu belirtir. Nested resolver failure'ını anlamayı kolaylaştırır. Observability sistemi path bilgisini operation metric'iyle ilişkilendirebilir. Dynamic field cardinality konusunda dikkatli olunmalıdır. Error path security-sensitive field isimlerini loglarken kontrollü kullanılmalıdır.

Retryable vs Non-Retryable Error

Client hangi hatanın tekrar denenebileceğini bilmelidir. Timeout veya geçici dependency failure retryable olabilir. Validation veya authorization hatası tekrar denemeyle düzelmez. Error contract bu farkı machine-readable biçimde ifade edebilir. Retry idempotency ve backoff politikasıyla birlikte tasarlanmalıdır.

Domain Error ile Infrastructure Error'ı Ayırmak

Yetersiz bakiye business domain error'dur. Database connection timeout ise infrastructure failure'dır. İki durum aynı generic error olarak sunulursa client yanlış davranabilir. Application layer anlamlı error translation yapmalıdır. Monitoring infrastructure problemlerini business rejection'dan ayrı ölçmelidir.

Authentication GraphQL ve REST'te Farklı mı?

Authentication temel olarak protokolden bağımsız identity problemidir. OAuth, OIDC, JWT, session ve API key iki modelde de kullanılabilir. Fark daha çok request surface ve gateway entegrasyonunda ortaya çıkar. Authentication tamamlandıktan sonra gerçek zorluk çoğu zaman authorization'dır. Özellikle GraphQL nested field yapısında object ve field yetkileri ayrıca değerlendirilmelidir.

OAuth/OIDC

OAuth yetkilendirme delegation modeli, OIDC ise identity katmanı için yaygın standartlar sunar. REST ve GraphQL endpoint'leri aynı identity provider ile çalışabilir. Access token scope ve audience doğru doğrulanmalıdır. Token validation gateway veya application edge üzerinde yapılabilir. Business authorization yine downstream katmanda gerekebilir.

JWT / Session

JWT stateless token modeli sunabilirken session server-side state kullanabilir. İki modelin güvenlik ve revocation trade-off'ları farklıdır. GraphQL veya REST seçimi bunlardan birini zorunlu kılmaz. Token içindeki claim'lere aşırı business anlam yüklemek coupling oluşturabilir. Identity context application'a sade biçimde aktarılmalıdır.

API Key

API key özellikle server-to-server veya partner entegrasyonlarında kullanılabilir. Tek başına kullanıcı kimliği ve detaylı authorization için yeterli olmayabilir. Rotation ve audit süreçleri gereklidir. Key URL query parametresinde taşınmamalıdır. REST ve GraphQL gateway aynı credential modelini uygulayabilir.

Authentication'ın Gateway'de Yapılması

Gateway token validation ve basic credential kontrolünü merkezi yapabilir. Böylece invalid request backend'e ulaşmadan reddedilir. Ancak downstream service kendi trust boundary'sine göre identity bilgisini doğrulamak isteyebilir. Gateway tek güvenlik katmanı kabul edilmemelidir. GraphQL resolver authorization ayrıca devam etmelidir.

Authentication ile Authorization'ı Karıştırmamak

Authentication kullanıcının kim olduğunu belirler. Authorization bu kimliğin hangi resource veya field'a erişebileceğini belirler. Başarılı login tüm verilere erişim hakkı vermez. GraphQL'de bu ayrım özellikle nested object'larda önemlidir. REST'te de object-level authorization gözden kaçırılmamalıdır.

REST Authorization Modeli

REST authorization route, resource ve object seviyelerinde uygulanabilir. Route'a erişim izni tek başına belirli resource instance'ına erişim hakkı anlamına gelmez. RBAC ve ABAC farklı policy ihtiyaçlarına göre kullanılabilir. Multi-tenant sistemlerde tenant boundary her data access noktasında korunmalıdır. Authorization testleri normal functional test kadar önemli kabul edilmelidir.

Route-Level Authorization

Route-level kontrol belirli endpoint'i hangi role veya scope'un çağırabileceğini belirler. Gateway veya web framework middleware bu kontrolü uygulayabilir. Ancak endpoint içindeki tüm resource'lar aynı yetkiye sahip olmayabilir. Bu nedenle route kontrolü ilk katmandır. Object-level policy ile tamamlanmalıdır.

Resource-Level Authorization

Resource-level authorization kullanıcının belirli kaynak kategorisine hangi operation'ları uygulayabileceğini tanımlar. Read ve write yetkileri ayrılabilir. Domain policy business role'ları dikkate alabilir. API layer yalnızca route mapping yapar. Policy merkezi veya domain servisinde uygulanabilir.

Object-Level Authorization

Object-level authorization kullanıcının belirli entity instance'ına erişip erişemeyeceğini kontrol eder. Başka müşterinin order id'sini tahmin etmek yetkisiz erişime yol açmamalıdır. Database query tenant veya owner filtresiyle sınırlandırılabilir. Testler farklı identity kombinasyonlarını doğrulamalıdır. Bu kontrol GraphQL node resolver'larında da aynı derecede önemlidir.

RBAC

Role-Based Access Control yetkileri rol grupları üzerinden yönetir. Admin, editor veya viewer gibi roller basit sistemlerde anlaşılır model sunar. Çok fazla özel istisna olduğunda role explosion oluşabilir. Business ownership role tanımlarını yönetmelidir. Route ve object kontrolü birlikte uygulanabilir.

ABAC

Attribute-Based Access Control kullanıcı, resource ve context attribute'larına göre karar verir. Tenant, region veya data classification gibi özellikler policy'ye girebilir. Daha esnek olmakla birlikte debugging ve audit ihtiyacı artar. Policy decision açıklanabilir olmalıdır. GraphQL field access için de kullanılabilir.

GraphQL Field-Level Authorization

GraphQL'de bir query aynı object içinde farklı hassasiyet seviyesindeki field'ları seçebilir. Bu nedenle yalnızca top-level operation authorization yeterli olmayabilir. Resolver, node ve edge seviyelerinde policy uygulanabilir. Field-level data access özellikle PII ve regüle veri için önemlidir. Yetki kontrolü schema tasarımının başından itibaren düşünülmelidir.

Resolver-Level Policy

Resolver belirli field'a erişmeden önce policy kontrolü yapabilir. Bu yöntem field owner'ın authorization sorumluluğunu açık tutar. Tekrarlanan policy logic merkezi helper veya directive sistemiyle standardize edilebilir. Authorization sonucu cache'lenirken identity context unutulmamalıdır. Resolver latency metric policy maliyetini de gösterebilir.

Node Authorization

Node authorization kullanıcının belirli entity'yi görme hakkını doğrular. Entity listede görünmeden önce filtre uygulanabilir. Yalnızca field masking yapmak existence leakage oluşturabilir. Tenant ve ownership policy data source seviyesinde enforce edilebilir. Testler node id enumeration senaryolarını içermelidir.

Edge Authorization

Graph relation'ın kendisi hassas olabilir. Kullanıcı iki entity arasındaki bağlantıyı görmeye yetkili olmayabilir. Edge resolver relation policy'yi kontrol edebilir. Data model yalnızca node authorization'a dayanırsa bilgi sızıntısı oluşabilir. Özellikle organizasyon ve kullanıcı ilişkilerinde bu ayrım önemlidir.

Field-Level Data Access

Bir user profile içindeki name public olabilirken personal identifier restricted olabilir. Aynı type içindeki field'lar farklı policy taşıyabilir. Schema directive veya resolver middleware ortak kontrol sağlayabilir. Unauthorized field null veya explicit error davranışı contract içinde tanımlanmalıdır. Field classification authorization sistemine bağlanabilir.

Mutation Authorization

Mutation yalnızca operation adına göre yetkilendirilmemelidir. Değiştirilen object ve input değerleri business policy'ye tabi olabilir. Örneğin manager yalnızca kendi department kaydını değiştirebilir. Policy use case içinde de doğrulanmalıdır. Resolver tek güvenlik bariyeri olmamalıdır.

Nested Object'larda Yetki Sızıntısını Önlemek

Top-level object yetkili olsa bile nested relation farklı güvenlik seviyesinde olabilir. Resolver chain her boundary'de gerekli policy'yi uygulamalıdır. DataLoader key'leri identity veya tenant sınırını yanlış paylaşmamalıdır. Normalized cache de kullanıcı değişiminde temizlenmelidir. Security test deep nested query senaryolarını kapsamalıdır.

GraphQL Query Abuse ve DoS Riskleri

GraphQL client'a query shape kontrolü verdiği için resource consumption modeli REST'ten daha dinamik olabilir. Derin nested list'ler, alias abuse ve expensive resolver kombinasyonları tek request içinde ciddi iş üretebilir. Request başına rate limit bu nedenle tek başına yeterli değildir. Query complexity, depth ve response limit birlikte uygulanmalıdır. Trusted operation modeli bilinen client'larda saldırı yüzeyini daha da azaltabilir.

Query Depth

Query depth nested relation seviyesini ölçer. Çok derin traversal backend fan-out ve response size artırabilir. Maximum depth basit koruma sağlar. Ancak düşük depth içinde geniş list'ler yine pahalı olabilir. Depth limit cost modelin yalnızca bir parçasıdır.

List Depth

Nested list'ler veri kombinasyonunu üstel biçimde büyütebilir. Bir order listesi içinde item ve item relation listeleri response boyutunu hızla artırabilir. Pagination her list field için zorunlu tutulabilir. Maximum page size schema policy ile sınırlanmalıdır. Query cost hesaplaması list cardinality tahminini kullanabilir.

Query Complexity

Query complexity field'lara ağırlık vererek operation maliyetini yaklaşık hesaplar. Basit scalar field düşük, external API resolver yüksek cost taşıyabilir. Toplam budget aşılırsa query reddedilebilir. Model gerçek production telemetry ile düzenli kalibre edilmelidir. Sabit ağırlıklar zamanla yanlış varsayıma dönüşebilir.

Field Cost

Her field aynı compute maliyetine sahip değildir. Memory içindeki scalar ile remote analytics query arasında ciddi fark olabilir. Expensive field için yüksek cost atanabilir. Pagination argument'i cost hesabına dahil edilebilir. Cost metadata schema governance içinde owner tarafından güncellenmelidir.

Alias Abuse

GraphQL alias aynı field'ı farklı isimlerle bir operation içinde tekrar çağırmaya izin verir. Saldırgan aynı expensive resolver'ı çok sayıda alias ile tetikleyebilir. Field count veya alias limit uygulanabilir. Persisted operation bu riski controlled client'larda azaltır. Security test alias amplification senaryosunu içermelidir.

Recursive Query

Schema relation'ları teorik olarak tekrar eden traversal path oluşturabilir. Depth limit recursive query'nin sonsuz büyümesini engeller. Circular domain relation'lar schema tasarımında ayrıca incelenmelidir. Query plan beklenmeyen service döngüsü oluşturmamalıdır. Federation ortamında bu risk organizasyonel dependency'lerle birleşebilir.

Expensive Resolver

Bazı resolver'lar ağır database aggregation veya external service call çalıştırabilir. Client bu field'ı çok sayıda node için seçtiğinde maliyet artar. Batch, cache veya async job modeli değerlendirilebilir. Field cost yüksek tutulabilir. Resolver-level SLI gerçek maliyeti görünür kılmalıdır.

Response Size Limit

Server yalnızca query complexity değil toplam response size için de sınır koyabilir. Çok büyük response memory ve network maliyeti oluşturur. Pagination bu riski azaltır. Compression bandwidth'i düşürse de server allocation maliyetini ortadan kaldırmaz. Limit aşıldığında client'a açık error contract sunulmalıdır.

GraphQL Rate Limiting Nasıl Tasarlanmalı?

GraphQL rate limiting yalnızca HTTP request sayısına dayanırsa gerçek compute maliyetini yansıtmayabilir. Bir küçük query ile binlerce field işleyen query aynı request sayılır. Kullanıcı, tenant, query cost ve server-time budget birlikte değerlendirilebilir. Sensitive operation için özel quota gerekebilir. Rate limit policy client'a anlaşılır error ve retry bilgisi sunmalıdır.

Request-Based Rate Limiting

Request-based limit en basit modeldir. Belirli kullanıcı veya IP için dakikadaki HTTP request sayısını sınırlar. Gateway kolayca uygulayabilir. GraphQL operation maliyet farkını göremez. Bu nedenle ilk koruma katmanı olarak kullanılabilir.

User-Based Rate Limiting

Authenticated kullanıcı başına quota anonymous IP limitinden daha adil olabilir. Kullanıcının farklı device'ları aynı budget'ı paylaşabilir. Premium veya internal role için farklı limit tanımlanabilir. User identifier güvenilir authentication context'ten alınmalıdır. Distributed rate limiter shared state gerektirebilir.

Object-Based Rate Limiting

Bazı sensitive object'lere erişim sayısı ayrıca sınırlandırılabilir. Örneğin user lookup operation enumeration saldırısına karşı object-based quota kullanabilir. Query alias kullanarak aynı request içinde çok obje istemek de hesaba katılmalıdır. Policy business güvenlik gereksinimine göre uygulanır. Bu model generic rate limiter'dan daha fazla context ister.

Query Cost Budget

Her operation hesaplanan complexity puanı kadar budget tüketebilir. Kullanıcıya belirli zaman penceresi içinde cost quota tanımlanabilir. Expensive field daha hızlı budget tüketir. Bu yöntem infrastructure kullanımını daha iyi yansıtabilir. Cost model gerçek resource ölçümüyle kalibre edilmelidir.

Server-Time Budget

Server-time budget operation'ın CPU veya execution süresine göre sınır uygulayabilir. Önceden tahmin edilen cost ile runtime ölçüm birlikte kullanılabilir. Sürekli pahalı query gönderen tenant throttle edilebilir. Timeout yalnızca güvenlik değil capacity kontrolü sağlar. Business-critical operation'lar için ayrı policy gerekebilir.

Tenant-Based Quota

Multi-tenant sistemde bir tenant diğerlerinin kapasitesini tüketmemelidir. Request ve query cost tenant bazında takip edilebilir. Plan veya sözleşmeye göre farklı quota uygulanabilir. Cost per tenant FinOps metric'iyle aynı veri kullanılabilir. Tenant identity her resolver data access'inde korunmalıdır.

Complexity-Aware Throttling

Complexity-aware throttling yüksek maliyetli operation'ları daha erken sınırlar. Aynı request limit içinde bile aşırı compute tüketimi kontrol edilir. Query score güvenlik ve capacity amaçlarıyla kullanılabilir. Client response içinde kalan quota bilgisi verilebilir. Model çok katıysa normal büyük ekran query'lerini gereksiz engelleyebilir.

GraphQL Batching Saldırıları

GraphQL bazı client veya server uygulamalarında tek HTTP request içinde birden fazla operation gönderilmesine izin verebilir. Bu özellik network optimizasyonu sağlarken rate limit atlatma ve brute force riskleri oluşturabilir. Authentication ve object lookup gibi sensitive operation'larda batching dikkatle sınırlandırılmalıdır. Batch içindeki operation sayısı ve toplam cost ayrı hesaplanmalıdır. Allowlist kullanan sistemlerde izin verilen batch behavior ayrıca tanımlanabilir.

Tek HTTP Request İçinde Çok Sayıda Operation

Request count rate limit tek HTTP request'i bir işlem sayabilir. Batch içinde yüz operation çalıştırılırsa koruma kolayca aşılabilir. Gateway payload içeriğini anlamıyorsa bu farkı göremez. GraphQL layer batch sayısını ve cost'u sınırlandırmalıdır. Production telemetry batch kullanımını ayrıca ölçmelidir.

Authentication Brute Force

Login benzeri mutation'lar aynı batch içinde çok kez çalıştırılırsa credential denemesi hızlanabilir. Sensitive authentication operation batching dışında tutulabilir. User ve IP bazlı rate limit birlikte uygulanabilir. Account lockout policy dikkatli tasarlanmalıdır. Security monitoring başarısız login pattern'lerini izlemelidir.

Object Enumeration

Alias veya batch kullanarak çok sayıda object id tek request içinde denenebilir. Object-level authorization her fetch sırasında uygulanmalıdır. Existence bilgisi unauthorized kullanıcıya sızdırılmamalıdır. Batch cost object sayısına göre artmalıdır. Audit log şüpheli enumeration pattern'lerini görünür kılabilir.

Batch Limit

Tek request içinde izin verilen operation sayısı sınırlanabilir. Toplam query complexity ayrıca hesaplanmalıdır. Limit normal client davranışına göre belirlenmelidir. Gerek yoksa batching tamamen kapatılabilir. Policy dokümantasyonda açık belirtilmelidir.

Sensitive Operation'larda Batching'i Kısıtlamak

Authentication, payment veya password reset operation'ları özel güvenlik profiline sahiptir. Bu operation'lar batch içinde çalıştırılmayabilir. Persisted operation registry policy metadata taşıyabilir. Mutation başına özel rate limit uygulanabilir. Security ekibi bu operation set'ini düzenli review etmelidir.

Introspection Production'da Açık Olmalı mı?

Introspection GraphQL developer experience'ın güçlü özelliklerinden biridir çünkü schema discovery ve tooling desteği sağlar. Production'da açık kalması tek başına güvenlik açığı olarak görülmemelidir. Asıl güvenlik authorization ve query cost kontrollerinin doğru uygulanmasına bağlıdır. Private graph'ta schema discovery gereksinimi düşükse introspection kısıtlanabilir. Trusted operations kullanılıyorsa production client'ların introspection ihtiyacı daha da azalabilir.

Developer Experience

Introspection autocomplete, schema explorer ve client tooling için büyük kolaylık sağlar. Development ve staging ortamlarında genellikle açık olması faydalıdır. Production debugging sırasında da authorized ekipler schema bilgisinden yararlanabilir. Tamamen kapatmak operasyon ekibinin işini zorlaştırabilir. Environment ve role bazlı politika daha dengeli olabilir.

Schema Discovery Riski

Introspection saldırgana mevcut type ve field isimlerini gösterebilir. Ancak field adının bilinmemesi gerçek authorization kontrolü değildir. Hassas field doğru yetkilendirilmelidir. Schema discovery saldırı hazırlığını kolaylaştırabileceği için risk modeline dahil edilir. Kapatma tek başına güvenlik stratejisi sayılmamalıdır.

Public ve Private Graph Ayrımı

Public developer graph'ta schema discovery ürün özelliğinin kendisi olabilir. Private BFF graph'ta yalnızca kurum client'ları operation çalıştırır. Bu iki yüzeye aynı introspection politikası uygulamak gerekmeyebilir. API surface matrisi kararın temelidir. Private graph allowlist ile daha kapalı bir model kullanabilir.

Authenticated Introspection

Introspection yalnızca belirli developer veya support role'larına açılabilir. Böylece production debugging korunurken anonymous schema discovery engellenir. Tooling token ile schema alabilir. Role yönetimi identity sistemine bağlıdır. Bu model operasyon ve güvenlik arasında dengeli çözüm sunabilir.

Trusted Operations Kullanılıyorsa Karar Nasıl Değişir?

Trusted operations production execution'ı kayıtlı query setiyle sınırlıyorsa normal client introspection'a ihtiyaç duymaz. Schema explorer yalnızca developer erişimine açılabilir. Query abuse surface ciddi biçimde azalır. Authorization ve data access kontrolleri yine zorunludur. Introspection kararı artık daha çok operasyon ve developer tooling tercihi hâline gelir.

API Gateway ve GraphQL Gateway Aynı Şey Değildir

API gateway network ve cross-cutting policy katmanı olarak authentication, WAF, routing ve quota gibi görevleri üstlenebilir. GraphQL gateway ise schema composition, query planning ve resolver routing gibi graph-specific sorumluluklara sahiptir. Büyük kurumsal platformda iki katman birlikte bulunabilir. Birini diğerinin yerine koymak güvenlik veya schema responsibility boşluğu oluşturabilir. Ownership sınırı architecture diagram üzerinde açık gösterilmelidir.

API Gateway Sorumlulukları

API gateway dış trafiğin ilk kontrol noktalarından biridir. TLS, authentication, WAF, request limit ve generic routing burada uygulanabilir. REST ve GraphQL trafiğini aynı platformdan geçirebilir. Payload-aware GraphQL cost kontrolünü tek başına yapmak zorunda değildir. Backend gateway ile graph gateway görevleri ayrılabilir.

Authentication

Gateway access token veya API key doğrulaması yapabilir. Invalid credential backend katmana ulaşmadan reddedilir. Identity context downstream header veya güvenilir token ile aktarılabilir. Backend bu context'e körü körüne güvenmemelidir. Service trust boundary açık tanımlanmalıdır.

WAF

WAF bilinen web saldırı pattern'lerine karşı ilk savunma katmanı sağlayabilir. GraphQL query semantics'i genel WAF tarafından her zaman tam anlaşılmayabilir. Query cost ve field authorization GraphQL layer'da kalır. WAF request size ve abuse pattern'lerini sınırlayabilir. Security defense-in-depth yaklaşımında tamamlayıcı rol oynar.

Routing

Gateway host, path veya header üzerinden request'i uygun backend'e yönlendirir. REST endpoint'lerinde route mapping doğrudan olabilir. GraphQL trafiği ayrı graph gateway'e gönderilebilir. Canary ve regional routing gateway seviyesinde uygulanabilir. Routing business field ownership bilgisine sahip olmak zorunda değildir.

Quota

Gateway kullanıcı, API key veya tenant başına request quota uygulayabilir. REST için bu çoğu zaman anlamlı ilk kontroldür. GraphQL'de request sayısı gerçek cost'u tam yansıtmaz. Graph layer ek complexity quota uygulamalıdır. İki quota birlikte kullanılabilir.

GraphQL Gateway Sorumlulukları

GraphQL gateway birden fazla schema veya data source'u tek graph altında birleştirebilir. Query hangi subgraph veya service'e gitmeli kararını verir. Field ownership ve query planning bilgisine sahiptir. Resolver latency ve downstream fan-out metric'leri burada toplanabilir. Business logic'i gateway içinde merkezileştirmekten kaçınılmalıdır.

Schema Composition

Schema composition farklı domain schema'larını birleşik graph hâline getirir. Type conflict ve ownership problemleri deployment öncesinde tespit edilebilir. Breaking change subgraph seviyesinde de kontrol edilir. Composition başarısızsa release engellenebilir. Registry bu süreci destekleyebilir.

Query Planning

Gateway client query'sini hangi backend operation'larına böleceğini planlar. Parallel fetch latency avantajı sağlayabilir. Çok fazla sequential step tail latency artırır. Query plan tracing production debugging için değerlidir. Plan cost governance metric'lerine bağlanabilir.

Resolver Routing

Field veya type hangi subgraph tarafından sahipleniliyorsa gateway ilgili servise yönlendirme yapar. Routing data model ownership'ini yansıtır. Cross-domain field sayısı artarsa distributed monolith riski oluşabilir. Timeout ve retry policy dikkatli uygulanmalıdır. Remote resolver call local method gibi düşünülmemelidir.

Field Ownership

Field ownership hangi domain takımının belirli data contract'tan sorumlu olduğunu açıklar. Schema change ilgili owner tarafından yönetilir. Yetkilendirme sorumluluğu da ownership ile birlikte tanımlanabilir. Shared field'lar belirsizlik yaratmamalıdır. API catalog ve registry bilgiyi görünür tutabilir.

İki Katmanın Birlikte Kullanılması

External traffic önce genel API gateway'den geçebilir. Authentication, WAF ve temel quota burada uygulanır. Ardından GraphQL gateway query planning ve schema policy'lerini uygular. Katman sayısı latency eklediği için ölçülmelidir. Sorumluluk tekrarına düşmeden her katmanın amacı açık tutulmalıdır.

Microservices Mimarisinde REST

REST microservice boundary ile resource boundary uyumlu olduğunda anlaşılır service contract sunabilir. Service-to-service HTTP iletişimi widespread tooling sayesinde kolay debug edilir. Her servis kendi deployment ve version lifecycle'ını yönetebilir. Buna rağmen çok chatty synchronous communication distributed monolith oluşturabilir. REST kullanmak loose coupling'i otomatik olarak garanti etmez.

Service Boundary ile Resource Boundary Uyumu

Servisin sahip olduğu resource'lar domain responsibility ile uyumlu olmalıdır. Başka servis adına data model sunmak ownership'i belirsizleştirir. API resource'ları internal database tablolarının kopyası olmamalıdır. Business capability odaklı contract daha stabil olabilir. Bounded context yaklaşımı boundary tasarımına yardımcı olur.

Loose Coupling

Loose coupling consumer'ın provider internal implementation'ını bilmemesini hedefler. REST HTTP contract bu sınırı sağlayabilir. Ancak consumer çok sayıda provider endpoint davranışına bağımlıysa coupling yine yüksektir. Versioning ve additive evolution önemlidir. Contract değişim sıklığı gerçek coupling göstergesidir.

Service-to-Service İletişim

REST service-to-service için basit ve anlaşılır model sunabilir. Timeout, retry ve circuit breaker her çağrıda düşünülmelidir. Synchronous chain uzadıkça availability etkisi büyür. Event-driven communication bazı workflow'larda daha uygun olabilir. Protocol choice interaction semantics'e göre yapılmalıdır.

HTTP Caching

Internal read endpoint'lerinde cache doğru kullanıldığında downstream load azalabilir. ETag veya reverse proxy bazı use case'lerde faydalıdır. Ancak private ve rapidly changing data için cache overhead'i değmeyebilir. Cache invalidation domain freshness ihtiyacına göre tasarlanmalıdır. Internal API olması HTTP cache avantajını ortadan kaldırmaz.

Bağımsız Deployment

Service API contract backward compatible kaldığında provider bağımsız release yapabilir. Consumer deployment beklemek zorunda kalmaz. Breaking change gerektiğinde parallel version veya migration planı uygulanabilir. Contract test bağımsız deployment güvenini artırır. REST tek başına organizational independence sağlamaz.

Microservices Üzerinde GraphQL BFF

GraphQL BFF çok sayıda backend servisini web veya mobil client için tek graph altında birleştirebilir. Client aggregation logic'i azalır ve ekran ihtiyaçlarına göre field selection yapılabilir. BFF'in domain business logic sahibi olmaması önemlidir. Gateway doğrudan her database'e bağlanırsa service ownership sınırları kırılır. GraphQL God Service oluşmasını önlemek için domain ve platform sorumlulukları ayrılmalıdır.

Client Aggregation Layer

BFF client'ın ihtiyaç duyduğu birden fazla domain bilgisini tek operation içinde sunar. Network round trip sayısı azalabilir. Aggregation server tarafında merkezi gözlemlenebilir hâle gelir. Resolver fan-out dikkatle yönetilmelidir. BFF client convenience katmanı olarak kalmalıdır.

REST/gRPC Servisleri GraphQL ile Birleştirmek

Backend servislerinin GraphQL kullanması zorunlu değildir. GraphQL data source adapter REST veya güçlü internal contract kullanan servislere çağrı yapabilir. Client tek graph görürken backend kendi uygun protokolünü korur. Bu model teknoloji migration riskini azaltır. Service API'leri bulk fetch gibi GraphQL tüketimine uygun operasyonlar sağlayabilir.

BFF'in Business Logic Sahibi Olmaması

BFF discount, payment veya order invariant gibi domain rule'ların merkezi olmamalıdır. Bu kurallar ilgili domain service tarafından sahiplenilmelidir. BFF orchestration ve response shaping görevine odaklanır. Aksi durumda farklı client kanalları farklı business behavior üretmeye başlayabilir. BFF değiştirilebilir edge layer olarak kalmalıdır.

Gateway Database Anti-Pattern

GraphQL gateway her domain database'ine doğrudan query yazarsa servis ownership'i ortadan kalkar. Schema database schema'nın birleşik görünümüne dönüşür. Database migration gateway'i zincirleme etkiler. Security ve transaction boundary belirsizleşir. Gateway ilgili domain API veya açık data access contract üzerinden çalışmalıdır.

GraphQL God Service Riskini Önlemek

Tüm business logic ve integration'ı tek GraphQL service içine toplamak büyük coupling yaratır. Schema merkezi olduğu için ekipler kolayca her behavior'ı gateway'e eklemeye başlayabilir. Architecture review gateway responsibility sınırını korumalıdır. Domain ekipleri kendi servislerinin behavior sahibi olmalıdır. Federation gerekirse distributed ownership sağlayabilir fakat ek organizasyon maliyeti getirir.

GraphQL Federation Kurumsal Ölçekte Ne Sağlar?

Federation büyük graph'ın farklı domain ekipleri tarafından bağımsız schema parçalarıyla geliştirilmesini sağlayabilir. Supergraph consumer'a birleşik contract sunarken subgraph'lar domain ownership'i korur. Schema composition ve query planning platform katmanının sorumluluğuna dönüşür. Bu model teknik olduğu kadar organizasyonel bir yatırımdır. Az sayıda ekip için federation maliyeti sağlanan faydadan yüksek olabilir.

Supergraph

Supergraph farklı subgraph schema'larının birleşik görünümüdür. Client tek schema üzerinden query gönderir. Gateway execution plan ile gerekli backend'lere ulaşır. Supergraph contract kurum genelinde önemli API varlığı hâline gelir. Governance ve breaking-change detection merkezi olarak uygulanabilir.

Subgraph

Subgraph belirli domain veya ekip tarafından sahiplenilen schema parçasıdır. Kendi field ve type sorumluluklarını tanımlar. Bağımsız deployment mümkün olabilir. Composition rule diğer subgraph'larla uyumu doğrular. Subgraph internal domain modelin tam kopyası olmamalıdır.

Domain Ownership

Federation domain ekiplerinin kendi data ve field'larını sahiplenmesine yardımcı olabilir. Platform ekibi tüm resolver'ların business sahibi olmaz. Schema ownership organizasyon boundary'leriyle uyumlu tutulmalıdır. Cross-domain field talepleri review edilebilir. Bu model doğru uygulanırsa merkezi bottleneck azalır.

Distributed Schema Ownership

Tek schema farklı ekipler arasında distributed ownership ile yönetilir. Ortak style guide ve registry zorunlu hâle gelir. Bir ekibin değişikliği başka subgraph operation'larını etkileyebilir. Composition CI bu riski erken yakalar. Ownership net değilse federation coordination maliyetini artırır.

Schema Composition

Composition subgraph schema'larını tek graph contract'ında birleştirir. Type conflict ve invalid reference deployment öncesinde bulunur. Merkezi registry composition result saklayabilir. Failed composition production release'i durdurmalıdır. Error mesajları ilgili owner'a hızlı ulaşmalıdır.

Query Planning

Federated query birden fazla subgraph'a dağıtılır. Gateway hangi fetch'lerin parallel veya sequential yapılacağını planlar. Cross-subgraph relation sayısı latency üzerinde büyük etki yaratabilir. Query plan telemetry architecture smell'leri gösterebilir. Frequently expensive path için schema redesign gerekebilir.

Federation'ın Organizasyonel Maliyeti

Federation platform ownership, schema governance ve on-call bilgisi gerektirir. Her ekip federation semantics'i anlamalıdır. Shared graph incident'leri birden fazla domain ekibini etkileyebilir. Registry, composition ve gateway infrastructure ayrı bakım ister. Organizasyon bu maliyeti taşımaya hazır değilse daha basit GraphQL BFF tercih edilebilir.

Distributed Monolith Riskini Nasıl Önlersiniz?

GraphQL federation veya REST microservices kullanmak tek başına bağımsız sistem oluşturmaz. Bir request sürekli çok sayıda domain'e dokunuyorsa deployment ayrı olsa bile runtime coupling yüksektir. Cross-domain dependency ve circular ownership architecture review'da görünür kılınmalıdır. Fan-out için ölçülebilir limitler belirlenebilir. Business boundary client convenience uğruna aşırı parçalanmamalıdır.

Bir Query Kaç Servise Dokunuyor?

Operation başına downstream service count güçlü bir coupling metriğidir. Beş veya on servise dokunan kritik query failure riskini artırabilir. Telemetry en sık çalışan query'lerin fan-out dağılımını göstermelidir. Data duplication veya read model bazı path'leri sadeleştirebilir. Her query için tek service hedeflemek de gerekli değildir.

Cross-Domain Dependency

Bir domain sürekli başka domain'in internal verisine ihtiyaç duyuyorsa boundary tekrar düşünülmelidir. Bazı ilişkiler business açısından doğal olabilir. Ancak UI convenience nedeniyle eklenen cross-domain field'lar zamanla graph'ı sıkı bağlayabilir. Contract owner dependency etkisini bilmelidir. Architecture review high-traffic path'leri önceliklendirebilir.

Circular Ownership

A domain B'ye, B domain A'ya runtime sırasında bağımlıysa circular failure zinciri oluşabilir. Graph relation bunu görünmez hâle getirmemelidir. Query planner cycle veya sequential dependency'yi metric olarak göstermelidir. Domain event veya data replication alternatif olabilir. Ownership boundary business sorumlulukla yeniden hizalanmalıdır.

Fan-Out Limitleri

Graph operation için maksimum downstream call veya subgraph count soft limit olarak belirlenebilir. Limit aşımı architecture review tetikleyebilir. Runtime query complexity de fan-out tahminini kullanabilir. Her use case'e aynı limit uygulamak gerekli değildir. Kritik operation'lar özel capacity test almalıdır.

Domain Boundary Review

Yüksek fan-out yalnızca performance problemi olarak ele alınmamalıdır. Domain boundary yanlış parçalanmış olabilir. Business workflow ve ownership modeli birlikte incelenmelidir. UI graph'ı domain architecture'ı belirlememelidir. Review sonucu service consolidation veya read model tasarımı olabilir.

Observability Karşılaştırması

REST route-level metric'lerle doğal gözlemlenebilirlik sunarken GraphQL tek endpoint nedeniyle operation ve resolver seviyesinde daha ayrıntılı telemetry gerektirir. Method, route, status ve latency REST için güçlü temel sinyallerdir. GraphQL operation name, hash, query cost ve resolver latency eklenmelidir. Distributed tracing her iki modelde de downstream dependency davranışını anlamaya yardımcı olur. Correlation ID farklı servis loglarını aynı business request altında birleştirir.

REST'te Route-Level Metrics

REST metric'leri route template üzerinden düşük cardinality ile toplanabilir. HTTP method ve status sonuçları kolay gruplanır. Latency percentile endpoint bazında hesaplanabilir. Raw URL kullanmak id nedeniyle high cardinality yaratabilir. Monitoring standardı route template kullanmalıdır.

Method

GET, POST veya diğer HTTP method metric label olarak kullanılabilir. Aynı route'un read ve write davranışı ayrılır. Method dağılımı trafik profilini gösterir. Rate limit ve cache analizi için faydalıdır. Cardinality son derece düşüktür.

Route

Route template /orders/{id} gibi normalize edilmelidir. Gerçek id metric label yapılmamalıdır. Endpoint success ve latency kolay karşılaştırılır. API version route içinde görünüyorsa migration telemetry sağlanabilir. Ownership route metadata ile ilişkilendirilebilir.

Status

HTTP status class error rate için hızlı sinyal sağlar. 4xx ve 5xx ayrı izlenebilir. Domain rejection ile infrastructure failure daha ayrıntılı application metric gerektirebilir. 429 rate limit davranışı ayrıca önemlidir. SLO genellikle server-side failure'ı uygun şekilde tanımlamalıdır.

Latency

Route latency histogram olarak ölçülmelidir. P50, P95 ve P99 ayrı anlam taşır. Cache hit ve miss dağılımı latency'yi etkileyebilir. Downstream trace root cause bulmayı kolaylaştırır. SLO kritik endpoint'ler için ayrı tanımlanabilir.

GraphQL'de Operation-Level Metrics

Tek /graphql endpoint metric'i hangi use case'in yavaş olduğunu göstermez. Operation name veya persisted hash metric boyutu olarak kullanılabilir. Query cost ve result size ek sinyal sağlayabilir. Anonymous operation production'da sınırlandırılabilir. Client name ve version controlled cardinality ile faydalı olabilir.

Operation Name

Her production operation anlamlı bir name taşımalıdır. SearchOrders ve CheckoutSummary gibi isimler observability'yi okunabilir hâle getirir. Anonymous query'ler debugging sürecini zorlaştırır. Client tooling operation naming'i enforce edebilir. High cardinality riski kontrollü operation set'inde düşüktür.

Operation Hash

Persisted operation hash benzersiz query kimliği sağlar. Aynı operation farklı client version'larında izlenebilir. Hash insan tarafından okunmadığı için name ile birlikte tutulabilir. Cache key olarak da kullanılabilir. Registry hash'i source query ile ilişkilendirir.

Query Cost

Operation metric içinde hesaplanan query cost tutulabilir. Yavaşlığın yüksek complexity ile ilişkisi analiz edilir. Tenant bazında cost distribution görülebilir. Rate limiting modelinin doğruluğu production verisiyle test edilir. Cost histogram threshold ayarını yönlendirir.

Resolver-Level Tracing

Resolver tracing hangi field'ın latency veya error ürettiğini gösterir. Her scalar field için ayrıntılı span üretmek telemetry maliyetini artırabilir. Kritik ve remote resolver'lar önceliklendirilebilir. Sampling kullanımı maliyeti kontrol eder. Field owner bilgisi trace metadata ile ilişkilendirilebilir.

Downstream Service Tracing

GraphQL ve REST aggregation katmanları downstream HTTP veya RPC çağrılarını trace etmelidir. Tek operation'ın hangi servislerde zaman harcadığı görülür. Context propagation messaging path'lerinde de korunabilir. Tail latency root cause hızlı bulunur. Trace verisi sensitive payload içermemelidir.

OpenTelemetry

OpenTelemetry farklı protocol ve service'lerde ortak telemetry standardı sağlayabilir. GraphQL operation span'ları custom instrumentation ile zenginleştirilebilir. REST framework otomatik instrumentation route metric'leri üretebilir. Vendor değişimi telemetry koduna daha az etki eder. Sampling ve attribute cardinality policy kurum genelinde belirlenmelidir.

Correlation ID

Correlation ID log ve trace event'lerini aynı request altında ilişkilendirir. Gateway mevcut id'yi kabul edebilir veya yeni üretebilir. Downstream service'lere güvenli header ile aktarılır. Client'a support amacıyla response içinde verilebilir. Kişisel veri correlation id olarak kullanılmamalıdır.

GraphQL İçin Hangi SLI/SLO'lar İzlenmeli?

GraphQL için yalnızca HTTP 200 oranına bakmak yanıltıcıdır çünkü response errors içerirken status 200 olabilir. Operation success rate, latency, resolver failure ve query complexity ayrı izlenmelidir. Downstream fan-out ve cache hit ratio performance riskini erken gösterir. Cost per operation FinOps açısından ek değer sağlar. SLO'lar teknik endpoint yerine business-critical operation'lar üzerinden tanımlanmalıdır.

Operation Success Rate

Success yalnızca HTTP status üzerinden belirlenmemelidir. GraphQL errors içeriği ve business result birlikte değerlendirilir. Partial success operation tipine göre farklı sınıflandırılabilir. SLO definition açık olmalıdır. Client cancellation gibi durumlar ayrıca ele alınabilir.

P95/P99 Operation Latency

Operation latency client'ın gerçek GraphQL use case deneyimini ölçer. Operation name bazında percentile hesaplanmalıdır. Çok farklı query shape aynı name altında kullanılmamalıdır. Persisted operation bu standardı güçlendirir. Tail latency downstream fan-out ile birlikte incelenmelidir.

Resolver Error Rate

Belirli resolver sürekli hata veriyorsa overall operation metric bunu gizleyebilir. Error rate field veya owner bazında izlenebilir. Expected business absence ile infrastructure exception ayrılmalıdır. Alarm yalnızca action alınabilir error için oluşturulmalıdır. High-cardinality field path'ler normalize edilmelidir.

Resolver Latency

Resolver latency slow data source veya N+1 problemini gösterir. P95 değerleri high-cost field'larda takip edilebilir. Local scalar resolver telemetry açısından öncelikli olmayabilir. Remote service call yapan resolver daha fazla önem taşır. Threshold field cost modelini güncelleyebilir.

Query Complexity

Query complexity trafik profilinin zaman içinde nasıl değiştiğini gösterir. Ortalama düşük olsa bile p99 çok yüksek query'ler capacity riski oluşturabilir. Client version bazında değişim analiz edilebilir. Limit aşım sayısı security metric olarak tutulabilir. Production verisi score modelini kalibre eder.

Downstream Fan-Out

Operation başına service ve database call sayısı ölçülebilir. Artan fan-out architecture regression sinyali olabilir. Federation query plan değişiklikleri bu metriği etkiler. Cache hit fan-out'u azaltabilir. SLO doğrudan fan-out'a değil kullanıcı sonucuna bağlanmalı, fan-out supporting SLI olmalıdır.

Cache Hit Ratio

Client, data source veya CDN cache hit ratio ayrı ayrı ölçülebilir. Hangi cache katmanının maliyeti azalttığı görülür. Ani düşüş latency ve CPU artışını açıklayabilir. Stale data problemi yalnız hit ratio ile görünmez. Freshness metric gerektiğinde eklenmelidir.

Cost per Operation

CPU, downstream request ve data transfer belirli operation'a dağıtılabilir. Expensive operation'lar ürün ve platform ekipleri tarafından birlikte değerlendirilebilir. Tenant planlaması bu veriden yararlanır. Optimization etkisi finansal olarak ölçülür. Maliyet metric'i kullanıcı değerinden bağımsız yorumlanmamalıdır.

Idempotency ve Mutation Güvenliği

Network timeout nedeniyle client operation sonucunu almadan bağlantı kesilebilir. Client aynı mutation veya POST'u tekrar gönderdiğinde duplicate transaction oluşabilir. REST ve GraphQL bu problemi farklı syntax ile yaşasa da business çözümü aynıdır. Idempotency key ve unique business constraint birlikte kullanılabilir. Payment ve order senaryolarında bu konu API stilinden daha kritik bir güvenilirlik gereksinimidir.

Network Retry Problemi

Server operation'ı tamamlamış fakat response client'a ulaşmamış olabilir. Client timeout görüp yeniden deneme yapar. Eğer operation idempotent değilse iki sipariş veya iki ödeme oluşabilir. Retry policy outcome belirsizliğini dikkate almalıdır. Idempotency store sonuç tekrarını güvenli hâle getirir.

REST POST Idempotency

POST varsayılan olarak idempotent kabul edilmez. Client unique idempotency key header gönderebilir. Server key ve request fingerprint'i kaydeder. Aynı key tekrar geldiğinde önceki sonuç döndürülebilir. Key retention süresi business operation'a göre belirlenmelidir.

GraphQL Mutation Idempotency

GraphQL mutation da aynı duplicate execution riskini taşır. Idempotency key mutation input içinde veya transport metadata'da taşınabilir. Resolver/application layer operation history kontrol eder. Syntax değişse de business semantics REST ile aynıdır. Mutation naming idempotency davranışını otomatik garanti etmez.

Idempotency Key

Key aynı business request'i benzersiz tanımlar. Aynı key farklı payload ile gelirse conflict oluşturulabilir. Store tenant ve operation scope'u dikkate almalıdır. Key guessing güvenlik riski yaratmamalıdır. Cleanup policy storage büyümesini kontrol eder.

Payment ve Order Senaryoları

Payment charge ve order create operation'ları duplicate side effect açısından yüksek risklidir. Idempotency application design'ın zorunlu parçası olmalıdır. Downstream payment provider'ın kendi idempotency modeli varsa adapter bu özelliği kullanabilir. Database unique constraint ek güvence sağlar. Audit log duplicate attempt'leri görünür kılar.

Duplicate Transaction'ı Önlemek

Tek mekanizmaya güvenmek yerine defense-in-depth uygulanabilir. Idempotency key, unique business identifier ve transactional check birlikte kullanılabilir. Message consumer da duplicate event delivery'yi hesaba katmalıdır. Retry testleri production öncesinde çalıştırılmalıdır. Duplicate prevention API contract dokümantasyonunda açık olmalıdır.

Pagination Tasarımı

Büyük collection'ları tek response içinde dönmek performans ve güvenlik açısından risklidir. REST offset veya cursor pagination kullanabilir. GraphQL Connection Pattern cursor tabanlı modeli schema içinde standartlaştırabilir. Büyük ve sık değişen dataset'lerde cursor genellikle daha stabil sonuç verir. Maximum page size iki protokolde de server tarafından enforce edilmelidir.

REST Offset Pagination

Offset ve limit kullanımı basit ve anlaşılırdır. Küçük veya stabil dataset'lerde yeterli olabilir. Yüksek offset database için pahalı hâle gelebilir. Liste değişirken page item'ları tekrar veya eksik görülebilir. Public API'de semantics açıkça belgelenmelidir.

REST Cursor Pagination

Cursor belirli ordering position'ını opaque token ile temsil eder. Büyük dataset'te daha stabil pagination sağlayabilir. Client page number'a doğrudan atlama imkanını kaybedebilir. Cursor içeriği public contract olmamalıdır. Expiration veya sorting change behavior tanımlanmalıdır.

GraphQL Connection Pattern

Connection pattern edges, nodes ve pageInfo yapısı sunar. Cursor-based pagination için yaygın ortak model oluşturur. Client next page bilgisini schema üzerinden alır. Total count her durumda ucuz olmayabilir. Count field'ı yalnız gerçekten gerekiyorsa sunulmalıdır.

Cursor-Based Pagination

Cursor ordered dataset üzerinde position tanımlar. Insert ve delete durumunda offset'e göre daha stabil olabilir. Cursor güvenli biçimde encode edilmelidir. Authorization değişiklikleri eski cursor sonucunu etkileyebilir. Query argument standardı kurum genelinde ortaklaştırılabilir.

Büyük Dataset'lerde Kararlılık

Milyonlarca kayıt için unbounded list operation kabul edilmemelidir. Index ve sort key pagination modeline uygun olmalıdır. Cursor query database access pattern ile hizalanmalıdır. Page size performance test ile belirlenir. Client'ın maximum limit aşmasına izin verilmemelidir.

File Upload İçin GraphQL mi REST mi?

Büyük binary payload GraphQL'in en güçlü kullanım alanlarından biri değildir. Multipart extension ile upload yapılabilir fakat interoperability ve gateway desteği ayrıca yönetilmelidir. Birçok kurumsal sistem metadata'yı API üzerinden alıp dosyayı signed URL ile object storage'a doğrudan gönderir. Bu model GraphQL ve REST'ten bağımsız çalışabilir. Büyük dosyalarda resumable upload ve virus scanning gibi gereksinimler daha önemlidir.

Binary Payload Problemi

GraphQL temel query modelinde binary upload için doğrudan standart operation sunmaz. Base64 kullanımı payload'ı büyütür. Multipart yaklaşımı ek protocol convention gerektirir. REST de büyük dosyayı application server üzerinden geçirmek zorunda değildir. Object storage direct upload çoğu zaman daha ölçeklenebilir olur.

Multipart Upload

Multipart HTTP request binary ve metadata'yı birlikte taşıyabilir. REST framework'leri bu modeli yaygın biçimde destekler. GraphQL ecosystem'de de multipart convention kullanılabilir. Gateway ve security scanning bu formatı anlamalıdır. Çok büyük dosyalarda timeout ve memory kullanımı test edilmelidir.

Signed URL Pattern

Client önce API'den kısa ömürlü upload URL alır. Dosyayı doğrudan object storage endpoint'ine gönderir. Application server binary traffic taşımadığı için compute yükü azalır. URL scope ve expiration güvenli belirlenmelidir. Upload tamamlandığında metadata operation ile finalize edilebilir.

Metadata'yı API'den, Dosyayı Object Storage'dan Göndermek

API filename, business owner ve content type gibi metadata'yı yönetebilir. Binary data storage sistemine doğrudan gider. GraphQL mutation veya REST POST upload session oluşturabilir. Business authorization URL üretmeden önce doğrulanır. Storage event sonrasında scan ve processing workflow tetiklenebilir.

Büyük Dosyalarda Resumable Upload

Büyük dosya bağlantı kesintisinde baştan gönderilmemelidir. Multipart veya resumable session parçalı yükleme sağlar. Client progress ve retry yönetebilir. Signed part URL'leri kullanılabilir. Bu problem API query stilinden çok storage transport tasarımıdır.

Büyük Export ve Report İşlemleri

Dakikalar süren büyük export işlemini normal senkron request içinde tutmak timeout ve resource kullanımı açısından risklidir. REST veya GraphQL operation job oluşturup hemen identifier döndürebilir. Worker raporu arka planda üretir. Client status endpoint veya query ile ilerlemeyi izler. Sonuç object storage signed URL üzerinden indirilebilir.

Senkron API Request'i Neden Yanlış Olabilir?

Uzun request gateway ve client timeout sınırlarına takılabilir. Connection uzun süre açık kaldığı için kaynak tüketimi artar. Client yeniden denediğinde duplicate report job oluşabilir. Async job modeli daha dayanıklı olur. Küçük ve hızlı export için synchronous model yine yeterli olabilir.

Async Job Resource

Client export job oluşturur ve job id alır. Job queued, running veya completed state taşıyabilir. REST bunu resource olarak, GraphQL mutation sonucu olarak sunabilir. Idempotency duplicate job oluşturmayı engelleyebilir. Worker retry policy ayrı tasarlanır.

Job Status Endpoint

REST GET /jobs/{id} veya GraphQL query ile job durumu alınabilir. Polling interval server tarafından önerilebilir. Subscription veya webhook alternatif olabilir. Unauthorized kullanıcı başka job bilgisini görmemelidir. Completed result expiration policy dokümante edilmelidir.

Signed Download URL

Hazır rapor application server üzerinden stream edilmek zorunda değildir. Kısa ömürlü signed URL client'a verilebilir. Storage bandwidth application compute'dan ayrılır. URL yalnızca gerekli object'e erişim vermelidir. Audit ihtiyacı download event'ini ayrıca kaydedebilir.

GraphQL Query Yerine Job Pattern

Çok büyük report'u tek GraphQL query içinde üretmeye çalışmak query timeout ve response limit problemi oluşturabilir. Mutation job başlatıp query status kontrol edebilir. Aynı pattern REST'te de uygulanır. Protocol seçimi background job ihtiyacını ortadan kaldırmaz. Workload behavior architecture'ı belirlemelidir.

Real-Time İhtiyaçlarda GraphQL ve REST

Real-time iletişim ihtiyacı GraphQL veya REST seçiminden ayrı değerlendirilmelidir. GraphQL subscription, WebSocket, Server-Sent Events, polling ve webhook farklı kullanım modelleri sunar. Client sürekli bağlantı mı yoksa server-to-server notification mı istiyor sorusu önce cevaplanmalıdır. Connection sayısı ve delivery guarantee infrastructure kararını etkiler. Her ekranı real-time yapmak gereksiz operasyon maliyeti oluşturabilir.

GraphQL Subscription

Subscription schema içinde typed real-time event akışı sunabilir. Client belirli event data shape'ini seçebilir. Connection authentication ve revalidation planlanmalıdır. Federation ve distributed event source ek tasarım ister. Subscription critical event bus'ın yerine geçmek zorunda değildir.

WebSocket

WebSocket çift yönlü uzun bağlantı sağlar. Chat ve interactive real-time uygulamalarda uygundur. Connection lifecycle ve horizontal scaling state yönetimi gerektirir. Load balancer ve proxy desteği doğrulanmalıdır. Protocol message contract ayrıca standardize edilmelidir.

Server-Sent Events

SSE server'dan browser'a tek yönlü event stream sağlar. Daha basit notification use case'lerinde WebSocket'ten düşük operasyon yükü sunabilir. HTTP altyapısıyla daha doğal çalışır. Client reconnect behavior standart özelliklerden yararlanabilir. Binary veya client-to-server real-time interaction için uygun değildir.

Polling

Polling client'ın belirli aralıklarla yeni veri istemesidir. Düşük event frekansında en basit ve güvenilir model olabilir. Conditional request veya lightweight query maliyeti azaltabilir. Çok kısa interval server yükünü artırır. Real-time ihtiyacın gerçekten saniyelik olup olmadığı sorgulanmalıdır.

Webhook

Webhook server-to-server event notification için yaygın modeldir. Partner sistem belirli endpoint sunar. Signature verification ve retry politikası gerekir. Delivery idempotency consumer tarafından yönetilmelidir. Public B2B API'lerde REST ile birlikte güçlü çözüm sunabilir.

Real-Time Gereksinimini API Stilinden Ayrı Değerlendirmek

REST kullanmak real-time yapı kurulamayacağı anlamına gelmez. GraphQL kullanmak da her event'in subscription olması gerektiği anlamına gelmez. Interaction direction, frequency ve durability requirement'ı önce tanımlanmalıdır. Critical business event message bus üzerinden taşınabilir. UI update kanalı bunun üzerine kurulabilir.

Event-Driven Mimari Üçüncü Bir Seçenektir

GraphQL ve REST çoğunlukla senkron request-response ihtiyacını çözer. Domain events, queue ve streaming ise asenkron entegrasyon problemine yöneliktir. Bu modeller birbirinin doğrudan alternatifi değildir. Kurumsal platformda REST veya GraphQL yanında event bus doğal olarak bulunabilir. Senkron ve asenkron contract'ların ownership ve versioning süreçleri ayrı yönetilmelidir.

Domain Events

Domain event business içinde gerçekleşmiş anlamlı olayı ifade eder. OrderPlaced veya PaymentCompleted buna örnek olabilir. External integration event ile birebir aynı model olmak zorunda değildir. Event producer kendi domain ownership'ini korur. Consumer kendi ihtiyacına göre reaction geliştirir.

Message Queue

Queue işleri worker'lara asenkron dağıtmak için kullanılabilir. Email, report veya image processing buna örnektir. Retry ve dead-letter policy önemlidir. At-least-once delivery idempotency gerektirebilir. Queue kullanımı REST veya GraphQL endpoint stilinden bağımsızdır.

Event Streaming

Event streaming event geçmişini belirli süre saklar ve birden fazla consumer'ın bağımsız okumasını sağlar. Analytics veya event-driven integration için değerli olabilir. Ordering ve partition strategy tasarlanmalıdır. Schema evolution async contract'ın parçasıdır. GraphQL subscription doğrudan durable event stream'in yerine geçmez.

REST/GraphQL ile Event Bus'ın Sorumluluk Ayrımı

Client command veya immediate query senkron API üzerinden yürütülebilir. Domain değişikliği event bus ile diğer servislerle paylaşılabilir. Bu ayrım request latency ile async processing'i birbirinden ayırır. BFF event bus'a doğrudan business event sahipliği yapmamalıdır. Domain service event'in gerçek üreticisi olmalıdır.

Senkron ve Asenkron Contract'ları Ayırmak

HTTP response modeli event schema'nın aynısı olmak zorunda değildir. Consumer ihtiyaçları ve lifecycle farklıdır. Async event daha uzun retention ve backward compatibility gerektirebilir. Contract registry iki tür şemayı ayrı izleyebilir. Aynı DTO'yu her yerde kullanmak güçlü coupling oluşturur.

Public API İçin REST mi GraphQL mi?

Public API için REST birçok kurumda güçlü başlangıç seçeneğidir çünkü unknown consumer, HTTP semantics ve cache modeline iyi uyum sağlar. GraphQL public developer API olarak da kullanılabilir fakat operasyon ve güvenlik kontrolleri daha yüksek olgunluk ister. Query cost ve schema governance açıkça tasarlanmalıdır. Developer portal ve SDK stratejisi protokol seçiminden bağımsızdır. Public contract'ın uzun vadeli stability hedefi kararın merkezinde olmalıdır.

Unknown Consumer Problemi

Public API'yi kimlerin hangi araçla tükettiğini tam bilemezsiniz. Consumer yıllarca eski contract davranışına bağlı kalabilir. Additive evolution ve deprecation communication önem kazanır. REST versioning bu durumda anlaşılır olabilir. GraphQL schema removal telemetry olmadan daha riskli hâle gelir.

HTTP Semantiği

Public developer'lar GET, POST, status code ve cache header kavramlarını genellikle bilir. Gateway ve proxy ürünleri de aynı semantiği anlar. Bu ortak zemin support maliyetini azaltabilir. GraphQL kendi error ve query modelini öğrenmeyi gerektirir. Consumer kitlesinin teknik profili dikkate alınmalıdır.

SDK Generation

OpenAPI üzerinden farklı diller için SDK üretilebilir. GraphQL schema ve operation'lar da typed client generation sağlar. Public API'de generated SDK'nın version ve support politikası önemlidir. SDK API contract'ın kötü noktalarını gizlememelidir. Raw HTTP kullanımı da mümkün kalmalıdır.

Rate Limit İletişimi

Public developer'ın limitini ve kalan quota bilgisini anlaması gerekir. REST response header'ları bu bilgiyi taşıyabilir. GraphQL request count yerine query cost modeli kullanıyorsa dokümantasyon daha ayrıntılı olmalıdır. Retry-after semantics açık olmalıdır. Limit ürün planıyla ilişkilendirilebilir.

Developer Portal

Portal authentication, docs, examples ve changelog için merkezi alan sağlar. REST OpenAPI explorer sunabilir. GraphQL schema explorer interactive query deneyimi sağlayabilir. Security nedeniyle production data doğrudan explorer'a açılmamalıdır. Portal contract adoption'ın önemli parçasıdır.

Curl ile Debugging

REST endpoint basit curl çağrısıyla kolay test edilebilir. GraphQL de curl ile kullanılabilir fakat query body daha uzun olabilir. Persisted operation kullanımında identifier çağrısı sadeleşir. Support ekibinin debugging deneyimi önemlidir. Basit operasyon modeli partner onboarding süresini azaltabilir.

Long-Term Contract Stability

Public API contract yıllarca yaşamak zorunda kalabilir. Business naming ve identifier semantics dikkatle seçilmelidir. Version veya schema evolution policy baştan tanımlanmalıdır. Kaldırma ve sunset süreçleri consumer migration ile birlikte yürütülmelidir. Teknoloji modası public contract değişikliği için gerekçe değildir.

Mobil Uygulamalar İçin GraphQL mi REST mi?

Mobil uygulamalar farklı app version'ları, yüksek network latency ve sınırlı bandwidth nedeniyle GraphQL için güçlü aday olabilir. Client-defined response ekranın yalnız gerekli field'ları almasını sağlar. Offline cache ve normalized entity modeli ek avantaj sunabilir. REST BFF aynı network round trip problemini purpose-built endpoint'lerle azaltabilir. Karar gerçek cihaz, battery ve network cost ölçümüyle doğrulanmalıdır.

Network Latency

Mobil bağlantıda round trip süresi data center ortamından çok daha yüksektir. Bir ekran için ardışık dört REST request kullanıcı bekleme süresini artırabilir. GraphQL tek client operation ile bu çağrıları aggregate edebilir. REST BFF de aynı sonucu sağlayabilir. Backend fan-out ayrıca ölçülmelidir.

Bandwidth

Gereksiz response alanları mobil data kullanımını artırır. GraphQL field selection payload'ı azaltabilir. REST sparse fieldset veya compact endpoint kullanabilir. Compression her iki yaklaşımda da destek sağlar. Gerçek payload farkı production screen'lerinde ölçülmelidir.

Farklı App Version'ları

Mobile kullanıcılar uygulamayı hemen güncellemez. Backend aynı anda birkaç client version'ını desteklemek zorunda kalabilir. GraphQL additive schema evolution bu konuda avantaj sağlar. Deprecated field uzun süre korunabilir. Operation registry client version kullanımını görünür kılabilir.

Client-Defined Response

Mobile ekranlar platform ve version'a göre farklı field ihtiyaçlarına sahip olabilir. GraphQL aynı schema üzerinden farklı selection set sunar. Backend yeni endpoint üretmeden client değişebilir. Field authorization ve cost control yine server sorumluluğundadır. Client esnekliği governance olmadan sınırsız bırakılmamalıdır.

Offline Cache

Normalized GraphQL client cache entity bazlı offline deneyim sağlayabilir. REST client da local database veya cache layer kullanabilir. Conflict resolution ayrı business problemidir. Cache schema migration mobile version'lar arasında yönetilmelidir. Offline capability protokol seçiminin tek sonucu değildir.

Battery ve Network Cost

Daha fazla network request cihaz radyosunun daha uzun aktif kalmasına neden olabilir. Payload ve retry sayısı battery kullanımını etkileyebilir. Tek GraphQL request avantaj sağlayabilir. Ağır query ve büyük response bunun tersini oluşturabilir. Device profiling gerçek etkiyi göstermelidir.

B2B Partner API'leri İçin Karar

B2B partner API'lerinde contract stability ve auditability genellikle response esnekliğinden daha önemlidir. Partner farklı teknoloji ve release sürecine sahip olabilir. REST ve webhook kombinasyonu anlaşılır entegrasyon modeli sağlar. GraphQL partnerin sürekli değişen ve ilişkisel veri ihtiyacı varsa gerekçelendirilebilir. Support ve versioning maliyeti teknik tasarım kadar değerlendirilmelidir.

Stable Contract

Partner integration aylar veya yıllar boyunca aynı contract'a bağlı kalabilir. Breaking change ticari operasyonu doğrudan etkiler. Additive evolution tercih edilmelidir. REST versioning veya GraphQL deprecation planı açık olmalıdır. Contract değişiklikleri önceden duyurulmalıdır.

Partner Tooling

Partner'ın kullandığı dil ve araçlar API deneyimini etkiler. OpenAPI ve standart HTTP birçok kurumsal entegrasyon aracında kolay desteklenir. GraphQL için özel client veya query tooling gerekebilir. Bu maliyet partner kapasitesine göre değerlendirilmelidir. Basit entegrasyon support yükünü azaltır.

Versioning

Partner'ın eski version'dan yenisine geçişi koordinasyon gerektirir. REST parallel version belirli süre korunabilir. GraphQL field deprecation usage telemetry ile yönetilebilir. Migration guide sağlanmalıdır. Contract owner partner communication sorumluluğunu taşımalıdır.

Auditability

Hangi partner'ın hangi operation'ı ne zaman yaptığı kayıt altına alınabilir. REST route logları bu konuda doğal sinyal sunar. GraphQL operation name ve hash audit için kullanılmalıdır. Sensitive payload loglanmamalıdır. Correlation id support ve dispute süreçlerini kolaylaştırır.

Webhooks

Partner'ın sürekli polling yapması yerine event olduğunda webhook gönderilebilir. Signature ve retry policy gereklidir. Delivery log audit açısından önemlidir. REST command API ve webhook birlikte güçlü B2B modeli oluşturur. GraphQL kullanan partner de webhook'tan yararlanabilir.

REST'in Güçlü Olduğu Senaryolar

Partner stabil resource contract ve standart tooling istiyorsa REST güçlü seçenektir. CDN veya gateway policy'leri kolay uygulanabilir. Documentation ve curl debugging basittir. Version contract partner süreçleriyle uyumludur. File ve webhook operasyonları doğal biçimde entegre edilebilir.

GraphQL'in Gerekçelendirilebildiği Senaryolar

Partner aynı büyük data graph'ından çok farklı veri kombinasyonları istiyorsa GraphQL değer sağlayabilir. Partner sayısı sınırlı ve teknik yetkinliği yüksek olabilir. Schema governance ve operation quota desteklenmelidir. Sensitive field authorization açık tasarlanmalıdır. Public arbitrary query yerine kayıtlı operation modeli değerlendirilebilir.

Regüle Sektörlerde Karar Nasıl Değişir?

Regüle sistemlerde audit, data minimization ve PII kontrolü protokol seçiminin önüne geçer. GraphQL field selection veri minimization için avantaj sunarken geniş schema yetki sızıntısı riskini artırabilir. REST purpose-built endpoint belirli role için daha dar data surface sağlayabilir. Operation allowlisting GraphQL kullanımını daha kontrollü hâle getirir. Compliance review API schema ve logging politikalarını birlikte değerlendirmelidir.

Audit Trail

Kritik data access ve mutation operation'ları audit edilmelidir. GraphQL operation name yanında accessed field classification gerekebilir. REST route ve object id audit event'ine eklenebilir. Log bütünlüğü ve retention compliance gereksinimine göre belirlenir. Hassas payload'ın tamamı loglanmamalıdır.

Data Minimization

Client yalnızca business amacı için gerekli veriyi almalıdır. GraphQL selection set bu prensibi teknik olarak destekler. Ancak schema üzerinden gereksiz field erişimi authorization ile engellenmelidir. REST role-specific representation veya endpoint kullanabilir. Data classification tasarımın merkezinde olmalıdır.

PII

Personal data field'ları schema veya API catalog içinde etiketlenebilir. Access policy field ve object seviyesinde uygulanmalıdır. Logging ve cache bu veriyi yanlışlıkla saklamamalıdır. Data retention backend sistemlerde ayrıca yönetilir. Protocol tek başına PII compliance sağlamaz.

Field-Level Access

GraphQL restricted field'lar için doğrudan resolver policy uygulayabilir. REST response içinde hassas field'ları role göre filtrelemek gerekebilir. Her iki durumda da authorization server-side olmalıdır. Client hidden field yaklaşımı güvenlik sağlamaz. Automated authorization test kritik path'leri doğrular.

Compliance Review

Yeni public veya restricted API surface security ve compliance review alabilir. Data flow, storage ve cache behavior değerlendirilir. GraphQL schema change yeni sensitive field ekliyorsa classification zorunlu olabilir. REST spec aynı metadata'yı extension ile taşıyabilir. Review otomatik policy checks ile desteklenmelidir.

Operation Allowlisting

Private GraphQL graph'ta yalnız onaylı operation'lara izin vermek compliance riskini azaltabilir. Hangi client'ın hangi field kombinasyonunu kullandığı önceden bilinir. Change review CI sürecine eklenir. Public graph için bu model ürün beklentisine uymayabilir. Risk seviyesine göre surface bazlı politika uygulanmalıdır.

Schema İçinde Veri Sınıflandırması

GraphQL schema veya REST contract içindeki alanlar public, internal, confidential ve restricted kategorileriyle sınıflandırılabilir. Bu metadata authorization, logging ve review policy'lerine bağlanabilir. Yeni restricted field eklemek otomatik security review tetikleyebilir. Data classification yalnız dokümantasyon olarak kalmamalıdır. Policy as code yaklaşımı contract metadata'sını gerçek kontrole dönüştürebilir.

Public

Public veri authentication olmadan paylaşılabilecek içeriği ifade edebilir. Yine de scraping ve rate limit riski bulunur. CDN cache bu veri için daha rahat kullanılabilir. Kişisel veri yanlışlıkla public sınıfına alınmamalıdır. Owner classification kararını review etmelidir.

Internal

Internal veri kurum içi kullanıcı veya servislerle sınırlıdır. Internet'ten erişilememesi tek güvenlik kontrolü değildir. Authentication ve service identity yine gereklidir. Internal field public schema'ya yanlışlıkla expose edilmemelidir. API catalog visibility policy ile uyumlu olmalıdır.

Confidential

Confidential veri sınırlı kullanıcı grupları tarafından görülebilir. Authorization ve audit zorunlu olabilir. Shared cache kullanımı dikkatle değerlendirilmelidir. Error message confidential içeriği sızdırmamalıdır. Field access metric güvenlik izleme için faydalı olabilir.

Restricted

Restricted en yüksek hassasiyet seviyesindeki veri için kullanılabilir. Ek onay, encryption veya audit gerektirebilir. GraphQL introspection metadata bu classification'ı herkese göstermemelidir. REST response model dar tutulabilir. Security test unauthorized access'i düzenli doğrulamalıdır.

Field Classification ile Authorization'ı Eşleştirmek

Classification doğrudan policy requirement üretebilir. Restricted field yalnız belirli role veya attribute ile erişilebilir. Schema lint field'ın authorization directive taşıdığını kontrol edebilir. REST spec extension benzer metadata sağlayabilir. Böylece security review manuel hafızadan çıkar.

Developer Experience Karşılaştırması

REST ve GraphQL farklı developer experience avantajları sunar. REST OpenAPI ve yaygın HTTP tooling sayesinde basit başlangıç sağlar. GraphQL introspection, autocomplete ve operation-based code generation ile frontend ekipleri için güçlü çalışma akışı oluşturabilir. Production debugging tarafında GraphQL daha ayrıntılı operation telemetry gerektirir. Developer experience yalnız ilk query yazma kolaylığı değil test, incident ve upgrade süreçlerini de kapsamalıdır.

REST + OpenAPI Tooling

OpenAPI interactive documentation, SDK generation ve request validation için kullanılabilir. Çoğu geliştirici HTTP endpoint modelini bilir. IDE ve test araçları geniş destek sunar. Spec drift otomatik kontrol edilmelidir. Contract-first development ekip koordinasyonunu kolaylaştırır.

GraphQL Introspection

Introspection client'ın schema'yı doğrudan keşfetmesini sağlar. IDE field ve argument bilgisini anlık sunabilir. Backend dokümantasyon güncellemesi schema ile birlikte ilerler. Production policy güvenlik modeline göre farklı olabilir. Developer portal introspection bilgisini görsel biçimde sunabilir.

Autocomplete

GraphQL tooling mevcut field ve type'ları query yazarken önerir. Frontend developer backend docs aramak için daha az zaman harcayabilir. Deprecated field uyarıları da görülebilir. REST generated client benzer IDE deneyimi sağlayabilir. DX karşılaştırması kurumun kullandığı tooling'e göre yapılmalıdır.

Code Generation

GraphQL operation selection'a göre tam response type üretebilir. REST OpenAPI endpoint bazında client model oluşturabilir. Generated types contract mismatch riskini azaltır. Build süresi ve package versioning maliyeti düşünülmelidir. Generated kodun source review ihtiyacı düşük tutulabilir.

Mocking

Her iki model contract tabanlı mock server oluşturabilir. Frontend backend olmadan ekran geliştirebilir. GraphQL schema default mock data sağlayabilir. REST example response'lar spec içinde tutulabilir. Mock davranışı gerçek authorization ve latency'yi temsil etmez.

Local Debugging

REST curl ve browser network panel ile kolay incelenebilir. GraphQL explorer ve operation document güçlü debug ortamı sunar. Local stack'in hızlı ayağa kalkması iki modelde de önemlidir. Persisted operation development ortamında gerektiğinde bypass edilebilir. Error response developer'a yeterli context vermelidir.

Production Debugging

REST route ve status metric'leri incident triage için hızlı sinyal sağlar. GraphQL operation name ve resolver trace olmadan tek endpoint logu yetersiz kalır. Platform baştan bu telemetry'yi sağlamalıdır. Support ekibi operation hash'i registry'den query'ye çevirebilmelidir. Production DX architecture kararının gerçek maliyetlerinden biridir.

Team Topology Kararı Nasıl Etkiler?

API teknolojisi organizasyon yapısından bağımsız değildir. Tek full-stack takımın yönettiği ürün ile onlarca domain takımının ortak graph geliştirdiği platform aynı governance ihtiyacına sahip olmaz. Frontend ve backend ekipleri ayrıldığında GraphQL client autonomy değer kazanabilir. Platform team yoksa federation ve schema governance maliyeti zor yönetilebilir. API ownership organizasyon boundary'leriyle uyumlu kurulmalıdır.

Tek Full-Stack Takım

Tek takım frontend ve backend'i birlikte release ediyorsa coordination maliyeti düşüktür. Basit REST endpoint'leri çoğu zaman yeterli olabilir. GraphQL yine ekran aggregation için değer sağlayabilir. Platform overhead küçük ekip için dikkatle değerlendirilmelidir. Takımın gerçek problemi teknoloji seçimini yönlendirmelidir.

Ayrı Frontend ve Backend Takımları

Frontend backend release'ini sürekli bekliyorsa client autonomy önemli hâle gelir. GraphQL schema mevcut field'ları farklı kombinasyonlarda kullanmayı kolaylaştırır. Yeni domain field yine backend geliştirmesi gerektirir. Contract-first REST de coordination sorununu azaltabilir. Team workflow ölçülmeden protokol sorumlu tutulmamalıdır.

Platform Team

GraphQL registry, gateway, query cost ve observability ortak platform capability gerektirebilir. Platform team bu araçları ürün ekipleri için paved road hâline getirebilir. REST governance ve gateway de platform desteğinden faydalanır. Platform olmayan kurumda her ekip kendi güvenlik çözümünü üretmemelidir. Operasyon kapasitesi teknoloji kararının gerçek constraint'idir.

Çok Sayıda Domain Takımı

Birleşik data graph farklı domain'lerin schema contribution yapmasını gerektirebilir. Federation distributed ownership sağlayabilir. Ortak schema standardı ve composition pipeline gerekir. Cross-domain dependency review organizasyonel iletişimi artırır. Daha basit BFF modeli bazı kurumlarda daha düşük maliyetli olabilir.

Mobile/Web Takımlarının Ayrı Olması

Mobil ve web aynı backend verisini farklı şekillerde kullanabilir. GraphQL iki client'ın kendi selection set'ini oluşturmasını sağlar. REST tarafında iki BFF veya client-specific endpoint gerekebilir. Ortak schema field usage analytics iki takımın ihtiyacını görünür kılar. Client ownership operation naming standardına yansıtılabilir.

API Ownership

Her API surface için teknik ve business owner belirlenmelidir. Schema veya spec değişikliklerini bu ekip review eder. On-call ve security incident sorumluluğu da açık olmalıdır. Shared gateway sahipliği platform ekibinde olabilir. Ownership belirsizliği teknoloji seçiminin sağladığı faydayı hızla azaltır.

GraphQL İçin Organizasyonel Hazırlık Checklist'i

GraphQL production platformu kurmadan önce kurumun yalnız query yazmayı değil operation governance ve on-call sorumluluğunu da destekleyebildiği doğrulanmalıdır. Schema owner, platform ekibi ve resolver observability temel ihtiyaçlardır. Query complexity ve breaking-change kontrolleri otomatik olmalıdır. Security ekibi field-level authorization ve abuse senaryolarını anlamalıdır. Bu hazırlık yoksa REST veya daha sınırlı GraphQL BFF ile başlamak daha düşük risk taşıyabilir.

Schema Owner Var mı?

Schema tasarım standardı ve lifecycle kararlarını yönetecek owner belirlenmelidir. Owner her field'ın kendisi tarafından geliştirilmesi anlamına gelmez. Governance ve dispute resolution sorumluluğunu taşır. Federation ortamında platform ve domain owner rolleri ayrılabilir. Ownership olmadan schema kontrolsüz büyüyebilir.

Platform Ekibi Var mı?

Gateway, registry ve shared observability ortak bakım gerektirir. Küçük graph'ta ayrı platform ekibi zorunlu olmayabilir. Ölçek büyüdükçe merkezi capability ihtiyacı artar. Uygulama ekipleri altyapı detaylarıyla sürekli uğraşmamalıdır. Platform roadmap ürün ekiplerinin ihtiyaçlarına göre yönetilmelidir.

Resolver Observability Var mı?

Production'da hangi resolver'ın yavaş veya hatalı olduğunu görebilmek gerekir. Operation metric tek başına yeterli olmayabilir. Remote resolver'lar tracing ile izlenmelidir. N+1 query count metric'i bulunmalıdır. Telemetry maliyeti sampling ile kontrol edilebilir.

Query Complexity Koruması Var mı?

Depth, list ve field cost limitleri birlikte düşünülmelidir. Arbitrary query açık graph'ta özellikle önemlidir. Trusted operations risk surface'ini azaltabilir. Cost model production telemetry ile güncellenmelidir. Limitler normal client'ı gereksiz engellememelidir.

Breaking-Change Kontrolü Var mı?

Schema diff CI içinde otomatik çalışmalıdır. Operation registry mevcut consumer etkisini gösterebilir. Deprecated field removal kontrollü yapılmalıdır. Emergency change için exception policy bulunmalıdır. Mobile client lifecycle ayrıca hesaba katılmalıdır.

Security Ekibi GraphQL'i Destekliyor mu?

Security ekibi introspection, field authorization ve batching risklerini anlamalıdır. Genel REST WAF policy'si tek başına yeterli olmayabilir. Penetration test query abuse senaryolarını içermelidir. Schema data classification security review'a bağlanabilir. Security ownership product ekibiyle paylaşılmalıdır.

On-Call Ekibi Production GraphQL Debug Edebiliyor mu?

Incident sırasında operation name, resolver trace ve downstream call path bulunabilmelidir. On-call query plan davranışını temel seviyede anlamalıdır. Runbook sık failure mode'ları açıklamalıdır. Registry ve dashboard erişimleri hazır olmalıdır. Eğitim yalnız geliştirme döneminde kalmamalıdır.

Toplam Sahip Olma Maliyeti (TCO)

GraphQL veya REST kararını yalnız implementation süresiyle karşılaştırmak eksik olur. Infrastructure, CDN, compute, observability, tooling, training ve governance uzun vadeli toplam maliyetin parçalarıdır. GraphQL frontend geliştirme hızını artırırken platform maliyetini yükseltebilir. REST operasyonu daha sade tutarken çok sayıda client-specific endpoint development cost üretebilir. Üç yıllık TCO hesabı organizasyonun gerçek kullanım modeline göre yapılmalıdır.

Development Cost

GraphQL schema ve resolver geliştirme başlangıç yatırımı ister. Frontend operation geliştirme süresi daha kısa olabilir. REST'te endpoint ve DTO geliştirme basit use case'lerde hızlıdır. Çok sayıda client-specific endpoint development maliyetini artırabilir. PoC gerçek feature implementation süresini ölçmelidir.

Infrastructure Cost

GraphQL gateway, registry ve cache layer ek servisler gerektirebilir. REST gateway ve documentation platformu da maliyetsiz değildir. Managed ve self-hosted seçeneklerin personel etkisi hesaba katılmalıdır. High availability gereksinimi shared gateway maliyetini artırır. Infrastructure TCO business traffic ile birlikte modellenmelidir.

CDN Cost

CDN origin load azaltırken trafik ve request maliyeti oluşturur. REST yüksek hit ratio ile compute tasarrufu sağlayabilir. GraphQL persisted query ile benzer avantaj elde edebilir. Cache miss pattern'leri gerçek trafikle ölçülmelidir. Data transfer maliyeti payload optimizasyonuyla birlikte değerlendirilmelidir.

Compute Cost

GraphQL query parsing ve resolver execution CPU tüketir. REST endpoint daha predictable work profiline sahip olabilir. Business logic çoğu zaman protocol overhead'den daha büyük maliyet oluşturur. Cost per operation gerçek farkı gösterir. Autoscaling policy tail traffic'i hesaba katmalıdır.

Observability Cost

GraphQL resolver tracing telemetry hacmini artırabilir. REST route metric'leri daha düşük cardinality ile yeterli olabilir. Log ve trace retention doğrudan maliyet üretir. Sampling kritik operation'lar için farklı uygulanabilir. Operasyon görünürlüğünü maliyet uğruna tamamen azaltmak yanlış tasarruftur.

Tooling Cost

Schema registry, contract test ve client generation araçları maintenance ister. OpenAPI tooling de aynı şekilde build süreçlerine entegre edilir. Lisans ve mühendislik zamanı birlikte hesaplanmalıdır. Internal platform geliştirmek de ücretsiz değildir. Tooling adoption oranı sağladığı değeri belirler.

Training Cost

GraphQL query syntax öğrenmek kolay olsa da production operasyon modeli daha geniş bilgi ister. Resolver performance, authorization ve federation eğitim gerektirebilir. REST ekipte zaten biliniyorsa onboarding daha hızlı olabilir. Standart project template öğrenme maliyetini azaltır. Eğitim TCO içinde gerçek mühendislik zamanı olarak yer almalıdır.

On-Call Cost

Complex query veya federation incident'i daha senior expertise gerektirebilir. REST route-level incident bazı ekipler için daha kolay debug edilir. On-call ticket sayısı ve MTTR gerçek maliyeti gösterir. Platform iyileştirmeleri zamanla bu farkı azaltabilir. Technology choice support burden ile birlikte değerlendirilmelidir.

Governance Cost

Schema review, API style guide ve deprecation süreçleri ekip zamanı kullanır. Governance olmaması ise daha büyük migration ve incident maliyeti yaratabilir. Otomasyon manuel toplantı ihtiyacını azaltır. Federation governance tek GraphQL BFF'ten daha pahalıdır. Kurum yalnız ihtiyaç duyduğu seviyede süreç kurmalıdır.

GraphQL'de FinOps ve Query Cost

GraphQL client'a esnek query modeli sunduğu için resource maliyetini operation bazında görünür hâle getirmek özellikle değerlidir. CPU, downstream request ve expensive field kullanımı tek query cost modelinde ilişkilendirilebilir. Tenant bazlı maliyet multi-tenant ürünlerde fiyatlandırma ve quota kararını destekler. Cost-aware rate limiting yoğun kullanıcıların sistemi adaletsiz tüketmesini önleyebilir. FinOps güvenlik limitinin değil business verimlilik analizinin de parçasıdır.

Operation Başına CPU

Application profiler veya infrastructure metric CPU kullanımını operation'a yaklaşık dağıtabilir. Yüksek cost query'ler belirlenir. Schema change sonrası CPU regression görülebilir. Optimization finansal etkiyle ölçülür. Çok düşük trafik operation'lara gereksiz optimizasyon yapılmamalıdır.

Downstream Request Sayısı

Her operation'ın kaç service ve database çağrısı yaptığı kaydedilebilir. Query cost bu sayıya ağırlık verebilir. Cache hit call count'u azaltır. Artış architecture regression göstergesi olabilir. Federation query plan değişiklikleri yakından izlenebilir.

Tenant Bazlı Maliyet

Multi-tenant GraphQL gateway operation cost'u tenant identifier ile ilişkilendirebilir. Büyük tenant'ların kullanım profili görünür olur. Fiyatlandırma veya fair-use quota desteklenebilir. Hassas tenant id metric cardinality açısından kontrollü kullanılmalıdır. Aggregated reporting operasyon dashboard'undan ayrı tutulabilir.

Expensive Field'lar

Remote analytics veya büyük aggregate hesaplayan field'lar diğerlerinden pahalıdır. Schema metadata ile field cost tanımlanabilir. Client field'ı gerçekten kullanmıyorsa kaldırabilir. Cache veya async job modeli düşünülebilir. Usage ve business value birlikte değerlendirilmelidir.

Cost-Aware Rate Limiting

Client yalnız request sayısına değil tükettiği resource puanına göre sınırlandırılabilir. Cheap query daha yüksek frekansla çalışabilir. Expensive operation daha fazla quota tüketir. Model product planlarına bağlanabilir. Kullanıcıya anlaşılır quota feedback verilmelidir.

REST ve GraphQL Test Stratejisi

İki protokol de unit, integration, contract, authorization, performance ve security testlerine ihtiyaç duyar. REST OpenAPI diff, GraphQL schema diff ile contract değişikliği kontrol edilebilir. GraphQL query complexity ve N+1 gibi ek production testleri gerektirir. Load test gerçek consumer operation karışımını kullanmalıdır. Test stratejisi yalnız happy path response doğrulamasından ibaret olmamalıdır.

Unit Tests

Domain ve application logic protocol'den bağımsız unit test edilmelidir. Resolver veya controller içinde business logic bulunması test maliyetini artırır. Data source helper'ları ayrı test edilebilir. Unit test hızlı ve deterministik olmalıdır. Authentication framework context'i gerektirmemelidir.

Integration Tests

REST controller ve GraphQL resolver gerçek application layer ile test edilebilir. Database ve downstream adapter behavior ayrıca doğrulanır. Test container production'a yakın environment sağlar. Error translation ve transaction sınırları gözlemlenir. Integration suite unit test kadar geniş olmamalıdır.

Contract Tests

REST consumer OpenAPI veya consumer-driven contract kullanabilir. GraphQL operation'lar schema karşısında validate edilebilir. Federation subgraph composition da contract test türüdür. Breaking provider değişikliği release öncesinde bulunur. Contract test runtime business correctness'in tamamını doğrulamaz.

Schema/OpenAPI Diff

Her pull request contract artifact'i önceki production version ile karşılaştırabilir. Removed field veya required parameter gibi breaking değişiklikler tespit edilir. Additive değişiklikler otomatik onaylanabilir. İstisna manual review alabilir. Diff sonucu release artifact'iyle birlikte saklanabilir.

Authorization Tests

Her kritik resource ve field için authorized ve unauthorized scenario yazılmalıdır. Tenant isolation özellikle test edilmelidir. GraphQL nested query authorization leakage kontrolü ister. REST object enumeration benzer risk taşır. Security test normal regression suite'in parçası olmalıdır.

Performance Tests

Gerçek business operation belirli latency ve resource target ile test edilir. GraphQL query selection production usage'a benzemelidir. REST cache hit ve miss ayrı ölçülebilir. Database query count test sonucu kaydedilir. Regression threshold architecture fitness function olarak kullanılabilir.

Load Tests

Load test yalnız tek endpoint'i maksimum hızda çağırmamalıdır. Production operation mix ve concurrency modellenmelidir. Heavy ve light GraphQL query oranı gerçeğe yakın tutulmalıdır. CDN ve cache davranışı dahil edilmelidir. P95 ve p99 capacity kararını yönlendirir.

Security Tests

Authentication bypass, object authorization ve rate limit kontrol edilir. GraphQL depth, alias ve batching abuse ayrıca test edilir. REST parameter tampering ve mass assignment değerlendirilir. Sensitive error leakage kontrol edilmelidir. Testler yeni schema veya endpoint ile güncellenmelidir.

GraphQL'e Özel Production Testleri

GraphQL flexible execution modeli nedeniyle klasik API testlerinin yanında özel regression kontrolleri gerektirir. N+1, query depth, cost, batching ve field authorization temel alanlardır. Persisted operation registry ile schema uyumu release öncesinde test edilmelidir. Bu testler production query'lerine yakın operation set'i kullanmalıdır. Platform pipeline yeni subgraph veya schema değişikliğinde otomatik çalıştırabilir.

N+1 Regression Test

Belirli query için maksimum database veya service call sayısı assertion olarak tutulabilir. Yeni resolver change çağrı sayısını artırırsa test başarısız olur. Dataset büyüklüğü gerçek relation pattern'ini göstermelidir. DataLoader batching behavior doğrulanır. Bu test performans regression'ını production öncesinde yakalar.

Query Depth Test

Maximum depth üzerindeki query server tarafından reddedilmelidir. Normal product query'lerinin limiti aşmadığı doğrulanır. Recursive schema path test edilir. Error response client için anlaşılır olmalıdır. Depth limit configuration drift'i CI tarafından yakalanabilir.

Query Cost Test

Known expensive query beklenen complexity puanını üretmelidir. Schema field cost değişikliğinde score regression görülebilir. Normal operation budget altında kalmalıdır. Aşırı operation uygun error almalıdır. Cost hesaplayıcının bypass edilemediği security test ile doğrulanır.

Batching Abuse Test

Tek request içine maksimumdan fazla operation gönderilir. Server request'i kontrollü reddetmelidir. Sensitive mutation batch policy ayrıca test edilir. Rate limit batch içindeki gerçek cost'u hesaba katmalıdır. Gateway ve Graph layer davranışı birlikte doğrulanır.

Field Authorization Test

Restricted field unauthorized identity ile query edilir. Nested relation ve alias ile kontrol bypass edilmeye çalışılır. DataLoader cache tenant sınırını ihlal etmemelidir. Authorized role doğru veriyi almalıdır. Schema change yeni restricted field eklediğinde test zorunlu olabilir.

Schema Breaking-Change Test

Candidate schema production schema ile karşılaştırılır. Registry mevcut persisted operation'ları candidate üzerinde validate eder. Kullanılan field removal release'i engeller. Deprecation removal policy kontrol edilir. Federation composition ayrıca çalıştırılır.

Persisted Operation Test

Kayıtlı operation hash doğru query'ye çözülmelidir. Unknown hash production policy'ye göre reddedilir. Eski mobile version operation'ları hâlâ çalışmalıdır. Registry unavailable failure mode test edilir. Rollback sırasında önceki operation set'i doğrulanır.

REST'ten GraphQL'e Migration

REST'ten GraphQL'e geçiş big-bang rewrite olmak zorunda değildir. Existing REST servisleri GraphQL resolver data source olarak kullanılabilir. İlk use case olarak read-heavy ve aggregation problemi belirgin ekran seçmek faydalıdır. REST ve GraphQL belirli süre paralel çalışabilir. Adoption telemetry gerçek değeri gösterdikten sonra gereksiz endpoint'lerin kaldırılması değerlendirilebilir.

GraphQL Facade ile Başlamak

Mevcut backend'i yeniden yazmadan üstüne GraphQL facade eklenebilir. Facade client aggregation ihtiyacını çözer. Domain service'ler aynı kalır. Bu yöntem migration riskini azaltır. Gateway God Service'e dönüşmemesi için business logic sınırı korunmalıdır.

Existing REST'i Resolver Olarak Kullanmak

Resolver mevcut REST endpoint'ini çağırıp schema field'ına map edebilir. Böylece backend service migration gerektirmez. Bulk endpoint eksikse N+1 problemi oluşabilir. REST API GraphQL kullanım pattern'ine göre optimize edilebilir. Downstream contract yine bağımsız kalır.

İlk Use Case'i Seçmek

GraphQL değerinin ölçülebileceği ekran seçilmelidir. Çok domain aggregation veya mobile network problemi güçlü adaydır. Basit CRUD ekran pilot için zayıf sinyal verir. Success criteria önceden belirlenmelidir. Developer time ve operation cost birlikte ölçülmelidir.

Read-Heavy Ekranlarla Başlamak

Read operation'lar mutation idempotency ve transaction sorunlarını pilot dışında tutar. Aggregation faydası daha kolay ölçülür. Client cache deneyimi test edilir. N+1 ve query cost mekanizmaları production öncesinde denenir. Başarılı model daha sonra write operation'lara genişletilebilir.

Parallel Operation

REST endpoint ve GraphQL query belirli süre birlikte çalışabilir. Aynı business data iki yol üzerinden karşılaştırılır. Traffic kontrollü biçimde yeni yüzeye taşınır. Error ve latency metric'leri yan yana incelenir. Parallel period süresiz bırakılmamalıdır.

Adoption Telemetry

Hangi client'ın GraphQL operation kullandığı ölçülmelidir. REST endpoint trafiği migration progress'i gösterir. Frontend implementation time ve payload reduction gibi faydalar kaydedilebilir. Backend cost artışı da görünür olmalıdır. Veri migration kararını duygusal tartışmadan çıkarır.

REST Endpoint'lerini Ne Zaman Kaldırmalı?

Consumer kullanımının bittiği kanıtlanmadan endpoint kapatılmamalıdır. Public veya partner consumer varsa migration süresi daha uzundur. Internal endpoint de başka automation tarafından kullanılıyor olabilir. API catalog ve telemetry doğrulama sağlar. Sunset policy sonunda güvenli removal yapılabilir.

GraphQL'den REST'e veya Hibrit Modele Geri Dönüş

GraphQL seçimi geri döndürülemez bir karar değildir. Bazı yüksek cache'li read endpoint'leri REST'e ayırmak toplam maliyeti düşürebilir. File ve export operation'ları zaten farklı transport modeli gerektirebilir. Public surface REST olurken GraphQL yalnız internal BFF olarak tutulabilir. Hibrit mimari teknoloji başarısızlığı değil doğru surface ayrımının sonucu olabilir.

High-Cache Endpoint'leri Ayırmak

Public catalog veya static content query'si CDN hit ratio açısından REST GET olarak daha verimli olabilir. GraphQL aynı backend data source'u kullanmaya devam edebilir. Client ihtiyacına göre iki surface birlikte yaşayabilir. Duplicate business logic oluşturulmamalıdır. Cache maliyeti ölçümle karar verilmelidir.

File/Export Operation'larını REST'e Taşımak

Binary upload ve large download için REST veya direct storage daha doğal olabilir. GraphQL metadata ve job control için kullanılabilir. Aynı product içinde farklı transport kullanmak sorun değildir. Authentication policy tutarlı kalmalıdır. API documentation surface ayrımını açık göstermelidir.

Public Surface'i REST'e Çıkarmak

Internal web/mobile graph korunurken external developers için REST contract tasarlanabilir. Public API daha dar business capability sunabilir. Internal schema'nın tamamı dışarı açılmaz. Versioning ve developer portal public surface'e göre şekillenir. Domain service iki adapter tarafından kullanılabilir.

GraphQL'i Sadece BFF Olarak Tutmak

GraphQL'in en yüksek değer ürettiği alan client aggregation olabilir. Domain servisleri REST veya başka internal contract kullanmaya devam eder. Federation ihtiyacı olmadan tek BFF daha basit yönetilebilir. Client-defined response avantajı korunur. Public ve partner governance ayrı kalır.

Hibrit Kurumsal Mimari Örneği

Birçok kurum için tek protokol yerine bilinçli hibrit mimari daha dengeli sonuç verir. Public developer API REST, partner entegrasyonları REST ve webhook, web ve mobil BFF GraphQL olabilir. Internal service communication farklı performans ve contract ihtiyaçlarına göre seçilir. Async domain event'ler message bus üzerinden taşınır ve büyük dosyalar object storage ile yönetilir. GraphQL bu yapıda business logic sahibi değil client-oriented aggregation katmanıdır.

Public Developer API → REST

Public developer API uzun ömürlü ve unknown consumer dostu contract sunar. OpenAPI documentation ve standard HTTP semantics kullanılır. Rate limit ve versioning açık biçimde anlatılır. CDN cache gerekli read surface'lerde uygulanır. Internal domain model public response'a doğrudan taşınmaz.

Partner Integrations → REST + Webhooks

Partner command ve query operation'ları REST ile yürütülebilir. Async değişiklikler webhook ile bildirilebilir. Partner sürekli polling yapmak zorunda kalmaz. Signature, retry ve audit standardı oluşturulur. Version lifecycle sözleşmelerle uyumlu planlanır.

Web/Mobile BFF → GraphQL

Web ve mobil aynı graph üzerinden farklı selection set kullanabilir. Backend domain data BFF tarafından aggregate edilir. Persisted operation production güvenliğini artırabilir. Resolver observability ve cost limit platform standardıdır. Client-specific business logic BFF'e taşınmaz.

Internal Services → REST/gRPC

Internal service communication UI query flexibility ihtiyacına sahip olmayabilir. Basit request-response için REST değerlendirilebilir. Strong contract ve düşük latency gereken alanlarda gRPC değerlendirilebilir. Protocol diversity approved pattern'lerle sınırlandırılmalıdır. Service ownership ortak API catalog içinde görünür olmalıdır.

Async Domain Events → Message Bus

Business event'ler senkron client API'den ayrı kanalda yayınlanır. Consumer servisler kendi processing hızında çalışır. Retry ve idempotency event contract'ın parçasıdır. BFF event producer business owner olmaz. Domain service event'in gerçek kaynağıdır.

Large File Transfer → Object Storage

API upload session ve authorization yönetir. Client dosyayı signed URL ile storage'a gönderir. Download da kısa ömürlü link üzerinden yapılabilir. Application server binary throughput taşımak zorunda kalmaz. Malware scan ve lifecycle policy storage workflow'unda uygulanır.

GraphQL'in Business Logic Sahibi Olmaması

GraphQL BFF client convenience ve orchestration katmanı olarak kalır. Discount, order veya payment kuralları domain servislerinde bulunur. Böylece REST partner ve GraphQL client aynı business behavior'ı kullanır. Gateway değişikliği domain'i yeniden yazmayı gerektirmez. Architecture test dependency sınırlarını koruyabilir.

GraphQL Yerine tRPC Ne Zaman Düşünülmeli?

Tek TypeScript monorepo içinde hem client hem server aynı ekip tarafından geliştiriliyorsa tRPC benzeri end-to-end type safety yaklaşımı değerlendirilebilir. Public contract veya farklı dil consumer ihtiyacı yoksa GraphQL schema governance fazla gelebilir. Bu model internal consumer için hızlı development experience sağlayabilir. Ancak runtime validation, versioning ve security gereksinimleri yine devam eder. Teknoloji seçimi yalnız type generation kolaylığına indirgenmemelidir.

Tek TypeScript Monorepo

Client ve server aynı repository içinde type paylaşabilir. Build tooling contract değişikliğini compile time'da yakalayabilir. Ayrı schema definition ihtiyacı azalır. Takımlar bağımsız deploy olmaya başladığında coupling yeniden değerlendirilmelidir. Monorepo organization modeli kararı etkiler.

Internal Consumer

Consumer tamamen kurum kontrolündeyse breaking change koordinasyonu daha kolaydır. Public developer experience gereksinimi bulunmayabilir. Daha basit RPC modeli yeterli olabilir. Network contract yine version ve security açısından düşünülmelidir. Internal olmak operasyon requirement'larını ortadan kaldırmaz.

Public Contract Gerekmemesi

Dış partner veya third-party developer yoksa generic public schema ihtiyacı daha düşük olabilir. Consumer code aynı release flow içinde değişebilir. GraphQL introspection ve federation kapasitesine gerek kalmayabilir. Basitlik developer hızını artırabilir. Gelecekte external API planı varsa architecture boundary korunmalıdır.

End-to-End Type Safety

Client call input ve output type'ları server implementation'dan türetilebilir. Refactoring sırasında compile-time hata hızlı feedback sağlar. Runtime authorization ve validation hâlâ gerekir. Type safety network reliability sağlamaz. Organizasyon büyüdükçe shared type coupling izlenmelidir.

REST/GraphQL Yerine gRPC Ne Zaman Düşünülmeli?

Internal service-to-service iletişimde browser consumer gerekmiyorsa gRPC güçlü contract ve düşük overhead için değerlendirilebilir. Binary serialization belirli low-latency workload'larda avantaj sağlayabilir. Streaming desteği uzun süreli data akışlarında yararlıdır. Public browser API için REST veya GraphQL çoğu zaman daha kolay tooling sunar. Protocol seçimi consumer türü ve workload'a göre yapılmalıdır.

Internal Service-to-Service

Her iki servis de kurum kontrolündeyse IDL tabanlı contract kolay yönetilebilir. Client stub generation language interoperability sağlar. Gateway veya service mesh integration planlanmalıdır. Debugging için uygun tooling gerekir. Public developer API ile aynı surface olarak düşünülmemelidir.

Low-Latency Requirement

Serialization ve connection overhead kritik workload'larda benchmark edilmelidir. gRPC bazı binary RPC senaryolarında avantaj sunabilir. Database veya business logic latency'si daha büyükse fark sınırlı kalabilir. P95 ve p99 gerçek workload ile ölçülmelidir. Düşük gecikmeli kurumsal uygulama geliştirme yaklaşımına ilişkin daha geniş içerik için https://www.diyarbakiryazilim.com.tr/posts/gelistirici-ve-istemci-kurum-arasinda-teknik-senkronizasyon adresindeki teknik senkronizasyon yaklaşımı da incelenebilir.

Strong Contract

IDL request ve response mesajlarını açık biçimde tanımlar. Breaking change kuralları tooling ile kontrol edilebilir. Generated client compile-time güven sağlar. Contract ownership yine gereklidir. Strong contract kötü domain boundary'yi otomatik düzeltmez.

Streaming

Bidirectional veya server streaming bazı internal data pipeline ihtiyaçlarında değerlidir. REST polling yerine sürekli stream kullanılabilir. Backpressure ve connection lifecycle tasarlanmalıdır. Message bus ihtiyacıyla RPC streaming birbirine karıştırılmamalıdır. Durability gerekiyorsa event platformu daha uygun olabilir.

Browser Consumer Olmaması

Browser native olarak tüm binary RPC modellerini aynı kolaylıkla kullanmayabilir. Proxy veya translation layer gerekebilir. Internal backend consumer'da bu sınırlama daha az önemlidir. Public web API'nin developer tooling ihtiyacı farklıdır. Surface matrisi doğru protokolü ayırmaya yardımcı olur.

GraphQL Seçmek İçin Güçlü Sinyaller

GraphQL için en güçlü sinyal çok sayıda farklı client'ın aynı karmaşık data graph'ını farklı şekillerde tüketmesidir. UI backend'den daha hızlı değişiyor ve sürekli aggregation ihtiyacı oluşuyorsa değer artar. Mobile network cost da field selection avantajını güçlendirebilir. Buna karşılık platform kapasitesi schema governance ve query security'yi taşıyabilmelidir. Sırf yeni veya popüler olduğu için seçim yapmak güçlü bir gerekçe değildir.

Çok Sayıda Farklı Client

Web, iOS, Android ve internal dashboard aynı backend'i farklı field ihtiyaçlarıyla kullanabilir. REST client-specific endpoint sayısı büyüyebilir. GraphQL ortak schema üzerinden farklı query shape sağlar. Client ownership ve operation naming standardize edilmelidir. Unknown public consumer varsa governance modeli yeniden düşünülmelidir.

Karmaşık İlişkisel Veri

Bir ekran nested ve ilişkisel data'ya sık erişiyorsa graph modeli doğal olabilir. Client relation traversal için birden fazla endpoint çağırmaz. Resolver fan-out ve N+1 kontrolü zorunludur. Schema domain boundary'yi aşırı birleştirmemelidir. Query path gerçek business use case'le doğrulanmalıdır.

UI'nın Backend'den Daha Hızlı Değişmesi

Frontend experiment ve release sıklığı yüksek olabilir. Her field kombinasyonu için backend endpoint değiştirmek coordination cost oluşturur. GraphQL mevcut schema alanlarını yeni şekillerde kullanmaya izin verir. Yeni business data yine backend change gerektirir. Schema additive evolution release bağımsızlığını artırır.

Aggregation Problemi

Client birçok service'ten veri topluyorsa network ve code complexity artar. GraphQL BFF bu aggregation'ı server tarafında merkezileştirebilir. Operation tracing dependency graph'ı görünür kılar. Backend servislerinin bulk API sunması gerekebilir. BFF domain business sahibi olmamalıdır.

Mobile Network Cost

Yüksek latency ve bandwidth sınırı client request optimizasyonunu önemli hâle getirir. Tek query round trip sayısını azaltabilir. Field selection payload'ı düşürebilir. Normalized cache ek avantaj sunabilir. Gerçek mobile condition altında ölçüm yapılmalıdır.

Schema Governance İçin Platform Kapasitesi

GraphQL değeri yalnız schema oluşturmakla gerçekleşmez. Registry, breaking-change check ve security guardrail gerekir. Platform owner bunları shared capability hâline getirebilir. On-call debugging araçları hazır olmalıdır. Bu kapasite yoksa küçük scope ile başlamak daha güvenlidir.

REST Seçmek İçin Güçlü Sinyaller

Basit resource model, public veya partner consumer ve güçlü CDN cache ihtiyacı REST için önemli sinyallerdir. File ve binary workload HTTP resource yaklaşımıyla doğal çalışır. Küçük platform ekibi operasyon sadeliğinden faydalanabilir. CRUD-heavy API'de GraphQL schema ve resolver platformu gereksiz yatırım olabilir. REST seçimi eski teknolojiye bağlı kalmak değil bağlama uygun sade çözüm kullanmak olabilir.

CRUD-Heavy API

API'nin büyük bölümü resource create, read, update ve delete operation'larından oluşuyorsa REST doğal model sağlar. Endpoint contract kolay anlaşılır. HTTP method ve status semantics kullanılabilir. GraphQL client flexibility sınırlı ek değer üretebilir. Business behavior büyüdükçe karar tekrar değerlendirilebilir.

Public/Partner Consumers

Dış consumer'lar standart HTTP tooling'den faydalanır. Versioning ve deprecation daha açık yönetilebilir. OpenAPI SDK generation sağlar. Partner onboarding süreci basitleşebilir. GraphQL yine mümkündür fakat gerekli platform olgunluğu daha yüksek olabilir.

Güçlü CDN Caching İhtiyacı

Read traffic büyük ve content shared ise REST GET doğal cache avantajı sunar. Standard cache header'ları infrastructure tarafından anlaşılır. High hit ratio origin compute maliyetini azaltır. GraphQL persisted GET query ile yaklaşabilir. En basit ve en yüksek hit modeli ölçümle seçilmelidir.

Basit Resource Model

Entity relation'ları sınırlıysa graph traversal avantajı düşük kalır. Resource endpoint kullanıcı için anlaşılır contract sunar. Client birkaç request ile ekranı tamamlayabilir. BFF ihtiyacı oluşmayabilir. Bu durumda REST düşük abstraction maliyetiyle yeterli olabilir.

File ve Binary Workload

Dosya upload ve download REST veya direct storage modeliyle doğal çalışır. Multipart support yaygındır. Signed URL pattern API stilinden bağımsız olsa da REST endpoint tasarımı sade olabilir. Büyük stream response için proxy behavior iyi anlaşılır. GraphQL metadata operation için kullanılabilir.

Küçük Platform Ekibi

GraphQL governance ve resolver observability ayrı bakım yükü yaratabilir. Küçük ekip product feature'a odaklanmak isteyebilir. REST OpenAPI ve managed gateway ile daha sade operation modeli sunar. Standard framework defaults yeterli olabilir. Complexity ihtiyaç doğduğunda eklenmelidir.

Operational Simplicity Önceliği

Route-level metrics ve cache semantics operasyonu kolaylaştırır. On-call ekip geniş GraphQL expertise taşımak zorunda kalmaz. Request cost daha predictable olabilir. Bu avantaj tüm sistemlerde aynı değildir. Kurumun gerçek support modeline göre değerlendirilmelidir.

GraphQL Kullanmamak İçin Uyarı İşaretleri

Tek stabil client, basit CRUD ve platform ownership eksikliği GraphQL için güçlü uyarı işaretleridir. Query observability veya field-level authorization kurulmamışsa production riski yükselir. Teknoloji yalnız modern göründüğü için seçiliyorsa business justification eksiktir. GraphQL minimum viable setup bile security ve operation guardrail gerektirir. Bu koşullarda REST daha düşük TCO sağlayabilir.

Tek ve Stabil Client

Tek client backend ile aynı release takviminde hareket ediyorsa client-defined response avantajı azalabilir. Endpoint değişikliği coordination problemi yaratmıyorsa REST yeterli olabilir. GraphQL yine aggregation için kullanılabilir. Platform cost faydayla karşılaştırılmalıdır. Gelecekte farklı client planı varsa karar buna göre esnetilebilir.

Basit CRUD

Graph yapısı ve değişken response ihtiyacı olmayan CRUD sisteminde GraphQL fazla abstraction oluşturabilir. Resolver ve schema yönetimi ek kod getirir. REST resource model daha açık olabilir. Developer ekibi daha hızlı onboarding yaşar. Sistem karmaşıklaşırsa architecture yeniden değerlendirilebilir.

Platform Ownership Yok

Schema gateway ve registry'nin sahibi yoksa incident sırasında sorumluluk belirsizleşir. Her product ekibi farklı security ve cost policy uygular. Schema standardı bozulur. Federation bu sorunu daha da büyütebilir. Önce ownership modeli kurulmalıdır.

Query Observability Yok

Tek endpoint metric'i production behavior'ı açıklamaz. Operation ve resolver metric olmadan pahalı query'yi bulmak zorlaşır. N+1 problemi uzun süre fark edilmeyebilir. Security abuse detection eksik kalır. GraphQL production'a çıkmadan temel telemetry hazırlanmalıdır.

Field-Level Authorization Modeli Yok

Nested schema geniş data access surface oluşturabilir. Yalnız top-level authentication yeterli değildir. Sensitive field policy açık değilse veri sızıntısı riski oluşur. Data classification ve resolver policy geliştirilmelidir. Security readiness teknoloji rollout'un ön koşuludur.

Sırf “Modern” Olduğu İçin Seçiliyor

Teknoloji görünürlüğü business gereksinimi değildir. GraphQL belirli problemlerde değerli bir araçtır. Mevcut REST sisteminin ölçülmüş problemi yoksa migration fırsat maliyeti yaratabilir. PoC aynı use case üzerinden gerçek farkı göstermelidir. Karar trend yerine evidence ile savunulmalıdır.

REST Kullanmamak İçin Uyarı İşaretleri

REST'in de her kullanım için varsayılan doğru çözüm olduğu düşünülmemelidir. Endpoint explosion, sürekli under-fetching ve client-specific response ihtiyacı architecture baskısı oluşturabilir. Frontend her küçük ekran değişikliği için backend release bekliyorsa contract modeli ihtiyaçları karşılamıyor olabilir. Çok sayıda heterojen client ortak graph yaklaşımından faydalanabilir. Önce BFF veya REST response pattern'leri denenebilir, sonra GraphQL değerlendirilebilir.

Endpoint Explosion

Aynı domain için onlarca ekran-specific endpoint oluşuyorsa maintenance maliyeti artar. Naming ve ownership zorlaşır. Cache policy her endpoint'te farklılaşabilir. GraphQL ortak schema ile response çeşitliliğini azaltabilir. Endpoint sayısı tek başına problem değil, tekrar eden behavior ana sinyaldir.

Çok Fazla Client-Specific Endpoint

/mobile/orders ve /web/orders gibi endpoint'ler zamanla çoğalabilir. Client ihtiyaçları birbirinden ayrıştıkça backend code duplication oluşur. BFF modeli bu ayrımı yönetebilir. GraphQL tek schema üzerinden farklı client selection set sağlar. Business behavior ortak service katmanında korunmalıdır.

Sürekli Under-Fetching

Her ekran birçok resource request gerektiriyorsa network latency büyüyebilir. Özellikle mobile client bu durumdan etkilenir. Purpose-built aggregation endpoint geçici çözüm olabilir. Pattern yaygınsa GraphQL BFF değerlendirilmelidir. Backend fan-out yine optimize edilmelidir.

Frontend'in Backend Release'lerine Sürekli Bağımlı Olması

Her UI field değişikliği yeni response endpoint gerektiriyorsa coordination cost yükselir. GraphQL mevcut schema içindeki field'ları client'ın kendi seçmesine izin verir. Contract-first REST ve sparse fieldset de alternatif olabilir. Sorunun gerçekten protocol kaynaklı olduğu doğrulanmalıdır. Team process problemi teknoloji değişikliğiyle tamamen çözülmeyebilir.

Çok Sayıda Heterojen Client

Web, mobile, dashboard ve partner aynı data'yı farklı biçimde kullanabilir. Tek REST representation herkese uygun olmayabilir. GraphQL internal product client'ları için esneklik sağlayabilir. Public partner yüzeyi yine REST kalabilir. Hibrit mimari burada doğal sonuç olabilir.

Kurumsal GraphQL Production Checklist

Production GraphQL platformu schema governance, authorization, query protection ve observability olmadan tamamlanmış kabul edilmemelidir. Depth, cost, pagination ve batching sınırları kötü niyetli veya yanlış query'leri kontrol eder. Persisted operation bilinen client'larda güvenliği artırır. N+1 protection ve schema change detection performans ile contract riskini azaltır. SLO ve capacity testing platformun gerçek trafik altında güvenilir çalışmasını doğrular.

Schema Governance

Schema owner ve style guide belirlenmelidir. Registry production version'ı saklamalıdır. Breaking change CI içinde engellenmelidir. Deprecation lifecycle açık olmalıdır. Field ownership API catalog ile görünür tutulmalıdır.

Field Authorization

Sensitive field policy server-side uygulanmalıdır. Nested relation'lar ayrıca kontrol edilmelidir. Tenant isolation test edilmelidir. DataLoader identity boundary'yi aşmamalıdır. Authorization denial audit gerektiğinde kaydedilmelidir.

Depth Limits

Maximum query depth configuration ile sınırlandırılmalıdır. Recursive relation path test edilmelidir. Normal operation limit içinde kalmalıdır. Çok düşük limit developer experience'ı bozabilir. Production telemetry ayarları yönlendirmelidir.

Query Cost Limits

Field'lara gerçek maliyete yakın cost atanmalıdır. List size cost hesabına dahil edilmelidir. Expensive query budget aşımında reddedilir. Cost model üretim ölçümüyle kalibre edilir. Tenant quota ile birlikte kullanılabilir.

Pagination Limits

Tüm büyük list field'lar pagination kullanmalıdır. Maximum page size server tarafından uygulanmalıdır. Client sınırsız first değeri gönderememelidir. Cursor semantics stabil olmalıdır. Total count pahalıysa optional veya ayrı field olabilir.

Batching Controls

Tek request içindeki operation sayısı sınırlandırılmalıdır. Sensitive mutation batching dışında tutulabilir. Batch cost toplam olarak hesaplanmalıdır. Rate limit gateway ve graph layer'da birlikte uygulanabilir. Abuse test CI veya security suite içinde çalıştırılmalıdır.

Persisted Operations

Controlled client'larda allowlist ciddi güvenlik avantajı sağlar. Registry CI/CD ile güncellenmelidir. Old client operation'ları migration döneminde korunmalıdır. Unknown operation policy açık olmalıdır. Cache key operation hash üzerinden kurulabilir.

N+1 Protection

DataLoader veya bulk data source pattern kullanılmalıdır. Critical query için database call count test edilebilir. Resolver tracing N+1 regression gösterir. Service API gerektiğinde batch endpoint sunmalıdır. Query cost yalnız başına N+1'i çözmez.

Operation-Level Observability

Operation name, hash ve latency metric'leri toplanmalıdır. Resolver error ve remote call tracing bulunmalıdır. Client name ve version controlled label olarak kullanılabilir. Anonymous production operation sınırlanabilir. Dashboard business-critical query'leri öne çıkarmalıdır.

Schema Change Detection

Candidate schema production version ile diff edilmelidir. Persisted operation compatibility kontrol edilir. Federation composition validation çalıştırılır. Breaking change review olmadan yayınlanmamalıdır. Removal deprecation policy'ye uymalıdır.

SLO ve Capacity Testing

Kritik operation'lar için success ve latency SLO tanımlanmalıdır. Load test gerçek query distribution kullanmalıdır. Expensive query peak traffic altında değerlendirilmelidir. Autoscaling davranışı gözlemlenmelidir. Error budget platform yatırım kararlarını destekler.

Kurumsal REST Production Checklist

REST'in operasyon sadeliği doğru governance olmadan otomatik gerçekleşmez. OpenAPI contract, naming, pagination, error modeli ve versioning ortak standarda bağlanmalıdır. Idempotency ve cache header'ları operation semantics'e göre tasarlanmalıdır. Authorization yalnız route seviyesinde bırakılmamalıdır. Deprecation ve sunset policy public ve partner consumer'ların güvenli migration yapmasını sağlar.

OpenAPI Contract

Her public veya önemli internal API güncel OpenAPI specification taşımalıdır. Spec CI içinde validate edilmelidir. Implementation drift contract test ile yakalanabilir. Client generation ihtiyaç halinde desteklenebilir. Owner bilgisi API catalog'da tutulmalıdır.

Resource Naming Standardı

URI ve resource isimleri business terminology kullanmalıdır. Aynı kavram farklı ekiplerde farklı adlandırılmamalıdır. Action endpoint yalnız business operation gerçekten resource modeline uymadığında değerlendirilebilir. Pluralization ve nesting standardı belirlenmelidir. Naming lint mümkünse otomatik uygulanmalıdır.

Pagination Standardı

Collection endpoint'leri ortak pagination modelini kullanmalıdır. Offset veya cursor seçimi use case'e göre yapılabilir. Maximum page size açık olmalıdır. Response metadata client navigation'ı desteklemelidir. Büyük dataset için cursor tercih edilebilir.

Error Contract

Standard error body tüm servislerde aynı temel alanları taşımalıdır. Machine-readable code ve correlation id faydalıdır. Validation details structured olmalıdır. Stack trace response'a sızmamalıdır. Retryable error bilgisi gerektiğinde belirtilmelidir.

Idempotency

Kritik POST operation'ları idempotency stratejisine sahip olmalıdır. Payment ve order create önceliklidir. Key scope ve retention tanımlanmalıdır. Duplicate testler integration suite'e eklenmelidir. Downstream provider idempotency özelliği kullanılabilir.

Versioning Policy

Hangi değişiklikte yeni major version gerektiği tanımlanmalıdır. Additive change mevcut version içinde tercih edilir. URL veya header yaklaşımı kurum genelinde standardize edilebilir. Eski version için support süresi belirlenmelidir. Usage telemetry migration progress'i göstermelidir.

Cache Headers

Read endpoint response'ları bilinçli Cache-Control policy taşımalıdır. Default framework davranışına güvenilmemelidir. Private ve public data ayrılmalıdır. ETag uygun use case'lerde kullanılabilir. CDN hit ratio observability içinde izlenmelidir.

Rate Limiting

Public ve partner API'ler quota modeline sahip olmalıdır. User, API key veya tenant bazlı limit uygulanabilir. 429 response ve retry bilgisi contract'ta açıklanmalıdır. Sensitive endpoint için farklı limit gerekebilir. Gateway metric abuse pattern'ini görünür kılmalıdır.

Authorization

Route, resource ve object-level policy birlikte düşünülmelidir. Tenant isolation data query seviyesinde korunmalıdır. API key yalnız identity yerine geçmemelidir. Authorization testleri regression suite'e dahil edilmelidir. Policy değişiklikleri audit edilebilir olmalıdır.

Deprecation/Sunset Policy

Eski endpoint veya version aniden kapatılmamalıdır. Consumer'lara migration süresi verilmelidir. Documentation yeni alternatifi göstermelidir. Usage telemetry sıfıra yaklaşmadan removal risklidir. Security zorunluluğu varsa hızlandırılmış süreç ayrıca tanımlanabilir.

GraphQL vs REST Kurumsal Karar Matrisi

GraphQL ve REST: Kurumsal Karar Verme Rehberi kapsamında en sağlıklı sonuç tek bir genel kazanan seçmek değildir. Public API, simple CRUD ve CDN-heavy read surface REST yönünde güçlü sinyal verebilir. Multi-client product ve complex data aggregation GraphQL'i değerlendirmeyi anlamlı kılar. Internal service communication için REST veya başka güçlü contract modelleri düşünülmelidir. Mixed enterprise platform çoğu zaman bilinçli hibrit mimariye ulaşır.

Public API → REST Eğilimi

Unknown consumer ve long-term contract stability REST'i güçlü aday yapar. Standard HTTP tooling onboarding kolaylığı sağlar. CDN cache ve gateway rate limit doğal çalışır. OpenAPI developer portal entegrasyonunu destekler. GraphQL ancak açık product gerekçesi ve platform kapasitesi varsa değerlendirilmelidir.

Simple CRUD → REST Eğilimi

Basit resource create ve read operation'ları REST ile açık biçimde modellenebilir. GraphQL schema ve resolver overhead'i sınırlı değer üretebilir. Developer onboarding daha kolay olabilir. HTTP caching gerekirse doğrudan kullanılır. Sistem ihtiyaçları değişirse karar yeniden açılabilir.

CDN-Heavy Read API → REST Eğilimi

Public ve shared response'ların büyük bölümü cache'leniyorsa REST GET avantajlıdır. Cache key anlaşılır ve standard infrastructure desteklidir. Origin cost önemli ölçüde düşebilir. GraphQL persisted GET ile alternatif sunabilir. Gerçek hit ratio PoC ile karşılaştırılmalıdır.

Multi-Client Product → GraphQL Eğilimi

Web ve mobile farklı data shape istediğinde GraphQL schema ortak contract sağlar. Client selection set kendi ihtiyacına göre değişebilir. Endpoint duplication azalabilir. Schema governance ve security yatırımı gerekir. Client sayısı arttıkça bu yatırımın değeri yükselir.

Complex Data Aggregation → GraphQL Eğilimi

Bir ekran birçok domain veya relation'a dokunuyorsa graph query doğal model sunabilir. Network round trip azalabilir. Resolver fan-out ve N+1 yakından kontrol edilmelidir. BFF business logic sahibi olmamalıdır. Query plan production telemetry ile doğrulanmalıdır.

Mobile-First Product → GraphQL Değerlendir

Mobile network latency ve bandwidth GraphQL avantajını güçlendirebilir. Field selection payload'ı azaltır. Normalized cache offline deneyimi destekleyebilir. REST BFF aynı problemin alternatif çözümüdür. Cihaz bazlı benchmark final kararı vermelidir.

Internal Microservices → REST/gRPC Değerlendir

Internal servislerin UI field selection ihtiyacı olmayabilir. REST operasyon sadeliği sunar. Düşük latency ve streaming gereksiniminde gRPC değerlendirilebilir. GraphQL service-to-service için varsayılan olmak zorunda değildir. Service contract ve failure model önceliklidir.

TypeScript Monorepo → tRPC Değerlendir

Tek codebase içinde end-to-end type safety farklı yaklaşımı anlamlı kılabilir. Public consumer yoksa ayrı schema platformu fazla olabilir. Runtime security ve validation yine gerekir. Takımlar bağımsızlaştıkça contract boundary gözden geçirilmelidir. Teknoloji portföyü kontrollü tutulmalıdır.

Mixed Enterprise Platform → Hibrit Mimari

Kurumsal platform birçok farklı consumer ve workload içerir. Public REST, BFF GraphQL ve async event bus birlikte kullanılabilir. File transfer object storage üzerinden ayrılabilir. Her surface için ortak security ve governance standardı gerekir. Hibrit olmak kontrolsüz teknoloji çeşitliliği anlamına gelmemelidir.

Karar Workshop'ında Sorulması Gereken 12 Soru

Teknoloji workshop'u framework tercihinden önce iş ve operasyon sorularıyla başlamalıdır. Consumer, client sayısı, veri ilişkileri, cache ve public API gereksinimleri ilk grubu oluşturur. Query cost, authorization ve schema ownership organizasyonel hazırlığı gösterir. Production observability ve takım olgunluğu sistemin gerçekten işletilip işletilemeyeceğini belirler. Üç yıllık TCO final teknik farkların ekonomik karşılığını görünür kılar.

API'yi Kim Tüketecek?

Consumer internal developer, mobile app, partner veya public third party olabilir. Her grubun contract ve tooling ihtiyacı farklıdır. Consumer kontrolünüz dışında ise compatibility daha önemli hâle gelir. Mobile network farklı performance önceliği oluşturur. Bu soru diğer tüm kriterlere bağlam sağlar.

Kaç Farklı Client Var?

Tek client ile altı farklı client aynı response esnekliğine ihtiyaç duymaz. Client sayısı arttıkça endpoint çeşitliliği büyüyebilir. GraphQL ortak schema faydası artar. Client'lar birbirine benziyorsa REST BFF yine yeterli olabilir. Gelecek roadmap tahmini de dikkate alınmalıdır.

Data Ne Kadar İlişkisel?

Basit flat resource graph query ihtiyacını azaltır. Deep relation ve aggregation GraphQL sinyalini güçlendirir. Database relation ile API relation birebir aynı olmak zorunda değildir. Domain ownership daha önemli kriterdir. Gerçek screen data map çıkarılmalıdır.

HTTP Cache Ne Kadar Önemli?

Traffic büyük ve response shared ise CDN cache ciddi tasarruf sağlar. REST bu alanda güçlü varsayılanlara sahiptir. GraphQL persisted GET ile benzer model kurabilir. Personalized response cache kazancını azaltabilir. Hit ratio tahmini yapılmalıdır.

Public API Olacak mı?

Public API unknown consumer ve long-term contract getirir. Developer portal ve rate limit iletişimi önemlidir. REST güçlü başlangıç olabilir. GraphQL seçilecekse abuse protection ve schema stability daha güçlü tasarlanmalıdır. Internal BFF kararı public yüzeye otomatik taşınmamalıdır.

Bir Screen Kaç Servise Dokunuyor?

Ekran üç veya daha fazla domain'e dokunuyorsa aggregation ihtiyacı vardır. GraphQL bunu client açısından sadeleştirebilir. Backend fan-out yine devam eder. REST BFF alternatif olarak değerlendirilmelidir. Service count operation tracing ile ölçülmelidir.

Query Cost Kontrolü Yapabilir miyiz?

GraphQL arbitrary query sunacaksa complexity koruması gerekir. Field cost tanımlayacak owner bulunmalıdır. Runtime telemetry score modelini doğrulamalıdır. Persisted operation varsa problem daha kontrollü hâle gelir. Bu kapasite yoksa graph scope'u sınırlanmalıdır.

Field-Level Authorization Yönetebilir miyiz?

Schema hassas field'lar içeriyorsa resolver ve object policy gerekir. Security ekibi modeli desteklemelidir. Data classification otomasyona bağlanabilir. Test suite nested access senaryolarını kapsamalıdır. Yalnız gateway authentication yeterli değildir.

Schema Governance Owner Kim?

Owner naming, deprecation ve breaking-change süreçlerini yönetir. Federation varsa distributed owner modeli açık olmalıdır. Registry ve API catalog bu bilgiyi taşır. Owner yoksa schema zamanla ortak ama sahipsiz alana dönüşür. Bu soru organizasyonel hazır oluşu doğrudan gösterir.

Production Observability Hazır mı?

Operation latency, resolver error ve downstream trace bulunmalıdır. REST için route metric'leri standardize edilmelidir. Log correlation support sürecini kolaylaştırır. Monitoring sonradan eklenen özellik olmamalıdır. PoC operability testini de içermelidir.

Takımın Operasyonel Olgunluğu Yeterli mi?

Teknolojiyi geliştirmek kadar gece incident'inde yönetmek de gerekir. GraphQL query plan ve N+1 bilgisi on-call için önemlidir. REST gateway ve cache behavior da anlaşılmalıdır. Runbook ve training ihtiyacı TCO'ya eklenmelidir. Basit çözüm bazen daha yüksek reliability sağlar.

Üç Yıllık TCO Hangisinde Daha Düşük?

Development, platform, observability ve training birlikte hesaplanmalıdır. GraphQL frontend hızını artırırken gateway maliyeti oluşturabilir. REST endpoint duplication development cost yaratabilir. CDN tasarrufu altyapı farkını değiştirebilir. Senaryo bazlı model final kararın savunulabilir olmasını sağlar.

Proof of Concept Nasıl Yapılmalı?

PoC iki teknoloji için farklı demo hazırlamak yerine aynı gerçek business use case'i uygulamalıdır. Payload, p95 ve p99, database query count, CDN hit ratio ve implementation time ölçülmelidir. Failure scenario ve authorization behavior da test edilmelidir. Operasyon maliyeti yalnız developer bilgisayarındaki deneyimle sınırlı tutulmamalıdır. PoC sonunda hangi koşulda hangi seçeneğin daha iyi olduğu açık evidence ile yazılmalıdır.

Aynı Use Case'i REST ve GraphQL ile Uygulamak

Örneğin mobil order detail ekranı iki modelde de geliştirilir. Aynı backend data ve security rule kullanılır. Client request sayısı ve implementation effort kaydedilir. GraphQL N+1 kontrolü uygulanır. REST BFF alternatifi de adil karşılaştırma için düşünülebilir.

Payload Ölçmek

Compressed ve uncompressed response boyutu ölçülmelidir. Mobile screen'in gerçekten kullandığı field'lar belirlenir. GraphQL selection avantajı sayısal olarak görülür. REST sparse response alternatifi test edilebilir. Network transfer maliyeti volume ile ilişkilendirilebilir.

P95/P99 Ölçmek

Load altında latency percentile iki implementation için kaydedilir. Ortalama tek başına kullanılmaz. Cache hit ve miss ayrı analiz edilir. GraphQL fan-out tail latency'yi etkiliyor mu incelenir. Client network latency end-to-end teste eklenir.

Database Query Count Ölçmek

Her business operation için database query sayısı log veya instrumentation ile kaydedilir. GraphQL N+1 riski kolayca görünür olur. REST endpoint implementation da aynı kontrolü alır. Batch optimization sonrası fark tekrar ölçülür. Query duration yalnız count ile birlikte yorumlanmalıdır.

CDN Hit Ratio Ölçmek

Read-heavy public use case varsa cache gerçek PoC'nin parçası olmalıdır. REST ve persisted GraphQL query aynı trafik dağılımında denenebilir. Origin request reduction ölçülür. Cache invalidation behavior test edilir. Yalnız local benchmark CDN etkisini göstermez.

Developer Implementation Time Ölçmek

Aynı feature'ın backend ve frontend geliştirme süresi kaydedilebilir. Ekip teknolojilerden birine yeni ise learning effect ayrıca not edilmelidir. Test ve observability setup süresi dahil edilmelidir. Yalnız ilk endpoint zamanı yanıltıcıdır. Maintenance change senaryosu ikinci test olarak uygulanabilir.

Failure Senaryolarını Test Etmek

Downstream timeout, partial failure ve authorization denial simüle edilmelidir. GraphQL data plus errors davranışı client tarafında değerlendirilir. REST error contract aynı business case'i yönetir. Retry ve circuit breaker etkisi ölçülür. On-call root cause bulma süresi önemli operability sinyalidir.

Operasyon Maliyetini Karşılaştırmak

Gateway, registry, cache ve telemetry gereksinimleri listelenmelidir. Deploy ve rollback deneyimi test edilir. Dashboard ve alert setup süresi hesaplanır. Platform engineer ihtiyacı TCO'ya eklenir. GraphQL ve REST: Kurumsal Karar Verme Rehberi yaklaşımında final seçim yalnız geliştirme kolaylığı değil işletme kapasitesiyle birlikte savunulmalıdır.

Sık Sorulan Sorular

GraphQL ve REST hakkında sık sorulan sorular çoğunlukla hız, güvenlik ve birbirinin yerini alıp almadığı konularında yoğunlaşır. Bu soruların çoğunun cevabı kullanılan client, workload ve platform kapasitesine bağlıdır. Tek başına protokol bir sistemi hızlı veya güvenli yapmaz. Doğru cache, authorization, query optimization ve governance iki modelde de gereklidir. Aşağıdaki cevaplar karar verirken sık karşılaşılan yanlış genellemeleri daha net ayırır.

GraphQL REST'in yerini alıyor mu?

Hayır, GraphQL REST'in evrensel halefi değildir. İki model farklı API ihtiyaçlarında değer üretir. Public API ve cache-heavy resource yüzeylerinde REST güçlü kalabilir. Multi-client aggregation için GraphQL daha uygun olabilir. Kurumsal sistemlerin ikisini birlikte kullanması son derece normaldir.

GraphQL mı REST mi daha hızlıdır?

Genel bir hız kazananı yoktur. GraphQL request sayısını ve payload'ı azaltabilir. REST CDN cache ile origin işini ciddi biçimde düşürebilir. Resolver fan-out GraphQL latency'sini artırabilir. Aynı business use case gerçek workload ile benchmark edilmelidir.

GraphQL mı REST mi daha güvenlidir?

İki yaklaşım da doğru uygulanırsa güvenli olabilir. GraphQL query complexity ve field authorization gibi ek kontroller gerektirir. REST object-level authorization ve mass assignment risklerine dikkat etmelidir. Authentication iki modelde benzer standartları kullanabilir. Güvenlik uygulama ve operasyon disiplinine bağlıdır.

GraphQL microservices için uygun mudur?

GraphQL microservice'lerin üzerinde aggregation veya federation layer olarak kullanılabilir. Her microservice'in GraphQL konuşması zorunlu değildir. Backend servisleri REST veya başka internal protocol kullanabilir. Federation domain ownership sağlarken organizasyon maliyeti oluşturur. Distributed monolith riskine dikkat edilmelidir.

Public API için GraphQL kullanılmalı mı?

Kullanılabilir fakat otomatik olarak en iyi tercih değildir. Unknown consumer ve arbitrary query güvenlik modelini zorlaştırır. Schema governance ve rate limiting güçlü olmalıdır. REST standard HTTP tooling ile daha sade başlangıç sunabilir. Public ürün gereksinimi kararı belirlemelidir.

GraphQL caching nasıl yapılır?

GraphQL caching client, data source ve CDN katmanlarında yapılabilir. Normalized client cache entity'leri paylaşır. Persisted GET query CDN cache'i kolaylaştırabilir. Resolver cache business freshness ihtiyacına göre uygulanır. Cache ownership ve invalidation mutlaka açık olmalıdır.

GraphQL'de N+1 problemi nedir?

N+1 bir liste içindeki her öğe için ayrı database veya service çağrısı yapılmasıdır. Resolver modelinde kolay oluşabilir. DataLoader batching çağrı sayısını azaltabilir. Query count regression test ile korunabilir. Backend service bulk fetch endpoint sağlayabilir.

DataLoader ne işe yarar?

DataLoader aynı request içindeki key fetch'lerini batch ve deduplicate eder. N+1 problemini azaltmak için kullanışlıdır. Uzun ömürlü global cache olarak düşünülmemelidir. Request-scoped lifecycle authorization açısından daha güvenlidir. Gerçek database behavior integration testlerle ayrıca doğrulanmalıdır.

GraphQL'de rate limiting nasıl yapılır?

Request count ilk koruma katmanı olabilir. Query complexity, user ve tenant quota daha doğru resource kontrolü sağlar. Sensitive mutation özel limit alabilir. Batch operation toplam cost üzerinden hesaplanmalıdır. Client'a quota ve retry bilgisi verilmelidir.

GraphQL introspection production'da kapatılmalı mı?

Her sistem için zorunlu bir cevap yoktur. Private allowlisted graph'ta normal client için kapatılabilir. Developer ve support role için authenticated introspection açık tutulabilir. Public developer graph'ta discovery ürün özelliği olabilir. Asıl güvenlik authorization ve abuse protection'dır.

GraphQL ve REST aynı projede kullanılabilir mi?

Evet, hibrit kullanım birçok kurumsal projede anlamlıdır. GraphQL mobile BFF, REST public API olabilir. File transfer direct storage veya REST üzerinden yürütülebilir. Domain business logic ortak application service'lerde kalmalıdır. Governance protokol çeşitliliğini kontrollü tutmalıdır.

GraphQL API Gateway'in yerini alır mı?

Hayır, graph gateway ile genel API gateway farklı sorumluluklara sahiptir. API gateway WAF, authentication ve generic quota yönetebilir. Graph gateway schema composition ve query planning yapar. İki katman birlikte kullanılabilir. Sorumluluk tekrarı architecture design ile önlenmelidir.

GraphQL Federation ne zaman gerekir?

Çok sayıda domain takımı ortak graph üzerinde bağımsız ownership istiyorsa federation değerlendirilebilir. Tek küçük ekip için maliyeti gereksiz olabilir. Registry, composition ve on-call capability gerekir. Cross-domain query plan izlenmelidir. Federation organizasyon yapısıyla birlikte düşünülmelidir.

REST'ten GraphQL'e geçiş nasıl yapılır?

GraphQL facade ile küçük bir use case'ten başlanabilir. Existing REST endpoint'ler resolver data source olarak kullanılabilir. Read-heavy aggregation ekran iyi pilot olabilir. Parallel telemetry farkı ölçer. REST endpoint kullanımı sona ermeden kaldırılmamalıdır.

Startup için REST mi GraphQL mi?

Startup'ın client ve product yapısına bağlıdır. Tek client ve basit CRUD varsa REST daha düşük platform maliyeti sunabilir. Çok hızlı değişen web ve mobile ürün GraphQL'den faydalanabilir. Küçük ekibin on-call kapasitesi unutulmamalıdır. En sade çalışan çözümle başlamak çoğu zaman değerlidir.

Büyük kurumsal projede REST mi GraphQL mi?

Büyük olmak tek başına GraphQL gerekçesi değildir. API surface, consumer, cache, security ve governance gereksinimleri ayrılmalıdır. Public ve partner surface REST kalırken web BFF GraphQL olabilir. Internal service farklı protocol kullanabilir. Mixed enterprise platform için hibrit yaklaşım çoğu zaman daha savunulabilir sonuç verir.

GraphQL ve REST arasındaki temel farklar nelerdir ve kurumsal projelerde hangisi tercih edilmelidir?

REST server-defined resource response ve güçlü HTTP semantiği sunarken GraphQL client-defined field selection ve data graph modeli sunar. Kurumsal projede tercih API'nin kim tarafından tüketildiğine göre yapılmalıdır. Public veya partner surface için REST güçlü aday olabilir. Çok sayıda web ve mobil client'ın değişken aggregation ihtiyacında GraphQL önemli avantaj sağlayabilir. Tek bir kurum içinde iki yaklaşımın birlikte kullanılması çoğu zaman en dengeli sonuçtur.

GraphQL hangi durumlarda REST API’ye göre daha avantajlıdır?

Çok sayıda farklı client aynı veri graph'ından farklı response shape istiyorsa GraphQL güçlü avantaj sağlar. Bir ekranın birçok domain'e dokunduğu aggregation use case'leri de uygun adaydır. Mobile network latency ve payload maliyeti field selection'ın değerini artırabilir. Frontend backend'den daha hızlı değişiyorsa schema üzerinden daha bağımsız hareket edebilir. Bu avantajların gerçekleşmesi için N+1, query cost, authorization ve schema governance altyapısının hazır olması gerekir.

GraphQL ve REST performans, önbellekleme ve ölçeklenebilirlik açısından nasıl karşılaştırılır?

GraphQL daha az client request ve daha küçük payload sağlayabilir, fakat resolver fan-out backend işini artırabilir. REST standart CDN ve HTTP cache mekanizmaları sayesinde read-heavy trafikte çok güçlü olabilir. GraphQL persisted operation ve GET query ile CDN kullanımını iyileştirebilir. Ölçeklenebilirlik yalnız protokole değil database, cache, backend service ve query plan kalitesine bağlıdır. Adil karşılaştırma aynı use case için p95, p99, database query count, cache hit ratio ve cost per operation ölçmelidir.

Kurumsal sistemlerde GraphQL ve REST güvenliği nasıl yönetilmelidir?

Her iki modelde authentication, object authorization, rate limiting ve audit temel kontrollerdir. GraphQL ayrıca field-level authorization, query depth, complexity, batching ve response limit gibi korumalara ihtiyaç duyar. REST'te resource enumeration ve object-level authorization özellikle önemlidir. API gateway ilk güvenlik katmanını sağlayabilir fakat application policy'nin yerini almamalıdır. Regüle sistemlerde schema veya OpenAPI contract içindeki data classification güvenlik kontrolüyle ilişkilendirilebilir.

Yakınımda GraphQL ve REST API mimarisi konusunda kurumsal danışmanlık veren yazılım firması nasıl bulabilirim?

GraphQL REST API ve backend danışmanlığı yakınımda şeklinde araştırma yaparken yalnız teknoloji isimlerini kullanan hizmet sağlayıcılara odaklanmamak gerekir. Kurumsal GraphQL REST API mimarisi ve entegrasyon danışmanlığı veren ekibin API governance, performance, security, observability ve migration konularını birlikte değerlendirebilmesi önemlidir. Daha önce geliştirilen proje ve yaklaşım örneklerini incelemek karar sürecini kolaylaştırır. Diyarbakır Yazılım Topluluğu'nun proje çalışmalarını https://www.diyarbakiryazilim.com.tr/projects adresinden inceleyebilirsiniz. Topluluk, yaklaşım ve çalışma alanları hakkında daha fazla bilgi için https://www.diyarbakiryazilim.com.tr/about adresini ziyaret edebilirsiniz.

Sonuç: GraphQL ve REST Arasında Kazanan Aramayın, Doğru API Yüzeyini Seçin

GraphQL ve REST: Kurumsal Karar Verme Rehberi için en önemli sonuç, iki yaklaşım arasında kurum genelinde tek bir kazanan seçmenin çoğu zaman doğru hedef olmadığıdır. REST public, partner, cache-heavy ve basit resource API'lerinde güçlü bir operasyon modeli sunarken GraphQL çok sayıda istemcinin karmaşık ve değişken veri ihtiyaçlarında önemli esneklik sağlayabilir. Sağlıklı karar consumer türü, data graph, network, güvenlik, schema governance, gözlemlenebilirlik ve üç yıllık toplam sahip olma maliyeti birlikte değerlendirilerek verilmelidir. Geliştirici ve istemci kurumların API beklentilerini aynı teknik zeminde buluşturma yaklaşımını incelemek için https://www.diyarbakiryazilim.com.tr/posts/gelistirici-ve-istemci-kurum-arasinda-teknik-senkronizasyon adresine göz atabilirsiniz. GraphQL, REST, backend mimarisi veya kurumsal entegrasyon kararlarınız için proje yaklaşımını https://www.diyarbakiryazilim.com.tr/projects üzerinden, topluluk ve çalışma alanlarını ise https://www.diyarbakiryazilim.com.tr/about adresinden inceleyebilirsiniz.

share
share:

İletişim

Birlikte inşa edelim

İşbirliklerine, ilginç sorunlara ve kod, tasarım ile diğer konular hakkında sohbetlere açığız.

bize ulaş→

Bizi başka yerlerde bulun

GitHub
@diyarbakir-yazilim
Twitter
@diyaryazilim
LinkedIn
diyarbakir-yazilim-toplulugu
Instagram
@diyarbakiryazilim
YouTube
@diyarbakiryazilim
Slack
diyarbakiryazilim
WhatsApp
Topluluğa Katıl
Email
info@diyarbakiryazilim.org
Sevgiyle ve kodla inşa ediliyor

© 2026 Diyarbakır Yazılım Topluluğu — Tüm hakları saklıdır.