Yükleniyor...

FastAPI Performans Optimizasyonu: 12 İleri Teknik [2026 Rehberi]

Yazar: Burak Balkı | Kategori: Performance | Okuma Süresi: 49 dk

2026'nın en güncel FastAPI performans optimizasyon tekniklerini içeren bu rehber, uygulamalarınızı hızlandırmak için 12 ileri strateji sunuyor. Asenkron prog...

# FastAPI Performans Optimizasyonu: 12 İleri Teknik [2026 Rehberi] Bugünün rekabetçi dijital dünyasında, kullanıcı deneyimini doğrudan etkileyen en kritik faktörlerden biri API'lerinizin hızı ve yanıt verme yeteneğidir. 2026 yılı itibarıyla, mikroservis mimarileri ve gerçek zamanlı uygulamaların yükselişiyle birlikte, FastAPI gibi modern web framework'lerinin performansı her zamankinden daha fazla önem kazanmıştır. Bu kapsamlı rehberde, Burak Balkı olarak, 10 yılı aşkın tecrübemle FastAPI uygulamalarınızın performansını zirveye taşıyacak 12 ileri optimizasyon tekniğini ve 2026'nın en güncel yaklaşımlarını adım adım ele alacağız. Amacımız, sadece hızlı çalışan değil, aynı zamanda ölçeklenebilir ve sürdürülebilir API'ler inşa etmenizi sağlamak. ## FastAPI Nedir? Neden Güncel Projelerin Tercihi? FastAPI, Python tabanlı, yüksek performanslı web API'leri oluşturmak için kullanılan modern, hızlı (adı üstünde) bir web framework'üdür. Starlette üzerine inşa edilmiş ve Pydantic ile veri doğrulama ve serileştirme desteği sunan FastAPI, asenkron programlamayı (async/await) baştan sona destekleyerek yüksek eşzamanlılık ve verim sağlar. 2026 itibarıyla, özellikle veri bilimi, makine öğrenimi servisleri ve gerçek zamanlı uygulamalar geliştiren ekipler arasında popülaritesi hızla artmaktadır. FastAPI, otomatik interaktif API dokümantasyonu (Swagger UI ve ReDoc), bağımlılık enjeksiyonu sistemi ve Type Hinting kullanımı sayesinde geliştirici verimliliğini artırırken, Uvicorn gibi asenkron web sunucuları ile birleştiğinde olağanüstü bir performans sergiler. Bu özellikler, onu modern, yüksek yüklü backend servisleri için 2026'nın en cazip çözümlerinden biri haline getirmektedir. Son projemde, eski bir Flask uygulamasını FastAPI'ye taşırken, API yanıt sürelerinde %60'a varan iyileşmeler gözlemledik, bu da framework'ün potansiyelini açıkça gösteriyor. ## Neden FastAPI ile Yüksek Performanslı API'ler Geliştirmelisiniz? FastAPI'nin 2026'daki popülaritesinin temelinde yatan birkaç kilit avantaj bulunmaktadır: * **Olağanüstü Hız:** Starlette ve Uvicorn'un asenkron yetenekleri sayesinde, FastAPI, Node.js ve Go gibi dillerle yazılmış birçok framework'ten daha iyi veya eşit performans gösterebilir. Bu, özellikle yüksek eşzamanlılık gerektiren uygulamalar için kritik bir avantajdır. * **Geliştirici Verimliliği:** Python'ın Type Hinting özelliğini Pydantic ile birleştirerek, veri doğrulama, serileştirme ve otomatik dokümantasyon süreçlerini otomatize eder. Bu, geliştirme süresini kısaltır ve hata oranını düşürür. * **Asenkron Desteği:** Python'ın `async` ve `await` anahtar kelimelerini tam olarak destekler. Bu, özellikle I/O yoğun (veritabanı sorguları, harici API çağrıları) işlemlerde uygulamanızın engellenmeden çalışmasını ve çok daha fazla isteği aynı anda işlemesini sağlar. * **Sağlamlık ve Güvenilirlik:** Pydantic sayesinde gelen verilerin otomatik olarak doğrulanması, uygulamanızın beklenmeyen veya hatalı girdilere karşı daha dirençli olmasını sağlar. Bu, production ortamında karşılaşılan hataları önemli ölçüde azaltır. * **Aktif Topluluk ve Ekosistem:** 2026 itibarıyla, FastAPI'nin GitHub'da 60.000'den fazla yıldızı ve aktif bir topluluğu bulunmaktadır. Bu, sürekli gelişim, bol kaynak ve hızlı destek anlamına gelir. Ekibimiz de bu aktif topluluğun sunduğu sayısız kaynak ve kütüphaneden faydalanmaktadır. FastAPI, sadece hızlı kod yazmakla kalmaz, aynı zamanda hızlı ve güvenilir uygulamalar oluşturmak için gereken tüm araçları sunar. Bu, özellikle büyük ölçekli ve yüksek performans beklentisi olan projelerde onu vazgeçilmez kılar. ## FastAPI vs. Flask vs. Django: Performans ve Geliştirici Deneyimi Karşılaştırması (2026) Python ekosistemindeki web framework'leri arasında seçim yaparken, özellikle performans ve geliştirici deneyimi açısından FastAPI, Flask ve Django arasındaki farkları anlamak önemlidir. 2026'daki durumları göz önüne alarak bir karşılaştırma tablosu sunalım: | Özellik | FastAPI (2026) | Flask (2026) | Django (2026) | | :------ | :------------- | :----------- | :------------ | | **Performans** | **Çok Yüksek** (Asenkron I/O, Uvicorn ile) | Orta (Senkron, WSGI ile) | Orta (Senkron, WSGI ile, büyük ORM yükü) | | **Asenkron Desteği** | **Yerleşik ve Tam** | Kısmi (Flask 2.x ile sınırlı) | Kısmi (Django 3.x+ ile sınırlı ASGI) | | **Veri Doğrulama** | **Pydantic (Otomatik)** | Harici kütüphaneler (Marshmallow vb.) | Django Forms, DRF Serializers | | **Otomatik Dokümantasyon** | **Evet (Swagger UI, ReDoc)** | Hayır (Harici eklentiler) | Hayır (DRF ile kısmi) | | **Öğrenme Eğrisi** | Orta (Python Type Hinting bilgisi gerekli) | Düşük (Minimalist) | Yüksek (Çok kapsamlı) | | **Ekosistem** | Modern, hızla büyüyen | Olgun, geniş | Çok olgun, devasa | | **Kullanım Alanı** | API servisleri, mikroservisler, ML API'leri | Küçük API'ler, prototipleme | Monolitik uygulamalar, CMS, büyük web siteleri | | **Kurumsal Destek** | Hızla artıyor | Yaygın | Çok yaygın | **Yorum:** 2026 itibarıyla, FastAPI, saf API performansı ve modern geliştirme pratikleri açısından rakiplerinin önüne geçmektedir. Flask, minimalist yapısıyla hala küçük projeler için cazip olsa da, büyük ölçekli asenkron yüklerde FastAPI'nin gerisinde kalır. Django ise "her şey dahil" yapısıyla tam teşekküllü web uygulamaları için güçlü bir seçenek olmaya devam etse de, API performansında FastAPI'nin sunduğu ham hıza genellikle ulaşamaz. Eğer ana hedefiniz yüksek performanslı, ölçeklenebilir ve modern bir API katmanı oluşturmaksa, FastAPI tartışmasız en iyi seçimdir. ## FastAPI Kurulumu ve İlk Hızlı API Adımları (2026) FastAPI ile performans optimizasyonuna başlamadan önce, temel bir FastAPI uygulamasını kurup çalıştırmamız gerekiyor. 2026'da Python 3.10 ve üzeri sürümlerin yaygınlaştığını varsayarak ilerleyelim. **Ön Gereksinimler:** * Python 3.10+ kurulu olmalı. * `pip` güncel olmalı. **Adım 1: Sanal Ortam Oluşturma ve Aktive Etme** Projeniz için izole bir ortam sağlamak her zaman iyi bir pratiktir. ```bash python3.10 -m venv venv source venv/bin/activate # Linux/macOS # venv\Scripts\activate # Windows ``` **Adım 2: FastAPI ve Uvicorn Kurulumu** FastAPI ve onun önerilen ASGI sunucusu Uvicorn'u kuralım. `uvicorn[standard]` ile ek bağımlılıkları da kurarız. ```bash pip install fastapi "uvicorn[standard]"==0.28.0 # 2026 itibarıyla güncel sürüme yakın bir örnek ``` **Adım 3: İlk FastAPI Uygulamanızı Oluşturma** `main.py` adında bir dosya oluşturalım ve içine aşağıdaki kodu yazalım: ```python # main.py from fastapi import FastAPI import uvicorn app = FastAPI() @app.get("/") async def read_root(): return {"message": "Merhaba Dünya! Bu 2026'nın Hızlı FastAPI API'si!"} @app.get("/items/{item_id}") async def read_item(item_id: int, q: str | None = None): return {"item_id": item_id, "q": q, "year": 2026} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000) ``` **Adım 4: Uygulamayı Çalıştırma** Terminalde aşağıdaki komutu çalıştırarak sunucuyu başlatın: ```bash uvicorn main:app --reload --host 0.0.0.0 --port 8000 ``` `--reload` geliştirme aşamasında kod değişikliklerini otomatik algılar. `--host 0.0.0.0` ile dışarıdan erişilebilir olmasını sağlarız. Tarayıcınızda `http://127.0.0.1:8000` ve `http://127.0.0.1:8000/items/5?q=fastapi` adreslerini ziyaret ederek API'nizin çalıştığını görebilirsiniz. Ayrıca `http://127.0.0.1:8000/docs` adresinden otomatik Swagger UI dokümantasyonuna erişebilirsiniz. ## Temel FastAPI Kullanımı: Asenkron CRUD Operasyonları ve Veri Validasyonu FastAPI'nin gücü, asenkron işlemleri ve Pydantic ile veri doğrulamasını bir araya getirmesinde yatar. Aşağıdaki örneklerde, basit bir ToDo listesi için asenkron CRUD (Create, Read, Update, Delete) operasyonlarını ve Pydantic model kullanımını inceleyelim. Bu örnekler, 2026'da modern API geliştirmenin temelini oluşturur. **Örnek 1: Pydantic Modeli ile Veri Doğrulama** İlk olarak, `models.py` adında bir dosya oluşturalım ve Pydantic modelimizi tanımlayalım: ```python # models.py from pydantic import BaseModel from typing import Optional class Item(BaseModel): name: str description: Optional[str] = None price: float tax: Optional[float] = None is_completed: bool = False class Config: schema_extra = { "example": { "name": "FastAPI Öğren", "description": "2026'da FastAPI'yi optimize etmeyi öğren.", "price": 12.99, "tax": 1.05, "is_completed": False } } ``` **Örnek 2: Asenkron GET ve POST Operasyonları** Şimdi `main.py` dosyamızı güncelleyelim. Basit bir bellek içi veritabanı kullanacağız. ```python # main.py (güncellenmiş) from fastapi import FastAPI, HTTPException from typing import Dict from models import Item # models.py dosyamızdan Item modelini içe aktarıyoruz import uvicorn app = FastAPI() # Basit bir bellek içi "veritabanı" items_db: Dict[int, Item] = {} next_item_id = 1 @app.get("/", tags=["Root"]) async def read_root(): return {"message": "Merhaba Dünya!"} @app.post("/items/", response_model=Item, status_code=201, tags=["Items"]) async def create_item(item: Item): global next_item_id item_id = next_item_id items_db[item_id] = item next_item_id += 1 return item @app.get("/items/{item_id}", response_model=Item, tags=["Items"]) async def read_item(item_id: int): if item_id not in items_db: raise HTTPException(status_code=404, detail="Item not found in 2026 database") return items_db[item_id] @app.put("/items/{item_id}", response_model=Item, tags=["Items"]) async def update_item(item_id: int, item: Item): if item_id not in items_db: raise HTTPException(status_code=404, detail="Item not found for update") items_db[item_id] = item return item @app.delete("/items/{item_id}", status_code=204, tags=["Items"]) async def delete_item(item_id: int): if item_id not in items_db: raise HTTPException(status_code=404, detail="Item not found for deletion") del items_db[item_id] return # 204 No Content için boş dönüş if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000) ``` Bu örnekte, `Item` modelini kullanarak gelen POST verilerini otomatik olarak doğruladık ve `async` fonksiyonlarla asenkron operasyonlar tanımladık. Bu yapı, 2026'da yüksek performanslı ve güvenilir API'ler geliştirmenin temelidir. ## İleri Seviye FastAPI Optimizasyon Teknikleri (Senior Geliştiriciler İçin) FastAPI'nin temel kullanımı güçlü olsa da, gerçek dünya üretim ortamlarında üstün performans elde etmek için ileri seviye tekniklere ihtiyaç duyarız. Burak Balkı olarak, 2026'da büyük ölçekli sistemlerde uyguladığımız bazı kritik teknikleri burada paylaşıyorum: ### 1. Bağımlılık Enjeksiyonu (Dependency Injection) ile Kaynak Yönetimi FastAPI'nin bağımlılık enjeksiyonu sistemi, kodunuzu daha modüler, test edilebilir ve yeniden kullanılabilir hale getirirken, aynı zamanda veritabanı bağlantıları veya önbellek istemcileri gibi kaynakların yönetimini optimize etmenizi sağlar. Bu, her istekte yeni bir bağlantı oluşturma maliyetinden kaçınarak performansı artırır. ```python # main.py - Veritabanı bağlantı örneği from fastapi import FastAPI, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine from sqlalchemy.orm import sessionmaker from sqlalchemy import Column, Integer, String from sqlalchemy.ext.declarative import declarative_base # 2026'da asyncpg destekli bir PostgreSQL bağlantısı DATABASE_URL = "postgresql+asyncpg://user:password@host/dbname" engine = create_async_engine(DATABASE_URL, echo=True) AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) Base = declarative_base() class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) name = Column(String, index=True) # Veritabanı oturumu almak için bağımlılık async def get_db(): async with AsyncSessionLocal() as session: yield session app = FastAPI() @app.on_event("startup") async def startup_event(): async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) @app.post("/users/") async def create_user(name: str, db: AsyncSession = Depends(get_db)): new_user = User(name=name) db.add(new_user) await db.commit() await db.refresh(new_user) return new_user # ... diğer endpoint'ler ``` ### 2. Arka Plan Görevleri (Background Tasks) ile Asenkron İşleme Uzun süren işlemleri (e-posta gönderme, dosya işleme, loglama) ana istek-yanıt döngüsünden ayırmak için arka plan görevlerini kullanın. Bu, API'nizin kullanıcıya daha hızlı yanıt vermesini sağlar. ```python from fastapi import FastAPI, BackgroundTasks import time app = FastAPI() def write_notification(email: str, message="Merhaba!"): time.sleep(5) # Uzun süren bir işlem simülasyonu with open("log.txt", mode="a") as email_file: content = f"notification for {email}: {message}\n" email_file.write(content) @app.post("/send-notification/{email}") async def send_notification(email: str, background_tasks: BackgroundTasks): background_tasks.add_task(write_notification, email, message="2026'nın en hızlı API'si!") return {"message": "Bildirim arka planda gönderiliyor"} ``` ### 3. Middleware Kullanımı (Sıkıştırma, Önbellekleme) Middleware'ler, her isteğin ve yanıtın işlenmesi sırasında belirli mantığı uygulamanıza olanak tanır. Özellikle sıkıştırma ve basit önbellekleme için çok etkilidirler. ```python from fastapi import FastAPI from fastapi.middleware.gzip import GZipMiddleware from starlette.middleware.base import BaseHTTPMiddleware from starlette.responses import Response from starlette.requests import Request import time app = FastAPI() # GZip sıkıştırma middleware'i app.add_middleware(GZipMiddleware, minimum_size=1000) # Basit bir önbellekleme middleware'i (sadece örnek amaçlı) class SimpleCacheMiddleware(BaseHTTPMiddleware): async def dispatch(self, request: Request, call_next): if request.url.path == "/cached-data": if "cached_response" in app.state._state: print("Önbellekten servis ediliyor (2026)") return app.state._state["cached_response"] response = await call_next(request) if request.url.path == "/cached-data" and response.status_code == 200: app.state._state["cached_response"] = response print("Yanıt önbelleğe alındı") return response app.add_middleware(SimpleCacheMiddleware) @app.get("/cached-data") async def get_cached_data(): time.sleep(2) # Uzun süren işlem simülasyonu return {"data": "Bu veri önbelleğe alındı ve 2026'da hızlı servis ediliyor!", "timestamp": time.time()} @app.get("/uncached-data") async def get_uncached_data(): return {"data": "Bu veri her seferinde yeniden üretiliyor", "timestamp": time.time()} ``` ### 4. Custom APIRouter ile Modüler ve Optimize Edilmiş Yapı Büyük uygulamalarda, API endpoint'lerini modüler hale getirmek için `APIRouter` kullanmak hem kod organizasyonu hem de performans açısından faydalıdır. Her router kendi bağımlılıklarına, middleware'lerine sahip olabilir. ```python # routers/users.py from fastapi import APIRouter, Depends router = APIRouter(prefix="/users", tags=["Users"]) async def get_current_user(): return {"username": "burak.balki", "id": 1, "year": 2026} @router.get("/") async def read_users(current_user: dict = Depends(get_current_user)): return [{"username": "Alice"}, {"username": "Bob"}, current_user] # main.py from fastapi import FastAPI from routers import users app = FastAPI() app.include_router(users.router) # ... diğer endpoint'ler ``` ### 5. Asenkron Veritabanı Operasyonları ile I/O Engellemesini Önleme Veritabanı işlemleri genellikle I/O yoğun olduğundan, `asyncio` uyumlu veritabanı sürücüleri ve ORM'ler kullanmak kritik öneme sahiptir. 2026'da `SQLAlchemy 2.0`'ın asenkron desteği ve `databases` kütüphanesi bu alanda önemli çözümler sunar. ```python # main.py - Asenkron veritabanı örneği (PostgreSQL) # pip install asyncpg databases sqlalchemy from fastapi import FastAPI from databases import Database from pydantic import BaseModel DATABASE_URL = "postgresql+asyncpg://user:password@host/dbname" database = Database(DATABASE_URL) app = FastAPI() @app.on_event("startup") async def startup(): await database.connect() @app.on_event("shutdown") async def shutdown(): await database.disconnect() class Post(BaseModel): title: str content: str @app.post("/posts/") async def create_post(post: Post): query = "INSERT INTO posts (title, content) VALUES (:title, :content) RETURNING id" values = {"title": post.title, "content": post.content} post_id = await database.execute(query=query, values=values) return {"id": post_id, **post.dict()} @app.get("/posts/{post_id}") async def read_post(post_id: int): query = "SELECT id, title, content FROM posts WHERE id = :id" post = await database.fetch_one(query=query, values={"id": post_id}) if post is None: raise HTTPException(status_code=404, detail="Post not found in 2026") return post ``` ## FastAPI Best Practices ve Kaçınılması Gereken Anti-Pattern'lar (2026) Performanslı ve sürdürülebilir FastAPI uygulamaları geliştirmek için belirli en iyi pratikleri uygulamak ve yaygın anti-pattern'lardan kaçınmak hayati önem taşır. Ekibimizle 2026'da edindiğimiz tecrübelerle bu listeyi derledik: * ✅ **Asenkron Fonksiyonları Doğru Kullanın:** Veritabanı sorguları, ağ istekleri gibi I/O yoğun işlemleri her zaman `async def` ile tanımlayın ve `await` kullanarak bekleyin. Bu, uygulamanızın engellenmeden diğer işlemleri yapmasını sağlar. * ❌ **Blocking I/O İşlemlerini `async def` İçinde Yapmayın:** `time.sleep()`, `requests.get()` veya senkron ORM çağrıları gibi bloklayıcı işlemleri doğrudan `async def` içinde kullanmaktan kaçının. Bunun yerine `run_in_executor` veya asenkron kütüphaneler kullanın. Aksi takdirde, `asyncio` event loop'unuzu bloke ederek uygulamanızın performansını düşürürsünüz. * ✅ **Pydantic Modellerini Etkin Kullanın:** Gelen ve giden verileri Pydantic modelleriyle doğrulayın ve serileştirin. Bu, hem güvenlik hem de otomatik dokümantasyon sağlar. Ayrıca, `__slots__` kullanarak bellek kullanımını optimize edebilirsiniz. * ❌ **Büyük Veri Yüklerini Doğrudan Döndürmeyin:** Çok büyük JSON yanıtları performansı düşürebilir. Gerekirse sayfalandırma (pagination) uygulayın veya verileri sıkıştırarak gönderin. `StreamingResponse` veya `FileResponse` gibi seçenekleri değerlendirin. * ✅ **Uvicorn/Gunicorn Worker Ayarlarını Optimize Edin:** Üretim ortamında, Uvicorn'u Gunicorn gibi bir process manager ile birlikte kullanın ve worker sayısını sunucu çekirdek sayınıza göre ayarlayın (genellikle `2 * CPU_CORES + 1`). Bu, CPU kaynaklarının etkin kullanımını sağlar. * ❌ **Tek Bir Veritabanı Bağlantısını Paylaşmayın:** Her istek için ayrı bir veritabanı bağlantısı açıp kapatmak yerine, bağlantı havuzlama (connection pooling) kullanın. FastAPI'nin bağımlılık enjeksiyonu ile bu kolayca yönetilebilir. * ✅ **Önbellekleme (Caching) Stratejileri Uygulayın:** Sık erişilen ama nadiren değişen veriler için Redis veya Memcached gibi önbellekleme çözümlerini kullanın. Bu, veritabanı yükünü azaltır ve yanıt sürelerini önemli ölçüde kısaltır. * ❌ **Gereksiz Hesaplamaları Tekrarlamayın:** Bir isteğin yaşam döngüsü içinde aynı ağır hesaplamayı birden fazla kez yapmaktan kaçının. Sonuçları bellekte saklayın veya bağımlılık enjeksiyonu ile tek seferlik hesaplatın. * ✅ **Rate Limiting ve Throttling Uygulayın:** API'nizi kötü niyetli veya aşırı kullanımdan korumak için istek sınırlaması uygulayın. Bu, sunucu kaynaklarınızı korur ve hizmet kalitesini artırır. * ✅ **HTTP/2 ve Gzip Sıkıştırmayı Etkinleştirin:** Ağ trafiğini azaltmak ve yanıt sürelerini iyileştirmek için HTTP/2 protokolünü ve Gzip sıkıştırmayı kullanın. FastAPI'nin `GZipMiddleware`'i bu konuda yardımcı olur. * ✅ **Güvenlik Başlıklarını Kullanın:** `Content-Security-Policy`, `X-Content-Type-Options` gibi güvenlik başlıklarını middleware aracılığıyla ekleyin. Bu, uygulamanızı yaygın web saldırılarına karşı korur. * ❌ **Hata Yönetimini İhmal Etmeyin:** Uygulamanızdaki hataları doğru bir şekilde yakalayın ve anlamlı hata mesajları döndürün. `HTTPException` kullanımı, istemciye okunabilir hata kodları ve mesajları sunar. Unhandled exception'lar, uygulamanızın kararlılığını olumsuz etkiler. ## Yaygın FastAPI Performans Hataları ve Etkili Çözümleri FastAPI ile çalışırken geliştiricilerin sıkça karşılaştığı ve performansı olumsuz etkileyen bazı hatalar vardır. Bu hataları bilmek ve doğru çözümler uygulamak, 2026'da daha sağlam ve hızlı API'ler inşa etmenizi sağlar. Production ortamında edindiğimiz tecrübelerle en yaygın 3-4 hatayı ve çözümlerini inceleyelim: ### 1. Hata: `async def` içinde Blocking I/O İşlemleri * **Problem:** `async def` olarak tanımlanmış bir endpoint içinde, senkron bir kütüphane (örneğin `requests`, `time.sleep()`, senkron veritabanı sürücüleri) kullanmak, `asyncio` event loop'unu bloke eder. Bu, diğer eşzamanlı isteklerin yanıt sürelerini uzatır ve uygulamanın genel verimini düşürür. * **Sebep:** Python'ın `asyncio`'su tek bir iş parçacığı üzerinde çalışır. Blocking bir işlem, bu iş parçacığını meşgul eder ve diğer `await` edilebilir görevlerin çalışmasını engeller. * **Çözüm:** Blocking I/O işlemlerini `loop.run_in_executor()` kullanarak ayrı bir iş parçacığı havuzuna taşıyın veya asenkron alternatiflerini kullanın (örneğin `httpx` yerine `requests`, `asyncpg` veya `databases` yerine `psycopg2`). ```python from fastapi import FastAPI import time import asyncio # asyncio modülünü import ediyoruz app = FastAPI() # ❌ KÖTÜ ÖRNEK: Blocking I/O async fonksiyonda @app.get("/slow-sync") async def slow_sync_endpoint(): time.sleep(3) # Bu, event loop'u bloke eder! return {"message": "Çok yavaş yanıt (2026'da kaçınılmalı)"} # ✅ İYİ ÖRNEK: Blocking I/O'yu executor'a taşıma def blocking_operation(): time.sleep(3) return "Blocking işlem tamamlandı" @app.get("/fast-async") async def fast_async_endpoint(): # Blocking işlemi ayrı bir thread'de çalıştır result = await asyncio.to_thread(blocking_operation) # Python 3.9+'da asyncio.to_thread # Python 3.8 ve öncesi için: # loop = asyncio.get_event_loop() # result = await loop.run_in_executor(None, blocking_operation) return {"message": f"Hızlı yanıt: {result} (2026)"} ``` ### 2. Hata: Yanlış Uvicorn/Gunicorn Worker Konfigürasyonu * **Problem:** Üretim ortamında `uvicorn main:app` komutuyla tek bir worker ile çalışmak veya Gunicorn ile yanlış worker sayısı ayarlamak, sunucu kaynaklarının (CPU çekirdekleri) yetersiz kullanılmasına ve düşük verime yol açar. * **Sebep:** Tek bir Uvicorn worker, genellikle tek bir CPU çekirdeğini etkin kullanır. Python'ın GIL (Global Interpreter Lock) nedeniyle CPU yoğun işlemlerde birden fazla iş parçacığı aynı anda çalışamaz. Asenkron uygulamalar I/O beklerken diğer görevlere geçebilir, ancak CPU'yu tam kullanmak için birden fazla process gerekir. * **Çözüm:** Gunicorn gibi bir process manager kullanarak birden fazla Uvicorn worker çalıştırın. Worker sayısını sunucunuzdaki CPU çekirdeği sayısının `(2 * CPU_CORES) + 1` formülüyle ayarlamak iyi bir başlangıç noktasıdır. ```bash # ✅ İYİ ÖRNEK: Gunicorn ile 4 CPU çekirdeği için Uvicorn çalıştırma gunicorn main:app --workers 9 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000 ``` ### 3. Hata: Veritabanı Bağlantı Havuzlamasının İhmal Edilmesi * **Problem:** Her API isteği için yeni bir veritabanı bağlantısı açıp kapatmak, ciddi bir performans yükü oluşturur. Bağlantı kurma ve sonlandırma işlemleri pahalıdır. * **Sebep:** Veritabanı bağlantıları kaynak yoğun işlemlerdir. Her istekte bu maliyeti tekrarlamak, uygulamanızın yanıt süresini uzatır ve veritabanı sunucusuna gereksiz yük bindirir. * **Çözüm:** Veritabanı bağlantı havuzlaması (connection pooling) kullanın. SQLAlchemy'nin asenkron motorları veya `databases` gibi kütüphaneler bunu otomatik olarak sağlar. Havuzdaki mevcut bağlantıları yeniden kullanarak maliyeti düşürürsünüz. ```python # main.py - Connection pooling için SQLAlchemy AsyncEngine from sqlalchemy.ext.asyncio import create_async_engine from sqlalchemy.orm import sessionmaker # create_async_engine varsayılan olarak connection pooling kullanır engine = create_async_engine( "postgresql+asyncpg://user:password@host/dbname", pool_size=10, # Havuzdaki minimum bağlantı sayısı max_overflow=20, # Havuzun maksimum genişleyebileceği bağlantı sayısı pool_timeout=30, # Bağlantı beklerken maksimum süre (saniye) pool_recycle=1800 # Bağlantıların yeniden kullanılmadan önce yenilenme süresi (saniye) ) AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) # get_db bağımlılığı bu havuzdan oturumları sağlar (yukarıdaki örneğe bakınız) ``` ## FastAPI Uygulamalarında Kapsamlı Performans Optimizasyonu Stratejileri FastAPI ile yüksek performans elde etmek, tek bir sihirli değnekle değil, bir dizi stratejinin bir araya getirilmesiyle mümkündür. 2026'da üretim ortamında karşılaştığımız senaryolara göre, işte uygulayabileceğiniz kapsamlı optimizasyon teknikleri: ### 1. Metriklerin İzlenmesi ve Profiling Optimizasyona başlamadan önce, uygulamanızın mevcut performansını anlamanız ve darboğazları tespit etmeniz gerekir. **Metrikler:** * **Gecikme (Latency):** API yanıt süreleri (ms). Hedefiniz genellikle 100ms altıdır. * **Verim (Throughput):** Saniye başına işlenen istek sayısı (req/s). * **Hata Oranı (Error Rate):** Hatalı yanıtların toplam isteklere oranı. * **CPU/Bellek Kullanımı:** Sunucu kaynaklarının ne kadar tüketildiği. **Profiling Araçları:** * `py-spy`: Çalışan bir Python sürecinin CPU ve bellek kullanımını gerçek zamanlı olarak izlemek için harika bir araçtır. Flame graph'ler oluşturarak darboğazları görselleştirir. * `cProfile`: Python'ın dahili profilleyicisidir. Kodunuzdaki her fonksiyonun ne kadar zaman aldığını gösterir. * `FastAPI-Profiler`: FastAPI uygulamaları için özel olarak geliştirilmiş bir profilleyici middleware'dir. ```bash # py-spy ile çalışan bir FastAPI uygulamasını profile etme (PID'yi bulun) sudo py-spy record -o profile.svg --pid ``` ### 2. Asenkron Programlama Derinlemesine: `asyncio` ve `run_in_executor` `asyncio`'nun gücünü tam olarak kullanmak, FastAPI'nin performans potansiyelini ortaya çıkarır. CPU yoğun görevler için `loop.run_in_executor` veya Python 3.9+ ile `asyncio.to_thread` kullanmak, event loop'u bloke etmeden bu görevleri ayrı iş parçacıklarında çalıştırmanın anahtarıdır. ```python # main.py - CPU yoğun işlem örneği from fastapi import FastAPI import asyncio import time app = FastAPI() def cpu_bound_task(n: int): # Basit bir CPU yoğun işlem result = 0 for i in range(n): result += i * i return result @app.get("/calculate/{n}") async def calculate_endpoint(n: int): # CPU yoğun işlemi ayrı bir thread'de çalıştır start_time = time.time() result = await asyncio.to_thread(cpu_bound_task, n) end_time = time.time() return {"result": result, "time_taken": f"{end_time - start_time:.2f} saniye (2026)"} ``` ### 3. Veritabanı Optimizasyonları Veritabanı, genellikle API'lerin en büyük darboğazlarından biridir. * **Asenkron ORM/Sürücüler:** `SQLAlchemy 2.0` (async motorları), `SQLModel`, `databases` gibi asenkron kütüphaneler kullanın. * **Connection Pooling:** Veritabanı bağlantı havuzlamayı doğru yapılandırın (yukarıdaki örneğe bakınız). * **Sorgu Optimizasyonu:** N+1 sorgu problemlerinden kaçının, indeksler kullanın, `EXPLAIN ANALYZE` ile sorguları analiz edin. * **Batch İşlemler:** Birden fazla kaydı tek bir işlemde eklemek veya güncellemek için `executemany` gibi toplu işlem yöntemlerini kullanın. ### 4. Önbellekleme (Caching) Sık erişilen ve değişmeyen verileri önbelleğe almak, veritabanı yükünü ve yanıt sürelerini önemli ölçüde azaltır. * **Redis/Memcached:** Dış önbellekleme sistemleri kullanın. `FastAPI-Cache` veya `python-redis-cache` gibi kütüphaneler entegrasyonu kolaylaştırır. * **HTTP Caching (Etag, Last-Modified):** İstemci tarafında önbelleklemeyi etkinleştirmek için HTTP başlıklarını kullanın. * **In-Memory Caching:** Küçük, kısa ömürlü veriler için uygulama içinde basit bir `lru_cache` veya sözlük tabanlı önbellek kullanabilirsiniz. ```python # main.py - FastAPI-Cache örneği (pip install fastapi-cache2 redis) from fastapi import FastAPI from fastapi_cache import FastAPICache from fastapi_cache.backends.redis import RedisBackend from redis import asyncio as aioredis import time app = FastAPI() @app.on_event("startup") async def startup(): redis = aioredis.from_url("redis://localhost", encoding="utf8", decode_responses=True) FastAPICache.init(RedisBackend(redis), prefix="fastapi-cache-2026") @app.get("/cached-slow-data") @FastAPICache.cache(expire=60) # 60 saniye önbellekte tut async def get_cached_slow_data(): time.sleep(2) # Simüle edilmiş uzun işlem return {"data": "Bu veri Redis'ten önbelleğe alındı!", "timestamp": time.time()} ``` ### 5. Sıkıştırma ve HTTP/2 * **GzipMiddleware:** FastAPI'nin yerleşik `GZipMiddleware`'ini kullanarak yanıtları otomatik olarak sıkıştırın. Bu, ağ gecikmesini ve bant genişliği tüketimini azaltır. * **HTTP/2:** Uvicorn, HTTP/2'yi destekler. Modern client'lar ile daha verimli iletişim sağlar (multiplexing, header sıkıştırma). ```python # main.py - GZipMiddleware kullanımı (yukarıdaki örnekte de vardı) from fastapi import FastAPI from fastapi.middleware.gzip import GZipMiddleware app = FastAPI() app.add_middleware(GZipMiddleware, minimum_size=1024) # 1KB'den büyük yanıtları sıkıştır @app.get("/large-data") async def get_large_data(): return {"data": "A" * 5000, "year": 2026} # 5KB'lık bir veri ``` ### 6. Worker Yönetimi ve Concurrency A