Stateless Backend
Stateless Nedir?
Stateless, sunucunun her isteği bağımsız bir işlem olarak ele aldığı mimari yaklaşımdır.
Sunucu:
- Önceki istekleri hatırlamaz
- Kullanıcıya ait session bilgisini RAM’de tutmaz
- Her isteği “ilk mesaj” gibi değerlendirir
Bu yüzden her request, işlem için gerekli tüm bilgileri kendi içinde taşımalıdır.
Stateful Nedir?
Stateful sistemde sunucu kullanıcıya ait durumu (state) belleğinde tutar.
Örnek:
- “Ahmet giriş yaptı”
- “Sepetinde 3 ürün var”
Bu bilgiler sunucunun RAM’inde saklanır.
Sorunlar:
- Sunucu ölürse session kaybolur
- Load balancer başka sunucuya yönlendirirse kullanıcı düşer
- Sticky session gerekir
Stateless Nasıl Çalışır?
Stateless mimaride:
- Sunucu kullanıcıyı hatırlamaz
- Kullanıcı her istekte kimliğini kanıtlar
- Sunucu doğrular
- İşlemi yapar
- Unutur
Örnek:
GET /orders
Authorization: Bearer eyJhbGciOi...
Sunucu:
- Token’ı alır
- Token’ı doğrular
- Kullanıcıyı belirler
- İşlemi yapar
- Hiçbir state saklamaz
Request bittiğinde süreç tamamen sona erer.
Stateless Mimaride State Nerede Tutulur?
Stateless, “hiç state yok” demek değildir. “State sunucunun belleğinde tutulmaz” demektir.
1. Client Tarafında
Genelde JWT kullanılır.
- Kullanıcı kimliği
- Yetkiler
- Expiration
Token her istekte gönderilir.
2. External Store
Eğer state server tarafında tutulacaksa:
- Redis
- Memcached
- Database
gibi tüm sunucuların erişebildiği merkezi bir yerde tutulur.
Stateless ve Horizontal Scaling
Stateless mimari, horizontal scaling için idealdir.
Client
↓
Load Balancer
↓
App1 App2 App3
Her sunucu aynı şekilde çalışır.
Hiçbir sunucu kullanıcıya özel state tutmadığı için:
- İstek herhangi bir sunucuya gidebilir
- Sticky session gerekmez
- Failover sorunsuzdur
Stateful vs Stateless Karşılaştırma
| Özellik | Stateful | Stateless |
|---|---|---|
| Session | RAM’de tutulur | Client / Redis’te tutulur |
| Sunucu çökmesi | Session kaybolur | Etkilenmez |
| Horizontal scaling | Zor | Kolay |
| Load balancer | Sticky session gerekir | Direkt çalışır |
| Cloud uyumu | Düşük | Yüksek |
Stateful Örnek
req.session.userId = 42;
Sunucu kullanıcı state’ini saklar.
Stateless Örnek
Authorization: Bearer <JWT>
Sunucu hiçbir şey saklamaz.
WebSocket Neden Stateful?
WebSocket:
- Kalıcı bağlantı kurar
- Açık socket’leri RAM’de tutar
- Bağlantı kimliklerini bellekte saklar
Örnek:
const clients = new Map();
Bu state’tir.
Sunucu restart olursa:
- Tüm bağlantılar kopar
- State kaybolur
Bu yüzden WebSocket doğası gereği stateful’dır.
WebSocket Nasıl Scale Edilir?
Dağıtık yapı gerekir.
Client
↓
Load Balancer
↓
WS1 WS2 WS3
↘ Redis Pub/Sub ↙
- Mesaj Redis’e gider
- Diğer sunucular dinler
- Kendi client’larına iletir
WebSocket connection stateful’dır Ama mesaj dağıtımı merkezi yapılır.
REST + WebSocket Birlikte Kullanım
| Katman | Yapı |
|---|---|
| REST API | Stateless |
| Auth | JWT |
| WebSocket bağlantı | Stateful |
| Event dağıtımı | Redis |
Modern sistemlerde genelde:
- API → Stateless
- WebSocket → Distributed stateful
Kritik Noktalar
Stateless backend için:
- JWT expiration olmalı
- Refresh token stratejisi olmalı
- Token blacklist düşünülmeli
- Idempotent endpoint tasarlanmalı
- External cache kullanılmalı
Stateless tasarım, doğru yapılmazsa güvenlik açığı üretir.