API Performans¶
Test: 1 Temmuz 2026 · tek kullanıcı · altı aylık veri (200 fabrika, 4.000 makine, 5.000 görev)
Sonuçlar¶
| # | Ekran | Önce | Sonra | Durum |
|---|---|---|---|---|
| 1 | Görev listesi | 437 ms | 23 ms | Düzeltildi |
| 2 | Kullanıcı kaydı (50 kişi aynı anda) | — | 1.25 sn | Düzeltildi |
| 3 | Fabrika listesi | 345 ms | 24 ms | Düzeltildi (hedef 30 ms) |
| 4 | Makine listesi | 351 ms | 320 ms | Düzeltildi |
| 5 | Bildirimler (yoğun kullanım) | 10 ms | 4 ms | Düzeltildi |
| 6 | Fabrika haritası | event loop bloklanıyor | 6 eşzamanlı render altında 0,79 sn max | Düzeltildi |
Görev listesi yük altında (1 kullanıcı, 1 dk test): 417 ms → 60 ms.
Sorun neydi¶
| Ekran | Sorun |
|---|---|
| Görev listesi | Her satır için ayrı veritabanı sorgusu (not, fabrika, atananlar). |
| Kullanıcı kaydı | Şifre + QR üretimi uygulamayı donduruyor. |
| Fabrika listesi | Listede gösterilmeyen modül, alan, kategori verisi de gidiyor. |
| Makine listesi | Her sayfa açılışında tüm makineler sayılıyor. |
| Bildirimler | Liste ve okunmamış sayım sorgularında (user_id, timestamp) ve okunmamış satırlar için destekleyici indeks yoktu. |
| Harita | Async endpoint senkron Graphviz render işlemini doğrudan event loop üzerinde çağırıyordu. Düzeltildi 2026-07-01: sınırlı async semaphore (MINDMAP_RENDER_CONCURRENCY, varsayılan 1) render slot'larını kontrol eder; token doğrulama, DB okumaları ve Graphviz PDF işi yalnızca slot alındıktan sonra Starlette threadpool'unda çalışır, bu yüzden kuyrukta bekleyen istekler artık veritabanı session'ı tutmaz. Çıktı her istek için ayrı geçici dizin kullanır. |
Sırada ne var¶
| Ekran | Çözüm |
|---|---|
| Kullanıcı kaydı | Düzeltildi — asenkron QR işçisi; kıyaslama: scripts/performance/run_signup_benchmark.py |
| Fabrika listesi | Düzeltildi — hafif FactoryListItem şeması + selectinload detay sorgusu. |
| Makine listesi | Düzeltildi — varsayılan COUNT(*) yok; tam toplamlar include_totals=true ile isteğe bağlı. |
| Bildirimler | Düzeltildi |
| Harita | Düzeltildi - sınırlı threadpool render + izole geçici render dizini |
Fabrika listesi takip kontrolleri¶
Liste gecikme düzeltmesi 30 Haziran 2026'da yayınlandı. Bu maddeyi kapatmadan önce şu kontrolleri tamamlayın:
| # | Kontrol | Sorumlu | Durum |
|---|---|---|---|
| 1 | Mobil istemci ile doğrulayın: GET /api/factories listesi artık iç içe ilişki verisine (sectors, production_categories, production_areas, modules, sub_modules) ihtiyaç duymuyor. Detay GET /api/factories/{id} üzerinden gelmeye devam ediyor. |
Mobil + backend | Açık |
| 2 | get_factory() fonksiyonunu ikiye ayırın: yazma/ doğrulama yolları için yalın lookup (varlık / ID kontrolü) ve beş M2M ilişki için selectinload kullanan detay loader. Teklif, görev ve takvim doğrulama çağrılarında ilişkileri yüklemeyin. |
Backend | Açık |
| 3 | Sözleşme testleri ekleyin: liste yanıt şekli (FactoryListItem yalnızca skaler alanlar, ilişki anahtarı yok) ve sayfalama başlıkları (X-Total-Count, X-Total-Pages, X-Current-Page). |
Backend | Açık |
| 4 | Detay sorgu verimliliği testini yalnızca sectors değil, beş M2M ilişkinin tamamını seed edecek şekilde genişletin; herhangi bir koleksiyonda selectinload gerilemesi yakalansın. |
Backend | Açık |
| 5 | Danışmanların GET /api/factories/{id} üzerinde de liste davranışıyla (created_by == current_user) kısıtlanması gerekip gerekmediğine karar verin. Bugün liste danışmanları filtreler; detay filtrelemez. |
Ürün + backend | Açık |
Test: volume-testing.tr.md
Fabrika haritası render güvenliği (2026-07-01)¶
Graphviz kurulu yerel ortamda (dot 15.0.0, Python graphviz==0.20.3) port 8002 üzerinde çalışan uvicorn ile doğrulandı:
| Probe | Sonuç |
|---|---|
| Tek gerçek mindmap isteği | HTTP 200, 165 ms, 146 KiB PDF |
| Altı eşzamanlı gerçek mindmap isteği | tamamı HTTP 200, max 790 ms |
Altı mindmap isteği sırasında /api/openapi.json |
HTTP 200, 4 ms |
Altı mindmap isteği sırasında /api/factories?limit=1 |
HTTP 200, 17 ms |
Endpoint artık event loop'u bloklamıyor ve kuyrukta bekleyen mindmap istekleri veritabanı session'ı tutmuyor. Yine de PDF üretimi CPU ve process işi yapar; kullanım artarsa sınır korunmalı veya job queue modeline taşınmalıdır.
Dağıtım bağımlılıkları¶
| Gereksinim | Kaynak | Not |
|---|---|---|
Python graphviz==0.20.3 |
requirements/runtime.txt |
Yalnızca wrapper; pip install -r requirements/runtime.txt ile kurulur |
Graphviz dot binary'si |
İşletim sistemi paketi | Çalışma zamanında zorunlu; örn. apt install graphviz veya brew install graphviz |
MINDMAP_RENDER_CONCURRENCY |
Ortam değişkeni | İsteğe bağlı; varsayılan 1; worker başına eşzamanlı mindmap render üst sınırı |