Yazılım03.02.20263 dk okuma22

Yazılım Dünyasında Stateless ve Stateful

#yazilim#mimari

Modern yazılım mimarilerinde, özellikle istemci/sunucu etkileşimlerinde karşımıza çıkan en temel kavramlardan ikisi Stateless (Durumsuz) ve Stateful (Durumlu) yapılardır. Bir sistemin "durum" (state) tutma yeteneği, o sistemin çalışma tarzını, performansını ve ölçeklenebilirliğini doğrudan etkiler. Bu yazıda, her iki kavramı detaylıca inceleyip örneklerle aralarındaki farkları netleştireceğiz.


--------------------------------------------------------------------------------

1. Stateless Mimari Nedir?

Stateless bir sistem, istemciyle olan önceki etkileşimlerini hatırlamaz. Her istek (request) birbirinden tamamen bağımsızdır ve sunucuya gönderilen her isteğin, işlemin tamamlanabilmesi için gerekli tüm bilgileri (kimlik bilgileri, parametreler vb.) içermesi gerekir.

Öne Çıkan Özellikleri:

• Sunucu tarafında istemciye dair herhangi bir durum veya oturum bilgisi saklanmaz.

• İstemci, her defasında kim olduğunu ve ne istediğini en baştan anlatmak zorundadır.

• Genellikle daha basit ve hızlıdır çünkü sunucu ek bir bellek yönetimiyle uğraşmaz.

Örnek Senaryo: RESTful API Bir REST API'ye yapılan iki farklı isteği düşünelim. İlk istekte /api/orders/1 adresinden bir sipariş bilgisi istenirken kimlik doğrulaması (token) gönderilir. İkinci istekte /api/orders/2 istenirken yine aynı token gönderilmelidir. Sunucu, birinci istekten sonra ikinci isteğin kimden geldiğini hatırlamaz; her iki istek de sıfırdan değerlendirilir.

--------------------------------------------------------------------------------

2. Stateful Mimari Nedir?

Stateful bir sistem, kullanıcıyla ilgili önceki etkileşimleri hafızasında tutan ve her yeni isteği bir öncekiyle ilişkilendirebilen bir yapıdır. Sunucu, istemciyle (client) oturum boyunca aktif bir "bağ" (context) kurar ve bu bilgileri kendi tarafında saklar.

Öne Çıkan Teknik Özellikler

  • Oturum Takibi: Sunucu, her kullanıcı için benzersiz bir Session ID oluşturur ve bu ID'ye bağlı verileri (sepet, kullanıcı tercihleri vb.) sunucu tarafındaki bellekte (RAM) veya bir veritabanında saklar.

  • Bağımlı İstekler: Her istek, kendisinden önceki işlemlerin sonucuna dayanır. Yani "Adım 2", "Adım 1"in tamamlandığı bilgisine sunucu üzerinden erişir.

  • Kaynak Yönetimi: Her aktif kullanıcı sunucu üzerinde bir veri alanı kapladığı için, kullanıcı sayısı arttıkça sunucunun RAM ve CPU ihtiyacı doğrusal olarak artar.

Kritik Zorluk: Ölçeklenebilirlik ve "Sticky Sessions"

Stateful mimarinin en büyük sınavı ölçeklenmedir. Eğer uygulamanız birden fazla sunucu üzerinde çalışıyorsa (Load Balancing), kullanıcının tüm isteklerinin aynı sunucuya gitmesi gerekir. Buna teknik dilde Sticky Session (Yapışkan Oturum) denir.

Eğer kullanıcı 1. sunucuda sepetine ürün ekleyip bir sonraki isteğinde 2. sunucuya yönlendirilirse, 2. sunucu kullanıcının sepetini tanımaz. Bu sorunu aşmak için genellikle Redis gibi merkezi bir "Session Store" katmanı mimariye eklenir.

Örnek Senaryo: E-Ticaret Sepeti ve Bankacılık

Bir kullanıcı giriş yaptığında sunucu ona özel bir Session ID oluşturur. Kullanıcı sayfalar arasında dolaşıp sepetine ürün eklediğinde, sunucu bu ID üzerinden sepeti güncel tutar. Kullanıcı sayfayı yenilese bile ürünler kaybolmaz çünkü sunucu "Bu kullanıcı 10 dakika önce şu ürünü eklemişti" bilgisini kendi hafızasında korumaktadır.

Benzer şekilde, bankacılık uygulamalarındaki çok adımlı para transferleri veya online oyunlardaki karakter konumları Stateful yapının en yaygın kullanım alanlarıdır.



3. Karşılaştırmalı Analiz: Hangisi, Ne Zaman Kullanılmalı?

Sistem tasarlarken stateless veya stateful yapı arasında seçim yapmak, uygulamanın ihtiyaçlarına bağlıdır.

Özellik

Stateless (Durumsuz)

Stateful (Durumlu)

Durum Tutma

Sunucu durum tutmaz, her istek bağımsızdır.

Sunucu istemcinin durumunu hatırlar.

Ölçeklenebilirlik

Yüksek ölçeklenebilirlik sağlar; yatay ölçekleme (yeni sunucular ekleme) kolaydır.

Ölçeklendirme zordur; sunucular arası durum paylaşımı gerekebilir.

Hafıza Kullanımı

Daha az bellek ve kaynak kullanır.

Daha fazla bellek ve kaynak gerektirir.

Performans

Hafif ve hızlıdır.

Ekstra kaynak yönetimi nedeniyle daha maliyetli olabilir.

Örnekler

HTTP, REST API, JWT tabanlı sistemler.

Veritabanı bağlantıları, TCP, Session tabanlı web uygulamaları.


--------------------------------------------------------------------------------

4. Avantajlar ve Dezavantajlar

• Stateless Avantajı: Sunucunun her istemci için ayrı bir bellek ayırması gerekmediği için sistemin yatayda ölçeklenmesi (yükün birden fazla sunucuya dağıtılması) çok kolaydır.

• Stateless Dezavantajı: Her istekte tüm veriler (token, ID vb.) tekrar gönderildiği için veri taşımacılığı maliyeti artabilir.

• Stateful Avantajı: Kullanıcı etkileşimlerini takip etmek kolaydır; banka uygulamaları veya kişiselleştirilmiş süreçler için idealdir.

• Stateful Dezavantajı: Sunucu tarafında çok fazla kaynak tüketebilir ve bağlantı koptuğunda durumun yeniden yapılandırılması zor olabilir.

Özet

Eğer yüksek trafikli, hızlı ve kolayca büyüyebilen bir yapı kurmak istiyorsanız (örneğin bir mikroservis mimarisi), Stateless yapı sizin için daha uygundur. Ancak, kullanıcı oturumu boyunca karmaşık verilerin korunması gereken özel senaryolarda (örneğin eski tip monolitik web uygulamaları veya veritabanı bağlantıları) Stateful yapı tercih edilir.