Modern web geliştirme manzarası, yalnızca yüksek performanslı değil, aynı zamanda gerçek zamanlı olarak değişen veri durumlarına da duyarlı uygulamalar gerektirir. REST API'ler uzun süredir standart olsa da, GraphQL'in yükselişi, istemcilerin verileri nasıl çektiklerini devrim niteliğinde değiştirdi; bu da daha hassas sorgulama ve aşırı veri çekilmesinin azaltılması sağladı. Ancak, GraphQL'i canlı sohbet güncellemeleri veya borsa verileri gibi gerçek zamanlı yeteneklerle birleştirmek genellikle önemli bir karmaşıklık getirir. Bu yazıda, FastAPI'nin hızını ve Strawberry'in tür güvenliğinden yararlanarak, dinamik veri çekmede mükemmel performans gösteren sağlam bir gerçek zamanlı GraphQL API'si nasıl oluşturulacağını keşfedeceğiz.
Neden FastAPI ve Strawberry?
FastAPI, yüksek performansı ve asenkron programlama için yerel desteği ile tanınır; bu da onu yüksek eşzamanlılık gerektiren API'ler oluşturmak için ideal bir çerçeve haline getirir. Öte yandan, Strawberry, tür güvenliği ve geliştirici deneyimini önceliklendiren modern bir Python GraphQL kütüphanesidir. Eski kütüphanelerin aksine, Strawberry Python'un tür ipuçları ile sorunsuz bir şekilde entegre olur ve asenkron çözücüler (resolvers) için varsayılan olarak destek sağlar.
Bu iki kütüphane birleştirildiğinde güçlü bir yığın sunar. FastAPI, gerçek zamanlı abone olmalar (subscriptions) için gereken WebSocket bağlantılarını yönetirken, Strawberry GraphQL şema tanımını ve sorgu çözümlemesini yönetir. Bu sorumluluk ayrımı, geliştiricilerin altyapı (plumbing) ile değil, mantıkla ilgilenmesine olanak tanır; böylece API ölçeklendikçe bakımı kolay kalır.
Proje Ortamını Kurma
Koda dalmadan önce gerekli bağımlılıkların yüklü olduğundan emin olun. FastAPI, Strawberry GraphQL, Strawberry için WebSocket desteği ve Uvicorn gibi bir ASGI sunucusuna ihtiyacınız olacak.
pip install fastapi strawberry-graphql uvicorn [all]
Bu kurulum, GraphQL için temel mantığı, asenkron desteği ve sunucuyu çalıştırmak için gereken araçları getirir. Veri modelimizi tanımlayarak başlayacağız. Gerçek zamanlı veriyle uğraştığımız için, hisse senedi fiyatlarının bir akışını simüle edeceğiz.
Strawberry ile Şemanın Tanımlanması
Her GraphQL API'sinin çekirdeği şemasıdır. Strawberry, türleri, mutasyonları ve sorguları Python sınıfları kullanarak tanımlamamıza olanak tanır. Gerçek zamanlı yetenekler için strawberry.subscription modülünü kullanarak abone olma (subscription) tanımlarız.
import strawberry
import asyncio
from typing import AsyncGenerator
from datetime import datetime
@strawberry.type
class StockUpdate:
symbol: str
price: float
timestamp: datetime
volatility: str
class Query:
@strawberry.field
def current_price(self, symbol: str) -> str:
return f"{symbol} için fiyat alınıyor..."
@strawberry.subscription
async def stock_updates(self, symbol: str) -> AsyncGenerator[StockUpdate, None]:
"""
Hisse senedi fiyat güncellemelerini yayan gerçek zamanlı bir abone olma işlemi.
"""
while True:
price = round(100 + (await asyncio.sleep(1)) * 10, 2)
update = StockUpdate(
symbol=symbol,
price=price,
timestamp=datetime.utcnow(),
volatility="high" if price > 150 else "low"
)
yield update
Bu örnekte, stock_updates abone olma işlemini tanımlıyoruz. Veriyi asenkron olarak üretir ve canlı bir akışı simüle eder. İstemci, sunucuyu sürekli sorgulamak (polling) yerine belirli bir sembole abone olabilir ve güncellemeleri alır; bu da gecikmeyi ve sunucu yükünü önemli ölçüde azaltır.
FastAPI ile Entegrasyon ve WebSocket Yönetimi
Bu şemayı sunmak için, onu bir FastAPI uygulamasının içine sarıyoruz. FastAPI'nin GraphQLRouter özelliği, GraphQL sorgularını, mutasyonları ve abone olma işlemlerini tek bir uç noktaya yönlendirmeyi basitleştirir.
from fastapi import FastAPI
from strawberry.fastapi import GraphQLRouter
# Şemayı tanımla
schema = strawberry.Schema(query=Query, subscription=Subscription)
# FastAPI uygulamasını oluştur
app = FastAPI(
title="Gerçek Zamanlı GraphQL API",
description="FastAPI ve Strawberry ile dinamik veri çekme",
)
# GraphQL yönlendiricisini yerleştir
graphql_app = GraphQLRouter(schema)
app.include_router(graphql_app, prefix="/graphql")
# Sunucu artık sorgular için GET isteklerini ve abone olma işlemleri için WS bağlantılarını işleyecek şekilde hazır.
Bu uygulamayı uvicorn main:app --reload komutuyla çalıştırdığınızda, FastAPI otomatik olarak istemci bir abone olma işlemi talep ettiğinde standart HTTP bağlantılarını WebSocket bağlantılarına yükseltir. Bu, sunucunun veriler eldeki gibi istemciye veri göndermesini sağlar.
Dinamik Veri Çekme İçin Optimize Etme
Bu mimarinin temel avantajlarından biri, dinamik istekleri işleme yeteneğidir. İstemci tam olarak ihtiyacı olan alanları talep ettiği için, sunucu yalnızca gerekli olanı çözer. Bir dashboard'un 50 farklı hisse senedini göstermesi gereken bir senaryoda, istemci bu belirli semboller için toplu bir güncelleme talep edebilir ve abone olma mantığı güncellemeleri buna göre filtreleyebilir veya yönlendirebilir.
Ayrıca, hem FastAPI hem de Strawberry'nin asenkron doğası, veritabanı sorguları veya harici API çağrıları gibi I/O ile sınırlı işlemlerin olay döngüsünü (event loop) bloklamamasını sağlar. Bu, aynı anda binlerce eşzamanlı bağlantı kurulabilecek gerçek zamanlı uygulamalar için kritiktir.
Sonuç
Gerçek zamanlı GraphQL API'leri oluşturmak artık karmaşık Node.js kurulumlarının tek alanı değildir. FastAPI ve Strawberry ile modern Python ekosisteminden yararlanarak, geliştiriciler yüksek performanslı, tür güvenli ve ölçeklenebilir çözümler oluşturabilir. Bu kombinasyon, kullanıcı deneyimini iyileştiren dinamik veri çekme yetenekleri sunmanızı sağlar ve aynı zamanda arka uç mimarinizi temiz ve bakımı kolay tutar. Bir finans dashboard'u, işbirlikçi bir düzenleyici veya canlı sohbet uygulaması yapıyor olun, bu yığın başarı için ihtiyacınız olan temeli sağlar.