Microservice mimarisi günümüzde ölçeklenebilirlik, bağımsız deploy ve modülerlik avantajları nedeniyle geniş çapta tercih ediliyor. Ancak bir microservice tasarlarken göz ardı edilmemesi gereken en kritik konulardan biri state management (durum yönetimi).
Bir servis, kullanıcıya veya iş sürecine dair durum bilgisini kendi içinde mi saklamalı (stateful), yoksa her isteği tamamen bağımsız mı işlemeli (stateless)?
Bu karar, hem performansı hem de ölçeklenebilirliği doğrudan etkiler.
Bu rehberde stateful ve stateless servisleri teknik detayları, avantaj–dezavantajları, gerçek senaryolar ve .NET örnek kodları ile birlikte ele alacağız.
State Management Nedir?
“State”, bir işlemin veya kullanıcının geçmişine dair bilgilerin saklanmasıdır.
Bir mikroservis her çağrıda geçmişi hatırlıyorsa stateful, her isteği tamamen bağımsız işliyorsa stateless olarak tanımlanır.
Stateful Microservice (Durumlu Servisler)
Stateful servisler, önceki etkileşimlere bağlı olan iş akışlarını yönetmek için idealdir. Servis, kullanıcıya veya sürece ait durum bilgisini kendi içinde tutar.
Avantajları
-
Karmaşık iş akışlarını kolay yönetir.
Örneğin sipariş süreci, çok adımlı workflow işlemleri. -
Zengin kullanıcı deneyimi sağlar.
Oturum, geçici veriler, geçmiş işlemler hızlıca erişilebilir. -
Bellek tabanlı erişim sayesinde yüksek performans sunabilir.
Dezavantajları
-
Ölçeklenmesi zordur.
State belirli bir instance’ta olduğundan load balancing karmaşıklaşır. (Sticky session gerekebilir) -
Sunucu çökmesi durumunda durum kaybı yaşanabilir.
-
Deploy, rollback ve CI/CD süreçleri daha risklidir.
Yeni versiyon state uyumsuzluğu yaratabilir.
Gerçek Dünya Örnekleri
-
Oyun sunucuları (oyuncu pozisyonu, envanteri)
-
Chat uygulamaları (oturum + geçici sohbet state’i)
-
BPM/workflow engine sistemleri
-
Ticaret sitelerinde adım adım sipariş süreci
Stateless Microservice (Durumsuz Servisler)
Stateless servisler her isteği bağımsız işleyen, herhangi bir state’i servis içinde tutmayan yapılardır. Durum bilgisi istemci veya merkezi bir sistem tarafından sağlanır.
Avantajları
-
Kolay ölçeklenir.
Yeni instance eklemek anında mümkündür. -
Hata toleransı yüksektir.
Bir instance çökse bile diğerleri aynı isteği işleyebilir. -
Deploy süreçleri kolay ve risksizdir.
-
Cloud-native mimarilerle uyumludur.
Dezavantajları
-
Durumu saklamak için harici bir mekanizma gerekir (Redis, DB, token).
-
Her istekte daha fazla veri gönderilmesi gerekebilir.
-
Karmaşık süreçlerde orchestration mekanizması zorunlu hale gelir.
Gerçek Dünya Örnekleri
-
REST API microservice’leri
-
Serverless fonksiyonlar (AWS Lambda, Azure Functions)
-
Kimlik doğrulama servisleri (JWT tabanlı)
4. Stateful vs Stateless Karşılaştırma Tablosu
|
Kriter
|
Stateful
|
Stateless
|
|---|---|---|
|
Ölçeklenebilirlik
|
Zor, sticky session gerekebilir
|
Çok kolay
|
|
Hata toleransı
|
Düşük
|
Yüksek
|
|
İşlem karmaşıklığı
|
Karmaşık süreçlerde güçlü
|
Basit API’ler için ideal
|
|
Veri yönetimi
|
Servis içinde tutulur
|
Harici cache/DB’de
|
|
Kullanıcı deneyimi
|
Zengin
|
Basit
|
|
Deploy & Versioning
|
Riskli
|
Kolay, hızlı
|
.NET Core Örnekleri
Stateful .NET Core Örneği
public class ShoppingCartService
{
private Dictionary<string, List<string>> _userCarts = new();
public void AddItem(string userId, string item)
{
if (!_userCarts.ContainsKey(userId))
_userCarts[userId] = new List<string>();
_userCarts[userId].Add(item);
}
public List<string> GetCart(string userId)
{ return _userCarts.ContainsKey(userId)
? _userCarts[userId]
: new List<string>();
}
}
Sorun: Instance kapanırsa sepet kaybolur.
Stateless .NET Core Örneği (Redis kullanarak)
public class ShoppingCartService
{
private readonly IDistributedCache _cache;
public ShoppingCartService(IDistributedCache cache)
{
_cache = cache;
}
public async Task AddItemAsync(string userId, string item)
{
var cart = await _cache.GetStringAsync(userId);
var items = string.IsNullOrWhiteSpace(cart)
? new List<string>()
: cart.Split(',').ToList();
items.Add(item);
await _cache.SetStringAsync(userId,
string.Join(",", items));
}
}
Yeni instance eklemek tamamen sorunsuzdur.
Ne Zaman Hangi Yaklaşım Kullanılmalı?
Stateless servis tercih et:
-
Yüksek trafik altında performans gerekiyorsa
-
Cloud-native bir mimari hedefliyorsan
-
Hızlı scale-out / auto-scaling planlıyorsan
-
API tasarımı sade ve bağımsızsa
Stateful servis tercih et:
-
Karmaşık, çok adımlı iş akışı varsa
-
Uzun süreli bağlantılar gerekiyorsa (signalR, WebSocket)
-
Performans kritikse ve veriye çok hızlı erişmek istiyorsan
Sonuç
Microservice mimarisinde state management, genel sistem mimarisinin geleceğini doğrudan belirleyen stratejik bir karardır.
-
Stateless servisler → ölçeklenebilirlik, basitlik ve hata toleransı sağlar.
-
Stateful servisler → karmaşık iş süreçlerini daha doğal ve hızlı şekilde yönetir.
Her yaklaşımın güçlü ve zayıf yanları vardır; bu nedenle doğru seçim, uygulamanın ihtiyaçlarına göre yapılmalıdır.