Stateless vs Stateful

mustafacam

Mustafa Çam

Posted on September 8, 2024

Stateless vs Stateful

Stateless ve Stateful terimleri, bir sistemin, servisin veya uygulamanın durum (state) tutma yeteneğine bağlı olarak iki farklı çalışma tarzını ifade eder. Özellikle sunucu/istemci mimarilerinde ve web geliştirmede yaygın olarak kullanılır.

1. Stateless (Durumsuz)

Stateless bir sistem, uygulama ya da servis, kullanıcı veya istemci ile olan önceki etkileşimleri hatırlamaz. Her istek (request) birbirinden bağımsızdır ve her istek sırasında gerekli tüm bilgiler istemci tarafından sağlanmalıdır. Bu nedenle, her istekte sunucu, istemciyle ilgili bilgileri yeniden almak zorunda kalır. Bir önceki istekte yapılan işlemler sunucu tarafından hatırlanmaz.

Stateless Özellikleri:

  • Her istek bağımsızdır.
  • Sunucu, önceki istemci taleplerini veya durumlarını hatırlamaz.
  • İstemciden gelen her istekte, gerekli tüm bilgilerin gönderilmesi gerekir.
  • Genellikle daha basit ve hızlıdır, çünkü sunucu tarafında durum tutulmaz.

Örnekler:

  • HTTP protokolü doğası gereği stateless'tir. Yani her HTTP isteği (GET, POST vb.) bağımsızdır ve sunucu önceki isteklerin durumunu hatırlamaz.
  • Bir RESTful API stateless bir yapıdır. Her API çağrısı birbirinden bağımsızdır, ve her çağrıda gerekli tüm veriler (authentication token gibi) gönderilmelidir.
Örnek:

Bir REST API'ye yapılan iki farklı istek düşünelim:

  1. İlk istek:
   GET /api/orders/1
   Authorization: Bearer abc123
Enter fullscreen mode Exit fullscreen mode
  1. İkinci istek:
   GET /api/orders/2
   Authorization: Bearer abc123
Enter fullscreen mode Exit fullscreen mode

Her iki istek birbirinden bağımsızdır. Sunucu, birinci istekten sonra ikinci istekte ne olduğunu bilmez. Her iki istekte de kimlik doğrulama ve diğer bilgiler baştan gönderilir.

Avantajlar:

  • Yüksek ölçeklenebilirlik sağlar, çünkü sunucunun her istemci için ayrı bir durumu saklaması gerekmez.
  • Sunucu hafif ve hızlı çalışır, çünkü ek bellek ve kaynak yönetimi gerektirmez.
  • Yatay ölçeklenme için uygundur. Yani, birden fazla sunucuya kolayca ölçeklenebilir.

Dezavantajlar:

  • Her istek için gereken tüm bilgilerin yeniden gönderilmesi gerektiği için veri taşımacılığı maliyeti olabilir.
  • Kullanıcı oturumlarını yönetmek veya duruma dayalı süreçler yürütmek zor olabilir.

2. Stateful (Durumlu)

Stateful bir sistem veya uygulama, kullanıcı ya da istemciyle ilgili önceki durumu (state) hatırlar. Her istek bir önceki istekten kalan bilgilerle ilişkilendirilebilir ve sunucu, istemcinin durumunu tutar. Kullanıcının oturumu boyunca yapılan işlemler arasında bir bağ vardır.

Stateful Özellikleri:

  • Her istek, önceki isteklerle ilişkilendirilebilir.
  • Sunucu, istemcinin durumunu veya oturum bilgilerini hatırlar.
  • Kullanıcının durumuna dayalı işlemler gerçekleştirilir.
  • Daha fazla bellek ve kaynak yönetimi gerektirir.

Örnekler:

  • Veritabanı işlemleri genellikle stateful'dur. Bir bağlantı açıldığında, bu bağlantı sonlandırılana kadar oturum bilgisi saklanır.
  • TCP bağlantıları stateful’dur. Bir bağlantı kurulduğunda, o bağlantı boyunca durum (paket sırası, doğrulama vb.) korunur.
  • Kullanıcı oturumları (session) da stateful bir yapıdır. Bir kullanıcı oturumu başlattığında, sunucu bu kullanıcıyı tanır ve durumu boyunca kullanıcı bilgilerini tutar.
Örnek:

Bir kullanıcı giriş yaptığında sunucu, kullanıcıya özel bir oturum (session) oluşturur ve oturum ID'sini saklar. Sonraki isteklerde bu oturum ID'si sayesinde sunucu, kullanıcının kim olduğunu ve önceki işlemlerini hatırlar.

  1. Kullanıcı giriş yapar ve sunucu bir session ID oluşturur:
   POST /login
   Body: {username: "user1", password: "password123"}
Enter fullscreen mode Exit fullscreen mode

Sunucu bu kullanıcı için bir oturum oluşturur: SessionID: 12345.

  1. Sonraki isteklerde sunucu bu oturumu hatırlar ve kullanıcıya özel işlemler yapar:
   GET /profile
   Cookie: SessionID=12345
Enter fullscreen mode Exit fullscreen mode

Bu oturum ID’si sayesinde, sunucu kullanıcıyı tanır ve önceki durumunu hatırlar.

Avantajlar:

  • Kullanıcı etkileşimlerini takip etmek kolaydır. Örneğin, kullanıcı oturumu süresince alışveriş sepeti gibi kişisel bilgiler saklanabilir.
  • İlişkili işlemler arasında veri saklama imkanı sağlar.

Dezavantajlar:

  • Daha fazla bellek ve kaynak gerektirir, çünkü sunucu her istemci için bir durum tutmak zorundadır.
  • Yatay ölçeklenme zordur, çünkü sunucular arasında durum paylaşımı gerekebilir.
  • Bağlantı koparsa, bağlantının yeniden kurulması ve durumun korunması zor olabilir.

Stateless vs Stateful Karşılaştırması

Özellik Stateless Stateful
Durum Tutma Sunucu durum tutmaz, her istek bağımsızdır. Sunucu istemcinin durumunu tutar.
Ölçeklenebilirlik Yüksek ölçeklenebilirlik sağlar. Ölçeklendirme zordur.
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 bellek ve kaynak yönetimi gerektirir.
İstek Bağımsızlığı Her istek bağımsızdır. İstekler arasında bağ vardır.
Kullanım Alanı HTTP, REST API, basit işlemler. Oturum yönetimi, veritabanı işlemleri.

Özet:

  • Stateless sistemler, durumsuz olduğu için daha ölçeklenebilir, hızlı ve hafif yapıdadır. Her istek bağımsızdır.
  • Stateful sistemler ise daha fazla bellek ve kaynak kullanır, ancak kullanıcı veya işlem durumu saklandığı için ilişkili işlemler arasında geçiş yapılabilir.

Uygulama ihtiyaçlarına göre, hangi sistemin kullanılacağına karar verilir. Örneğin, bir API için stateless, ancak bir alışveriş sepeti yönetimi için stateful yapı tercih edilebilir.

Stateful ve stateless kavramlarını daha somut bir şekilde anlamak için, örnekler üzerinden açıklayalım.

1. Stateful (Durumlu) Sistemlere Örnekler

a) Veritabanı Bağlantıları

Bir veritabanı sunucusuna bağlandığınızı düşünelim. Bu durumda bağlantı stateful olur. Çünkü sunucu, istemcinin bağlandığı andan itibaren o istemcinin oturumunu saklar ve işlemleri o oturum çerçevesinde yapar.

  • Senaryo:

    • Bir uygulama, bir veritabanına bağlanır ve bir oturum başlatır.
    • Oturum boyunca, veritabanındaki farklı tablolara sorgular gönderir. Örneğin, bir kullanıcı hakkında bilgi almak ve bu kullanıcının satın alma geçmişini sorgulamak için birden fazla sorgu yapılabilir.
    • Veritabanı sunucusu, bu oturum boyunca yapılan tüm işlemleri takip eder ve oturum bitene kadar kullanıcıyla ilgili bilgileri saklar.
  • Stateful Özelliği:

    • Veritabanı, istemcinin kim olduğu ve hangi verilere eriştiği gibi bilgileri saklar ve oturum boyunca bu bilgileri kullanır.
    • Bağlantı koparsa, istemcinin o oturumla ilgili bilgileri kaybolur ve oturum yeniden kurulmak zorunda kalır.

b) Oturum Bazlı Web Uygulamaları (Stateful Web Sessions)

Bir e-ticaret sitesi düşünelim. Bu sitenin, kullanıcı giriş yaptıktan sonra alışveriş sepeti gibi kişisel bilgileri saklaması gerekir. Bu nedenle oturum yönetimi kullanılır ve bu sistem stateful olur.

  • Senaryo:

    • Kullanıcı siteye giriş yapar ve oturum başlatılır.
    • Kullanıcı bir ürünü sepetine ekler.
    • Farklı sayfalara geçse bile, sistem kullanıcının oturumunu saklar ve sepetindeki ürünler kaybolmaz.
  • Stateful Özelliği:

    • Kullanıcının oturumu sunucuda saklanır ve her yeni sayfada sunucu, oturum bilgilerini kullanarak kullanıcının kim olduğunu bilir. Böylece sepet gibi bilgiler kaybolmaz.
    • Eğer oturum zaman aşımına uğrarsa veya kullanıcı çıkış yaparsa, oturum bilgileri kaybolur ve kullanıcı tekrar giriş yapmak zorunda kalır.

2. Stateless (Durumsuz) Sistemlere Örnekler

a) HTTP Protokolü

İnternet üzerinde kullanılan HTTP, stateless bir protokoldür. Her HTTP isteği, bağımsızdır ve önceki isteklerle ilgili bilgi saklanmaz. Sunucu her isteği bağımsız olarak işler.

  • Senaryo:

    • Bir kullanıcı bir web sitesinde bir sayfayı ziyaret eder ve sunucudan bir HTML sayfası ister.
    • Sonra, aynı kullanıcı başka bir sayfaya geçmek için yeni bir istek gönderir.
  • Stateless Özelliği:

    • İlk sayfaya erişim sırasında sunucu, bu isteği tamamen bağımsız bir şekilde ele alır. İkinci sayfa için yapılan istek, sunucu açısından ilk istekten tamamen bağımsızdır.
    • Sunucu, kullanıcıyla ilgili durum bilgisi (örneğin, kim olduğu veya daha önce hangi sayfalara baktığı gibi) tutmaz. Her yeni istek, bağımsız olarak değerlendirilir.
  • Sonuç:

    • Kullanıcı sayfalar arasında dolaşsa da, sunucu her isteği ayrı ayrı ele alır. Eğer kullanıcı kimlik doğrulama yapıyorsa, her istekte gerekli kimlik bilgilerini (örneğin, bir token) göndermelidir.

b) RESTful API'ler

REST mimarisi de stateless bir yapıya dayanır. Bir REST API'sine yapılan her istek, diğer isteklerden bağımsız olarak değerlendirilir. Sunucu her istekte gerekli olan tüm bilgileri istemciden alır.

  • Senaryo:

    • Bir kullanıcı, RESTful bir API kullanarak bir kaynak (örneğin, bir blog yazısı) almak istiyor.
    • Kullanıcı, /api/posts/1 adresine bir GET isteği gönderir ve sunucudan ilgili blog yazısının verilerini alır.
    • Ardından kullanıcı, başka bir blog yazısını almak için /api/posts/2 adresine bir GET isteği daha gönderir.
  • Stateless Özelliği:

    • Sunucu, her iki isteği de birbirinden bağımsız olarak işler. İlk istekte gönderilen blog yazısının bilgisini saklamaz.
    • Kullanıcı kimlik doğrulaması gerekiyorsa, her istekte kimlik bilgileri (genellikle bir JWT veya API anahtarı) yeniden gönderilmelidir.
  • Sonuç:

    • Sunucu, her isteği sıfırdan işler ve önceki isteğin durumunu saklamaz. Bu da, API'nin yatayda daha kolay ölçeklenmesine olanak tanır.

Farkları Örnek Üzerinden Karşılaştırma

Örnek Senaryo: E-Ticaret Uygulaması

  1. Stateful Yaklaşım:

    • Kullanıcı siteye giriş yapar ve oturum başlatılır.
    • Kullanıcı, site içerisinde dolaşırken alışveriş sepetine ürünler ekler.
    • Sunucu, kullanıcının oturumunu ve sepetine eklediği ürünleri saklar.
    • Kullanıcı sayfalar arasında geçiş yaptığında, sepetindeki ürünler korunur.
    • Sonuç: Sunucu, kullanıcının durumunu sakladığı için bu işlem stateful bir süreçtir.
  2. Stateless Yaklaşım:

    • Kullanıcı siteye giriş yapar ve her istekle birlikte bir kimlik doğrulama token'ı gönderir.
    • Alışveriş sepetine ürün eklediğinde, bu bilgi her seferinde istemciden gelir ve sunucu hiçbir durumda sepeti saklamaz.
    • İstemci, her istekle birlikte kullanıcı durumunu ve sepet bilgisini sunucuya iletmek zorundadır.
    • Sonuç: Sunucu, istemciden gelen her isteği bağımsız olarak işlediği için bu süreç stateless bir süreçtir.

Özet

  • Stateful sistemler, bir istemcinin kim olduğunu, hangi işlemleri yaptığını ve hangi aşamada olduğunu bilmek zorundadır. Bu durum oturum bazlı uygulamalarda, banka uygulamalarında ya da alışveriş sitelerinde yaygındır.
  • Stateless sistemler ise her isteği bağımsız ele alır ve bir önceki isteğe dair hiçbir bilgi saklamaz. HTTP ve RESTful API'ler buna iyi birer örnektir.

Her iki mimari de farklı kullanım senaryoları için uygun olabilir ve sistemin gereksinimlerine bağlı olarak tercih edilir.

💖 💪 🙅 🚩
mustafacam
Mustafa Çam

Posted on September 8, 2024

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related