Azure Performans Optimizasyonu: Full Stack Uygulama Rehberi
Yazar: Burak Balkı | Kategori: Full Stack Development | Okuma Süresi: 9 dk
Azure üzerinde full stack uygulama performansını artırmak için derinlemesine teknikler, veritabanı optimizasyonu, Redis kullanımı ve otomatik ölçeklendirme s...
## Azure Bulut Altyapısında Performans Yönetimi
**Azure**, modern full stack uygulamaların ölçeklenebilirliği ve erişilebilirliği için kritik bir ekosistem sunar. Ancak, kaynakların yanlış yapılandırılması hem maliyet artışına hem de performans kayıplarına yol açar. Performans optimizasyonu, uygulamanın yanıt süresini (latency), işlem hacmini (throughput) ve kaynak kullanım verimliliğini en üst düzeye çıkarma sürecidir. Bu rehberde, Azure servislerini en verimli şekilde nasıl kullanacağınızı teknik detaylarıyla inceleyeceğiz.
### Temel Performans Metrikleri
- **TTFB (Time to First Byte):** Sunucunun ilk yanıtı verme hızı.
- **RU (Request Units):** Azure Cosmos DB için işlem kapasitesi birimi.
- **DTU (Database Transaction Unit):** Azure SQL için kaynak (CPU, Memory, I/O) karışımı.
- **Cold Start:** Serverless fonksiyonların ilk tetiklenmedeki gecikmesi.
## Azure Monitor ve Application Insights ile Gözlemlenebilirlik
Performansı iyileştirmenin ilk adımı ölçmektir. **Azure Monitor**, tüm kaynaklarınızdan telemetri verisi toplarken, **Application Insights** uygulama düzeyinde derinlemesine analiz sunar.
```javascript
// Node.js için Application Insights entegrasyonu
const appInsights = require('applicationinsights');
appInsights.setup('')
.setAutoDependencyCorrelation(true)
.setAutoCollectRequests(true)
.setAutoCollectPerformance(true, true)
.start();
```
> **Not:** Application Insights üzerinden 'End-to-end transaction details' görünümünü kullanarak, bir isteğin hangi mikroserviste veya veritabanı sorgusunda takıldığını milisaniye bazında görebilirsiniz.
## Azure App Service Optimizasyon Stratejileri
Azure App Service üzerinde çalışan web uygulamaları için doğru plan seçimi ve konfigürasyon hayati önem taşır. **Always On** özelliğinin etkinleştirilmesi, uygulamanın boşta kaldığında uyku moduna geçmesini engelleyerek ilk istek gecikmesini önler.
```bash
# Azure CLI ile Always On özelliğini etkinleştirme
az webapp config set --resource-group MyResourceGroup --name MyApp --always-on true
```
### HTTP/2 ve Web Sockets Kullanımı
Modern tarayıcılar için HTTP/2 protokolünü etkinleştirmek, paralel dosya indirme performansını artırır. Azure portal üzerinden 'Configuration' sekmesinden bu ayar kolayca değiştirilebilir.
## Veritabanı Performansı: Azure SQL ve Cosmos DB
Veritabanı darboğazları, full stack uygulamalarda en sık karşılaşılan performans sorunudur. Azure SQL üzerinde **Query Performance Insight** kullanarak en çok kaynak tüketen sorguları tespit edebilirsiniz.
```sql
-- Eksik indeksleri tespit etmek için kullanılan örnek sorgu
SELECT
dm_mid.database_id, dm_mgs.avg_user_impact,
dm_mgs.avg_total_user_cost, dm_mgs.count_user_scans,
dm_mgs.user_seeks, CAST(dm_mgs.avg_total_user_cost *
dm_mgs.avg_user_impact * (dm_mgs.user_seeks + dm_mgs.user_scans) AS DECIMAL(28,1)) AS [Potential_Gain]
FROM sys.dm_db_missing_index_groups AS dm_mig
INNER JOIN sys.dm_db_missing_index_group_stats AS dm_mgs ON dm_mig.index_group_handle = dm_mgs.group_handle
INNER JOIN sys.dm_db_missing_index_details AS dm_mid ON dm_mig.index_handle = dm_mid.index_handle;
```
### Cosmos DB RU Optimizasyonu
Cosmos DB'de yanlış partition key seçimi 'Hot Partition' sorununa yol açar. Verilerinizi mantıksal olarak dengeli dağıtacak anahtarlar seçmelisiniz.
| Metrik | İdeal Durum | Aksiyon |
| :--- | :--- | :--- |
| CPU Kullanımı | %60-70 | Ölçek büyütme veya optimizasyon |
| SQL DTU | %80 Altı | İndeksleme ve sorgu revizyonu |
| Cosmos DB RU | Sabit Dağılım | Partition Key değişikliği |
## Bellek İçi Önbellekleme: Azure Cache for Redis
Veritabanı yükünü azaltmak ve yanıt sürelerini düşürmek için **Azure Cache for Redis** kullanımı şarttır. Özellikle sık değişmeyen ama sık okunan veriler (session, config, ürün listesi) burada tutulmalıdır.
```csharp
// .NET Core Redis Bağlantı Örneği
var redis = ConnectionMultiplexer.Connect("your_redis_connection_string");
IDatabase db = redis.GetDatabase();
string value = await db.StringGetAsync("user:1001:profile");
if (value == null) {
// Veritabanından çek ve Redis'e yaz
}
```
## Otomatik Ölçeklendirme (Autoscaling) Yapılandırması
Statik kaynak atamak yerine, CPU veya bellek kullanımına göre dinamik ölçeklendirme kuralları tanımlanmalıdır. Bu hem maliyet tasarrufu sağlar hem de trafik patlamalarında uygulamanın ayakta kalmasını sağlar.
```json
// Örnek Autoscaling Kuralı (JSON)
{
"metricTrigger": {
"metricName": "CpuPercentage",
"operator": "GreaterThan",
"threshold": 75,
"timeAggregation": "Average"
},
"scaleAction": {
"direction": "Increase",
"type": "ChangeCount",
"value": "1"
}
}
```
## Azure Content Delivery Network (CDN) Entegrasyonu
Statik dosyaların (JS, CSS, Resimler) kullanıcıya en yakın coğrafi noktadan sunulması, frontend performansını %50'ye kadar artırabilir. Azure CDN, Blob Storage ile entegre çalışarak bu süreci otomatikleştirir.
```bash
# CDN Endpoint üzerindeki dosyaları temizleme (Purge)
az cdn endpoint purge -g MyRG -n MyEndpoint --profile-name MyProfile --content-paths "/*"
```
## Azure Functions ve Serverless Performansı
Serverless mimarilerde en büyük sorun **Cold Start** gecikmesidir. Bunu aşmak için:
- **Premium Plan** kullanarak örnekleri sıcak tutun.
- Fonksiyonun bağımlılıklarını (node_modules vb.) minimize edin.
- Async/Await yapısını doğru kullanarak I/O bloklamalarını önleyin.
```typescript
// Azure Function: Verimli asenkron kullanım
export async function run(context: Context, req: HttpRequest): Promise {
const results = await Promise.all([getDataA(), getDataB()]); // Paralel işlem
context.res = { body: results };
}
```
## Ağ Gecikmesini Azaltma: Traffic Manager ve Front Door
Küresel uygulamalarda, kullanıcıyı en yakın veri merkezine yönlendirmek için **Azure Front Door** kullanılır. Bu servis, Layer 7 yük dengeleme ve WAF (Web Application Firewall) özelliklerini birleştirir.
- **Traffic Manager:** DNS tabanlı yönlendirme yapar.
- **Front Door:** HTTP tabanlı, SSL offloading ve caching desteği sunar.
## Azure Maliyet ve Performans Dengesi
Performans artışı her zaman daha fazla kaynak demek değildir. **Azure Advisor** üzerinden gelen maliyet ve performans önerilerini düzenli olarak takip edin. Kullanılmayan 'Zombi' kaynakları temizlemek, bütçenizi optimizasyon için daha verimli kullanmanızı sağlar.
```bash
# Kullanılmayan diskleri listeleme
az disk list --query "[?managedBy==null].{Name:name, ResourceGroup:resourceGroup}" --output table
```
## Sık Yapılan Hatalar
1. **Yanlış Bölge Seçimi:** Uygulama ve veritabanının farklı Azure bölgelerinde (Region) olması ağ gecikmesini artırır.
2. **Log Kirliliği:** Aşırı detaylı loglama, disk I/O ve Application Insights maliyetini artırır.
3. **Connection Pooling İhmali:** Veritabanı bağlantılarının her istekte yeniden açılması ciddi bir yüktür.
4. **Ölçek Küçültmeyi Unutmak:** Scale-out sonrası scale-in kurallarının tanımlanmaması gereksiz maliyet yaratır.
5. **Güvenlik Taramalarını Atlamak:** Optimize edilmemiş bir WAF kuralı, meşru trafiği yavaşlatabilir.
## Performans İpuçları
- **Proactive Auto-healing:** Belirli hata kodları (örn: 5xx) arttığında App Service'i otomatik yeniden başlatacak kurallar ekleyin.
- **Gzip/Brotli Sıkıştırma:** Azure CDN ve App Service üzerinde sıkıştırmayı etkinleştirin.
- **Managed Identity:** Key Vault erişimlerinde sertifika yerine Managed Identity kullanarak handshake süresini azaltın.
## Sık Sorulan Sorular (FAQ)
**1. Azure SQL'de DTU ve vCore farkı nedir?**
DTU, CPU, memory ve I/O'nun paketlendiği basit bir modeldir. vCore ise kaynakları ayrı ayrı ölçeklendirmenize ve mevcut lisanslarınızı (Azure Hybrid Benefit) kullanmanıza olanak tanır.
**2. Cold start sorunu nasıl tamamen çözülür?**
Tamamen çözmek için 'Premium' veya 'Dedicated (App Service)' planlarını kullanmalısınız. Tüketim (Consumption) planında ise fonksiyonu belirli aralıklarla tetikleyen 'Warm-up' mekanizmaları kurulabilir.
**3. Application Insights maliyetini nasıl düşürebilirim?**
'Sampling' (Örnekleme) özelliğini kullanarak verilerin sadece belirli bir yüzdesini (örn: %20) toplayarak maliyeti düşürebilirsiniz.
**4. Redis Cache hangi durumlarda zorunludur?**
Saniyede yüzlerce istek alan, veritabanı okuma yükü yüksek ve düşük gecikme süresi hedefleyen tüm kurumsal uygulamalarda zorunludur.
**5. Azure Front Door ve CDN arasındaki fark nedir?**
CDN statik içerik dağıtımına odaklanırken, Front Door dinamik site hızlandırma, global yük dengeleme ve güvenlik (WAF) odaklıdır.
## Özet ve Sonuç
Azure üzerinde performans optimizasyonu, sürekli bir izleme ve iyileştirme döngüsüdür. **Application Insights** ile darboğazları tespit etmek, **Redis** ile veritabanı yükünü hafifletmek ve **Autoscaling** ile talebe göre esnemek, başarılı bir cloud stratejisinin temel taşlarıdır. Bu rehberdeki teknikleri uygulayarak, hem kullanıcı deneyimini iyileştirebilir hem de bulut maliyetlerinizi optimize edebilirsiniz.