Python & FastAPI Backend — modern ve ölçeklenebilir API'ler
FastAPI, asenkron REST API'ler için başvuru niteliğindeki Python framework'üdür. Python'un yerel type hint'lerini otomatik Pydantic doğrulaması, otomatik üretilen OpenAPI dokümantasyonu ve Node.js ile kıyaslanabilir ASGI performansıyla birleştirir — kodun okunabilirliğinden ödün vermeden.
FastAPI — Python için API çatısı
FastAPI, Uvicorn (ASGI sunucusu) üzerinde çalışır; üretimde çoklu süreç için Gunicorn ile birlikte kullanılır. Redis önbelleğinden okuyan basit bir endpoint, veritabanını her istekte sorgulamak zorunda kalmaz. Yerel Dependency Injection, herhangi bir katmanın karmaşık mock'lar olmadan yalıtılmış biçimde test edilmesini sağlar: kimlik doğrulama, veritabanı oturumu, rate limiting — her biri enjekte edilebilir bir bağımlılıktır.
OpenAPI 3.1 dokümantasyonu type hint'lerden otomatik üretilir — Swagger UI ve ReDoc geliştirme ortamında `/docs` ve `/redoc` adreslerinde bulunur. Pydantic v2 şeması (Rust tabanlı doğrulayıcı), istekleri ve yanıtları Pydantic v1'e göre 10–20 kat daha hızlı doğrular. Geçersiz her alan, net ve yerelleştirilmiş hata mesajlarıyla 422 döndürür.
- Yerel async/await — tüm veritabanı ve HTTP işlemlerinde engellemeyen I/O
- Yanıt sonrası işlemler (e-posta, webhook, log) için BackgroundTasks
- Gerçek zamanlı özellikler (sohbet, bildirimler) için yerel WebSocket desteği
- slowapi ile rate limiting (limits tabanlı) — IP başına ve kullanıcı başına
- CORS, sıkıştırma (gzip/brotli), request ID, zamanlama middleware'leri
PostgreSQL, SQLAlchemy ve Alembic
Tüm veritabanı işlemlerinde SQLAlchemy 2.0 async (asyncpg sürücüsü) kullanıyoruz. Modeller Mapped tipleriyle tanımlanır — tip güvenli, string'siz. Karmaşık sorgular SQLAlchemy Core (derleme zamanında kontrol edilen) ile ya da bind parametreli `text()` üzerinden saf SQL ile yazılır — asla string interpolation yapılmaz (SQLi'ye karşı tam önlem).
Alembic migrasyonları model değişikliklerinden otomatik üretilir ve uygulanmadan önce elle gözden geçirilir. Her migrasyonun test edilmiş `upgrade()` ve `downgrade()` fonksiyonları vardır. Üretimde migrasyonlar dağıtımdan önce CI'da çalışır — veritabanı her zaman kodla senkron kalır. asyncpg üzerinden connection pooling, servis başına yapılandırılabilir havuz boyutuyla sağlanır.
- Kritik eşzamanlı işlemler için `SELECT ... FOR UPDATE` ile satır düzeyinde kilitleme
- pg_trgm ve tsvector ile tam metin arama — basit durumlar için Elasticsearch gerekmez
- GIN indeksli, yarı yapılandırılmış veriler için JSONB
- Milyonlarca satırlı tablolar (log, event) için bölümlenmiş tablolar
Redis önbellekleme ve yatay ölçekleme
Redis 7; uygulama önbelleği (endpoint başına TTL), oturum deposu (seçici iptal özellikli JWT refresh token'lar), gerçek zamanlı olaylar için pub/sub ve arka plan işleri için kuyruklar (Celery veya ARQ) olarak kullanılır. Önbellek stratejisi, açık geçersiz kılmalı cache-aside'dır — eski veri sunabilen kör TTL değil.
- Access token (15 dk) + Redis'te refresh token (7 gün) ile JWT kimlik doğrulama
- Asenkron görevler (PDF üretimi, e-posta, içe aktarmalar) için Celery + Redis broker
- DB, Redis durumunu ve dağıtım sürümünü bildiren `/health` endpoint'i
- Yapılandırılmış JSON loglama (structlog) — Loki/Datadog/ELK ile uyumlu
Avantajlar ve sınırlamalar
Avantajlar
- I/O'da Node.js ve Go ile kıyaslanabilir ASGI performansı.
- Type hint'lerden otomatik üretilen OpenAPI dokümantasyonu.
- Net 422 hataları veren hızlı Pydantic v2 doğrulaması.
- Okunabilir kod; çoğu ekip için tanıdık bir dil olan Python.
Sınırlamalar
- Python, CPU yoğun görevlerde Go veya Rust'tan yavaş kalır.
- async/await disiplin ister — engelleyen tek bir çağrı tüm event loop'u bloke eder.
- Hazır sunulan özellikler açısından Django'dan daha genç bir ekosistem.
- Yerleşik ORM veya admin içermez — bunları ayrıca seçersiniz.
Kısa değerlendirme
Asenkron REST API'ler, mikroservisler ve SPA/mobil backend'leri için FastAPI'yi seçin. Aşırı CPU-bound uygulamalar veya hazır admin paneli olan monolitler için sırasıyla Go ve Django daha uygun olabilir.
Teknik özellikler tablosu
| Yetenek | Sınır / eşik | Tipik kullanım | |
|---|---|---|---|
| Eşzamanlılık | async/await, engellemeyen I/O | CPU-bound işler ayrı worker'lar gerektirir | Çok sayıda DB/HTTP çağrısı yapan API'ler |
| Gecikme | Redis önbelleğinden okuma, veritabanı sorgusu olmadan | Büyük payload'ların serileştirilmesiyle artar | SaaS, mobil, gerçek zamanlı backend |
| Doğrulama ve dokümantasyon | Pydantic v2 + otomatik OpenAPI 3.1 | Karmaşık şema başlatma süresini artırır | Swagger/ReDoc'lu herkese açık API'ler |
| Tipik maliyet | Açık kaynak, 1 vCPU'da çalışır | Yatay ölçekleme daha fazla süreç gerektirir | MVP'den üretime |
FastAPI ve alternatifleri
| Kriter | FastAPI | Django / Express |
|---|---|---|
| Asenkron performans | Mükemmel (yerel ASGI) | Django kısmen, Express iyi |
| Otomatik OpenAPI dokümanları | Evet, type hint'lerden | Ek paket gerektirir |
| Yerleşik admin / ORM | Hayır (ayrıca seçilir) | Django: evet; Express: hayır |
Sık sorulan sorular
FastAPI, Django'dan daha hızlı mı?
I/O'da evet. FastAPI, ASGI üzerinde asenkron çalışır; bu yüzden DB/HTTP çağrılı eşzamanlı isteklerin çok daha fazlasını klasik senkron Django'dan daha iyi karşılar. Ancak Django'nun yerleşik özellikleri daha fazladır.
FastAPI hangi iş için uygun değildir?
Yoğun CPU-bound görevlerde (görüntü işleme, ağır sayısal hesaplama) Python, Go veya Rust'tan yavaştır; bunları ayrı worker'lara taşırsınız. Ayrıca Django gibi hazır bir admin paneliyle gelmez.
FastAPI'nin bir ORM'ye ihtiyacı var mı?
Zorunlu değil. Migrasyonlar için Alembic'li SQLAlchemy 2.0 async kullanıyoruz, ancak saf SQL de yazabilirsiniz. ORM dahil değildir; projeye göre seçersiniz.
Bir FastAPI backend'i nasıl ölçeklerim?
Yatay olarak: Gunicorn altında birden çok Uvicorn süreci çalıştırır, bir yük dengeleyicinin arkasına koyar, Redis önbelleği kullanır ve ağır görevleri Celery'ye taşırsınız. Stateless tasarım, gerektiğinde örnek eklemeye izin verir.