2019 Flashcards

(43 cards)

1
Q

Case 1
Key Design Decisions
Why FastAPI for API Layer

A
  • Async support for concurrent requests
    • Automatic OpenAPI/Swagger documentation
    • Type safety with Pydantic
    • Built-in validation and serialization
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Case 1
Key Design Decisions
Triton Inference Server

A
  • Production-grade model serving with GPU support
    • Dynamic batching for throughput optimization
    • Model versioning and A/B testing capabilities
    • Supports both HTTP and gRPC protocols
    • Industry standard for ML inference at scale
  • Model performance analyze for optimum settings
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Case 1
Key Design Decisions
PostgreSQL for Metadata

A
  • Relational data (images, objects, relationships)
    • ACID guarantees for data consistency
    • Indexed queries for fast lookups
    • Well-understood and maintainable
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Case 1
Key Design Decisions
MinIO/S3 for Object Storage

A
  • Scalable storage for images, masks, visualizations
    • S3-compatible API for easy migration to AWS
    • Separation of compute and storage
    • Cost-effective for large artifacts
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Case 1

Why not use a NoSQL database like MongoDB for metadata?

A

I considered MongoDB, but chose PostgreSQL because:
- Structured relationships: Images → Objects is a clear relational model
- ACID transactions: When creating an image record and its objects, we need atomicity
- Query patterns: Most queries are simple lookups by ID or filtering by image_id (indexed)
- Maturity: PostgreSQL is battle-tested for production workloads
- Team familiarity: Easier for other engineers to maintain

However, if we needed to store unstructured detection metadata or had very high write volumes, MongoDB could be a better fit.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Case 1

Why did you choose YOLOv8-Segmentation over other approaches

A

Sistem, mimari olarak YOLOv8 Segmentation modelini kullanmasına rağmen, eğitim veri setinde maske etiketlerinin bulunmaması ve kod altyapısının modelden dönen segmentasyon verisini (output1) işlememesi nedeniyle fiilen standart bir nesne tespit (object detection) aracı olarak çalışmaktadır. “Daire tespiti” olarak sunulan sonuçlar, modelin nesnenin şeklini tanımasıyla değil, tespit edilen dikdörtgen kutuların (bounding box) genişlik ve yükseklik değerlerinin ortalaması alınarak yapılan matematiksel bir tahmine (approximation) dayanır; bu nedenle görselleştirilen çıktılar, nesnenin gerçek formu değil, hesaplanan koordinatlara sonradan çizdirilen yapay ve kusursuz dairelerdir.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Case 1

Peki datada segmentation yok, sistemi başka nasıl kurgulardın

A

Seviye 1: Hibrit Yaklaşım (YOLO + OpenCV “Hough Circle”)
Seviye 2: YOLO + GrabCut (Foreground Extraction)
Seviye 3: YOLO + Pre-trained Background Removal (U2Net / Rembg)
Seviye 4: YOLO + SAM (Segment Anything Model) - Prompting
Seviye 5: Auto-Labeling & Model Distillation (En Gelişmiş Mimari) 👑

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Case 1
S3/MinIO vs Local Filesystem

A

Local filesystem ilk bakışta basit görünse de horizontal scaling’i anında kilitler. API server’lar stateless olduğunda çoklu instance çalıştırırsınız; fakat her instance kendi diski üzerinde tutulmuş image’ları göremez. Shared-disk çözümü (NFS, EFS) devreye girince de latency artar, throughput düşer ve reliability zayıflar. S3/MinIO ise tek bir global object store gibi çalışarak tüm instance’ların aynı asetlere erişmesini garanti eder.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Case 1
Zamanın olsa depolama sistemini nasıl kurardın

A

Hibrit bir mimari, performans ile dayanıklılık arasında orta yol arayan sistemler için güçlü bir seçenektir. Burada dosyalar önce local disk’e çok hızlı şekilde yazılır, API request’i düşük latency ile cevaplanır. Daha sonra background worker—örn. Celery, Kafka consumer, SQS/Lambda pipeline—dosyayı S3’e upload eder. Upload başarılı olduğunda metadata güncellenir. Bu model özellikle yüksek QPS altında S3 write latency’sini kullanıcıya hissettirmemek için idealdir.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Case 1
### Q4: How does your solution handle high traffic? What are the bottlenecks?
1. API Layer (FastAPI):

A
  • Async/await for concurrent request handling
    • Can horizontally scale with multiple API instances
    • Stateless design allows load balancing
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Case 1
### Q4: How does your solution handle high traffic? What are the bottlenecks?

  1. Triton Inference Server:
A
  • Dynamic Batching: Groups multiple requests for efficient GPU utilization
    • Model Instances: Can run multiple model instances per GPU
    • Horizontal Scaling: Multiple Triton instances behind load balancer
    • GPU Utilization: Optimized for batch inference
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Case 1
### Q4: How does your solution handle high traffic? What are the bottlenecks?

  1. PostgreSQL:
A
  • Connection pooling (SQLAlchemy pool)
    • Indexed queries (image_id, object_id)
    • Read replicas for scaling reads
    • Partitioning by date if needed
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Case 1
### Q4: How does your solution handle high traffic? What are the bottlenecks?

  1. MinIO/S3:
A
  • Horizontally scalable object storage
    • CDN integration for image serving
    • Lifecycle policies for cost optimization
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Case 1
Bottlenecks & Solutions:
| Triton GPU |
| PostgreSQL Writes |
| Image Upload |
| Storage I/O |

Triton GPU |

A

~30-50 req/s per GPU | Add more GPU instances, use TensorRT |

| Image Upload |
Network bandwidth | Async uploads, compression |

| Storage I/O |
S3 API rate limits | Local cache layer, CDN |

| Triton GPU |

PostgreSQL Writes |
~1000 writes/s | Connection pooling, write batching

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Case 1
Scaling Strategy:

A
  1. Vertical Scaling: Larger GPUs, more memory
  2. Horizontal Scaling: Multiple API + Triton instances
  3. Caching: Redis for frequently accessed images/metadata
  4. Async Processing: Queue system (Celery/RQ) for non-real-time tasks
  5. CDN: CloudFront/Cloudflare for static assets
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Case 1
Follow-up: What metrics would you monitor to detect bottlenecks?

API Metrics

A
  • Request rate (req/s)
    • P50/P95/P99 latency
    • Error rate (4xx, 5xx)
    • Active connections
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Case 1
Follow-up: What metrics would you monitor to detect bottlenecks?

Triton Metrics

A
  • Inference latency (preprocessing + inference + postprocessing)
    • Queue depth (waiting requests)
    • GPU utilization %
    • Batch size distribution
    • Model cache hit rate
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Case 1
Follow-up: What metrics would you monitor to detect bottlenecks?

Database Metrics

A
  • Query latency (P95)
    • Connection pool utilization
    • Slow query count
    • Replication lag (if using replicas)
19
Q

Case 1
Follow-up: What metrics would you monitor to detect bottlenecks?

Storage Metrics

A
  • S3 request rate
    • Upload/download latency
    • Storage size growth
    • Cache hit rate (if using CDN)
20
Q

Case 1
Follow-up: What metrics would you monitor to detect bottlenecks?

Business Metrics

A
  • Images processed per hour
    • Average objects per image
    • Detection accuracy (if ground truth available)
21
Q

Case 1
How do you ensure reliability and fault tolerance?

A

Health Checks
- Kubernetes/Docker can restart unhealthy containers
- Readiness probe checks Triton, PostgreSQL, S3 availability

Error Handling
- Graceful degradation: If Triton is down, return 503 (Service Unavailable)
- Retry logic with exponential backoff for transient failures
- Circuit breaker pattern for external services (can be added)

Data Consistency
- Database transactions for atomic operations
- Idempotent endpoints (can retry safely)
- Status tracking (UPLOADED → PROCESSING → COMPLETED/FAILED)

  1. Storage Redundancy:
    • S3 provides 99.999999999% (11 9’s) durability
    • Local storage as fallback during S3 outages
    • Database backups (automated via PostgreSQL)
  2. Monitoring & Alerting:
    • Prometheus alerts for:
      • High error rate (> 1%)
      • High latency (P95 > 1s)
      • Service unavailability
    • Loki for log aggregation and error tracking
22
Q

Case 1
Fault Scenarios & Handling

| Triton Down

PostgreSQL Down
| S3 Unavailable
| GPU OOM
| Disk Full

A

| Triton Down | Health check fails | Return 503, log error, alert |

PostgreSQL Down | Connection error | Retry with backoff, alert |
| S3 Unavailable | API error | Fallback to local storage, alert |
| GPU OOM | Triton error | Reduce batch size, alert |
| Disk Full | Write error | Alert, cleanup old files |

23
Q

Case 1
How would you handle a partial failure (e.g., Triton works but S3 is down)?

A

I’d implement a graceful degradation strategy:

  1. Detection: S3 client checks connectivity on startup and periodically
  2. Fallback: Automatically switch to local storage if S3 unavailable
  3. Logging: Log all fallback events for monitoring
  4. Queue: Optionally queue S3 writes for retry when service recovers
  5. Alert: Immediate alert to operations team
24
Q

Case 1
Walk me through your model evaluation strategy.

A
  • mAP50: Mean Average Precision at IoU=0.5
  • mAP50-95: mAP across IoU thresholds 0.5-0.95
  • Precision/Recall: Box and mask level
  • Confusion Matrix: For class-level analysis
    # Detection Accuracy: % of ground truth circles detected
    # Radius Error: Average absolute difference in radius
    # Centroid Error: Average Euclidean distance between centroids
25
Case 1 Why Theese Metrics
- **mAP50**: Standard metric, comparable across models - **Detection Accuracy**: Business-relevant (how many circles found?) - **Radius/Centroid Error**: Task-specific (precision matters for circular objects) - **Latency**: Production requirement (real-time vs batch)
26
Case 1 How would you handle model drift or performance degradation?
1. **Data Drift Detection**: - Monitor input image statistics (mean, std, distribution) - Track confidence score distributions over time - Alert if distribution shifts significantly 2. **Performance Monitoring**: - Track detection counts per image (anomaly detection) - Compare against historical baselines - A/B test new model versions 3. **Ground Truth Collection**: - Sample predictions for human annotation - Calculate metrics on production data - Retrain if accuracy drops below threshold 4. **Model Versioning**: - Triton supports model versioning - Can rollback to previous version if new model performs worse - Gradual rollout (10% → 50% → 100% traffic)
27
Case 1 Why Triton
- ✅ **Multi-Framework**: Supports ONNX, TensorRT, PyTorch, TensorFlow - ✅ **Dynamic Batching**: Automatically batches requests for GPU efficiency - ✅ **Model Ensembles**: Can chain multiple models - ✅ **GPU Optimization**: TensorRT backend for maximum performance - ✅ **Production-Ready**: Used by major tech companies - ✅ **Monitoring**: Built-in metrics and health checks - ✅ **Versioning**: Easy model A/B testing
28
Case 1 How would you implement model versioning and A/B testing
2. **Metrics Tracking**: - Track metrics per model version - Compare accuracy, latency, error rates - Gradual rollout: 10% → 50% → 100% 4. **Canary Deployment**: - Deploy new model version - Route small % of traffic - Monitor metrics - Gradually increase if metrics are good - Rollback if metrics degrade **Metrics to Compare:** - Detection accuracy (if ground truth available) - Inference latency - Error rate - User satisfaction (if applicable)
29
Case 1 How do you handle edge cases and failure modes
|---------|-----------|----------|----------| | **Triton Down** | Health check | 503 | Auto-restart, alert | | **DB Down** | Connection error | 500 | Retry, alert, manual intervention | | **S3 Down** | API error | Fallback to local | Auto-switch, alert | | **GPU OOM** | Triton error | 500 | Reduce batch size, alert | | **Invalid Image** | Load error | 400 | User retry with valid image | | **Timeout** | Request timeout | 504 | Increase timeout, optimize | **Improvements Needed:** 1. **Retry Logic**: Exponential backoff for transient failures 2. **Circuit Breaker**: Stop calling failing service after N failures 3. **Graceful Degradation**: Continue operating with reduced functionality 4. **Dead Letter Queue**: Store failed requests for later processing
30
Case 2 Compression level 9 kullanmışsın. Bu maximum compression. Neden? Tradeoff'ları neler?
Adayın Gzip Level 9 (maksimum sıkıştırma) tercihinin teknik özeti şudur: 1. Stratejik Karar (Compute vs. Storage): Sistem, yazma sırasındaki işlemci maliyetini (CPU cost) feda ederek, depolama ve ağ verimliliğini (Storage/Network cost) optimize etmiştir. Kare başına 15ms'lik ek sıkıştırma süresi (bir kerelik maliyet), %16'lık disk tasarrufu (sürekli kazanç) ile telafi edilmiştir. Okuma (decompression) hızının etkilenmemesi bu kararı haklı çıkarır. 2. Neden Diğerleri Değil? LZ4/Snappy: Çok hızlıdır ancak sıkıştırma oranı (ratio) bilimsel veriler için yetersizdir. Zstandard (zstd): Teknik olarak daha üstündür ancak Python standart kütüphanesinde bulunmadığı için projeye ekstra bağımlılık (dependency) eklememek adına reddedilmiştir. "Maintenance" (bakım) kolaylığı performansa tercih edilmiştir. 3. Sonuç: Bu tercih, sınırlı depolama alanı veya bant genişliği olan, ancak sıkıştırma anında (ingestion) 10-20ms gecikmeyi tolere edebilen (batch processing gibi) sistemler için en uygun "yerli ve basit" (native) çözümdür.
31
Case 2 Bu Ingestion Pipeline'ı Nasıl Scale Edersin
Öncelik sırası: (1) Batch size'ı 1000'e çıkarmak (hızlı kazanım), (2) Paralel processing eklemek (CPU-bound işlemler için), (3) COPY veya bulk insert kullanmak (database throughput için), (4) Gerekirse distributed processing (çok büyük setler için). Neden bu sıra: Batch size artışı en az riskle en yüksek kazancı verir. Paralel processing CPU-bound işlemleri hızlandırır. COPY PostgreSQL'in native bulk insert mekanizmasıdır. Distributed processing son çare olarak düşünülmeli.
32
Case 2 Tüm frame’leri memory’de toplayıp sonra işlemişsin. Peki milyonlarca frame olsa ne yapacaksın?” Inference
“Bu nedenle büyük dataset’lerde streaming tercih edilir. Streaming’de frame’leri Postgres’ten micro-batch olarak alıp anında client’a gönderirim. Bu sayede memory sabit kalır. Tek dezavantajı şu: her küçük chunk gönderildiğinde TCP bir paket (segment) oluşturur ve flush eder. TCP paket dediğimiz şey, verinin ağ üzerinden taşınmak için bölündüğü küçük parçalardır. Her flush, ekstra ağ maliyeti demektir; bu yüzden throughput bir miktar düşer.”
33
Case 2 Colormap'leri request time'da uyguluyorsun, pre-compute etmiyorsun. Neden?"
Bu cevabın özeti, depolama verimliliği (storage efficiency) ve sistem esnekliğini, milisaniyelerle ölçülen önemsiz bir gecikme süresine tercih eden bilinçli bir mimari kararı yansıtmaktadır. Aday, 16 farklı renk haritasını önceden hesaplayıp saklamanın yaratacağı %93'lük veri şişkinliğini (393MB vs 25MB) reddederek, işlemi istek anında (on-demand) yapmayı seçmiştir. Bu yöntem, kare başına sadece 2ms'lik bir hesaplama maliyeti karşılığında, hem depolama maliyetlerini minimize etmekte hem de sistemi gelecekte eklenebilecek sınırsız sayıda renk haritasına açık hale getirerek "re-ingestion" (veriyi tekrar işleme) yükünü ortadan kaldırmaktadır. Aday ayrıca, en popüler haritaları önceden hesaplamak (hibrit yaklaşım) veya sonuçları önbelleklemek (caching) gibi alternatifleri değerlendirmiş, ancak bu aşamada getirecekleri kod karmaşıklığının (complexity) sağladıkları faydaya değmeyeceğine karar vermiştir. Bununla birlikte, projenin gelecekte ölçeklenmesi durumunda sık erişilen veriler için Redis gibi bir önbellekleme katmanının eksik olduğunu ve performans optimizasyonu için sisteme dahil edilebileceğini belirterek mimariyi geliştirmeye açık bir vizyon sunmuştur.
34
Case 2 Compressed data'yı BYTEA olarak saklamışsın. Neden TEXT veya JSONB değil? PostgreSQL'de binary data storage'ın tradeoff'ları neler?"
**Seçtiğim yaklaşım: PostgreSQL BYTEA** ✅ **Avantajlar:** - **ACID guarantees**: Transaction safety (ingestion sırasında critical) - **Single system**: Database + storage aynı yerde (operational simplicity) - **Query integration**: Depth-based query'lerle birlikte data fetch (single query) - **Backup consistency**: Database backup = data backup (atomic) - **No external dependency**: S3 için AWS account, credentials, network latency ❌ **Dezavantajlar:** - **Database size**: Database büyüyor (502MB şu an, ama 100GB+ olabilir) - **Backup time**: Büyük database backup'ları yavaş - **Scaling**: PostgreSQL vertical scaling limit'leri var - **Cost**: Database storage genelde object storage'dan pahalı **Neden BYTEA seçtim:** 1. **Data size**: 502MB şu an, 100GB'a çıksa bile PostgreSQL handle edebilir 2. **Query pattern**: Depth-based query'lerde data'yı da çekiyoruz (single query efficient) 3. **Operational simplicity**: Tek system = daha az failure point 4. **Transaction safety**: Ingestion sırasında atomicity önemli **Ne zaman object storage'a geçerim:** - Database size > 500GB - Global distribution gerekiyorsa (CDN) - Cost optimization kritikse - Read-heavy workload (write'lar az) **Eksik olan şey:** - **Hybrid approach**: Büyük frame'leri (original_data) S3'te, küçük olanları (resized_data) database'de tutabilirdim - **Storage tiering**: Eski data'yı cold storage'a taşıyabilirdim - **Compression at rest**: PostgreSQL'de TOAST compression var ama explicit kontrol yok
35
Case 2 RGB data'yı base64 encode ediyorsun. Neden PNG/JPEG formatında döndürmedin
PNG de kalite kaybı oluyor bu scientific olduğu için kalite kaybı olsun istemedim 1. Kullanım Amacı (Intent): Görsel Değil, Sayısal: Kullanıcılar (araştırmacılar) bu veriyi ekranda göstermek için değil, matris çarpımı, istatistiksel analiz veya model beslemesi yapmak için istemektedir. Sıfır Sürtünme (Zero Friction): PNG decode etmek ve kütüphane (Pillow vb.) bağımlılığıyla uğraşmak yerine, Base64 verisi tek satırda numpy.frombuffer ile işlenebilir hale gelir. 2. Performans (Latency & CPU): Encoding Hızı: Base64 encoding, PNG encoding'e göre yaklaşık 150 kat daha hızlıdır (0.08ms vs 12ms). Scale Etkisi: Tekil işlemde fark edilmese de, 100 frame'lik bir batch işleminde PNG kullanımı gecikmeyi 1.2 saniye artırırken, Base64 sadece 8ms harcar. Bu, CPU darboğazını (bottleneck) engeller. 3. Veri Bütünlüğü (Integrity): Bit-Exactness: Bilimsel çalışmalarda tekrarlanabilirlik (reproducibility) esastır. JPEG kayıplıdır; PNG ise metadata veya renk uzayı dönüşümleriyle (gamma vb.) piksel değerlerini değiştirebilir. Base64, ham byte dizisinin matematiksel olarak birebir (lossless) aktarılmasını garanti eder. 4. Bant Genişliği Savunması (Trade-off): Base64, binary'ye göre %33 daha fazla yer kaplasa da, HTTP Gzip sıkıştırması bu farkın büyük kısmını kapatır. "Hesaplama gücü (Compute)" şu an "Bant genişliğinden (Bandwidth)" daha pahalı ve kritiktir.
36
Case 2 Docker var ama Kubernetes, CI/CD yok. Production deployment stratejin nedir
Orkestrasyon Dönüşümü: Compose'dan Kubernetes'e GitOps Tabanlı Ayrık CI/CD Mimarisi CI süreçleri (Build, Test, Security Scan) Jenkins üzerinde koşarken, CD süreçleri ArgoCD ile GitOps prensiplerine göre yönetilmektedir.
37
Case 2 CSV ingestion script var. Production'da nasıl scale edersin?”
Batch Insert (Toplu Yazma): Mevcut frame-by-frame (tek tek) yazma işlemi yerine, verileri 100-1000'lik gruplar halinde (batch) veritabanına yazarak transaction maliyetlerini ve network trafiğini minimize etmek. PostgreSQL WAL (Write-Ahead Log) mekanizmasını verimli kullanarak I/O performansını 10-20 kat artırmak. Multiprocessing (Paralel İşleme): CSV parsing işlemi CPU odaklı (CPU-bound) olduğu için multithreading yerine multiprocessing kullanmak. Dosyayı segmentlere ayırıp birden fazla worker ile işleyerek ingestion süresinde lineer hızlanma sağlamak (Örn: 4 worker ile ~3.5x hız). Checkpointing & Resume Capability (Kaldığı Yerden Devam Etme): Uzun süren işlemlerde olası bir hata (crash/network failure) durumunda sürecin en baştan başlamasını önlemek. İşlenen son batch'in offset bilgisini metadata olarak saklayıp, sistemin kaldığı yerden devam etmesini sağlamak. Fault Tolerance & Quarantine Table (Hata Toleransı): Hatalı veya şemaya uymayan satırların tüm pipeline'ı durdurmasını engellemek (Fail-fast yerine). Bozuk verileri bir **"Quarantine Table"**a (Karantina Tablosu) ayırıp akışın devam etmesini sağlamak ve hatalı verileri sonradan incelemek. Observability & Monitoring (Gözlemlenebilirlik): Sürecin "kara kutu" olmaması için Prometheus ve Grafana entegrasyonu yapmak. Throughput (satır/saniye), hata oranları, worker kaynak kullanımı gibi metrikleri izleyerek darboğazları tespit etmek.
38
Case 2 Harika! Çok detaylı düşünmüşsün. Son bir soru: Bu sistemi 10x scale etmek için ne yaparsın?"
Özetle: 10x scale etmek için önce bottleneck’leri ölçer, ardından database tarafında read replicas + partitioning, API katmanında horizontal scaling, üstüne Redis caching ekleyerek yükü efektif şekilde dağıtırım. Daha büyük resimde ise binary storage’ı object storage’a taşıyarak mimariyi daha future-proof hale getiririm. Bu yaklaşım hem performansı hem maliyeti optimize eder ve sistemi sürdürülebilir bir ölçeklenebilirlik seviyesine taşır.
39
Case 2 Bir frame process edilemezse skip ediyorsun. Neden tüm request'i fail etmiyorsun?"
Scientific imaging alanında verinin kusursuz olmasını beklemek gerçekçi değil. Sensör arızaları, aktarım hataları veya bozuk frame’ler sık görülen bir durum. Böyle bir ortamda “tek bir hatalı frame yüzünden tüm request’i fail etmek” araştırmacının iş akışını gereksiz yere durduruyor. Örneğin kullanıcı 100 frame talep ediyor, 97’si tamamen sağlam, sadece 3’ü bozuk. Eğer ben bu durumda tüm request’i 500 ile kapatırsam kullanıcı analizine devam edemiyor; partial success stratejisinde ise 97 geçerli frame’i anında alıp çalışmaya devam edebiliyor. Bu alanda beklenti transaction-level atomicity değil, graceful degradation. Tabii ki bu “sessizce drop ediyorum” anlamına gelmiyor. Her hatayı structured logging ile kaydediyorum; hangi depth’te hangi frame neden işlenemediği monitoring’e düşüyor
40
Case 2 Prometheus metrics var ama distributed tracing yok. Neden
Single-service yapıda distributed tracing’in ROI’si düşük. Mevcut Prometheus metrikleri + structured logging ihtiyacı tamamen karşılıyor. Sistem microservices’e genişlerse tracing’i ekleyecek altyapıyı planladım, ama şu an için gereksiz.
41
Case 2 Neleri test ediyorsun
Şu anda projede bir temel test setim var: compression, image processing, health check ve schema doğrulama için unit ve integration testleri yazdım. Bu testler özellikle core logic’in doğru ve deterministik çalıştığını garanti ediyor. Yani algoritmaların kendisi, colormap uygulaması, gzip compression/decompression ve API’nin temel endpoint’leri güvence altında.
42
Case 2 Bu Sistemi Gerçek Zamanlı Hale Getirebilir misin?
Hybrid yaklaşım: (1) Streaming ingestion: Kafka/Kinesis ile real-time ingestion, (2) Write-through cache: Yeni frame'ler hem Redis'e hem PostgreSQL'e yazılır, (3) Query optimization: Önce Redis, sonra PostgreSQL, (4) WebSocket notifications: İlgili client'lara real-time update. Neden: Streaming ingestion latency'yi düşürür. Write-through cache hem hız hem consistency sağlar. Query optimization mevcut read path'i optimize eder. WebSocket notifications client experience'i iyileştirir. Tradeoff: Sistem karmaşıklığı artar, ancak gerçek zamanlılık sağlanır. Infrastructure maliyeti yükselir, ancak business value artar.
43
Case 2 Postgres Üzerindeki Bottleneck Nerede Oluşur?
Veritabanındaki en kritik performans sorunu, büyük ikili verilerin (BYTEA) yarattığı yoğun Disk I/O ve TOAST (The Oversized-Attribute Storage Technique) mekanizmasının getirdiği ek maliyettir. Yazma işlemlerinde WAL ve indeks bakımı, okuma işlemlerinde ise bu büyük verilerin diskten çekilmesi sistemi kilitler. Bu sorunu çözmek için seçilen strateji 4 adımdan oluşur: Yükü Dışarı Atma: Veritabanını hafifletmek için büyük verileri Object Storage'a (S3) taşımak. Yükü Dağıtma: Okuma trafiğini Read Replica'lara yönlendirmek. Veriyi Bölme: Sorgu performansını artırmak için Partitioning kullanmak. Erişimi Hızlandırma: Sık erişilen veriyi Cache'leyerek diske gitmeyi engellemek.