Multi-tenant bir SaaS uygulamasında veri izolasyonunu nasıl tasarlarsınız? Paylaşılan tablo, şema başına tenant ve veritabanı başına tenant yaklaşımlarını karşılaştırın.
Cevap
Multi-tenant SaaS'ta birden fazla müşteri (tenant) aynı uygulamayı kullanır ve temel gereksinim bir tenant'ın asla diğerinin verisini görmemesidir. Üç ana model vardır; çoğu ürün paylaşılan tablo ile başlar, büyük kurumsal müşteriler için izole seçenek sunar.
| Model | İzolasyon | Maliyet / Operasyon | Uygun olduğu durum |
|---|---|---|---|
Paylaşılan tablo (tenant_id kolonu) | Mantıksal, en düşük | En ucuz, tek migration | Çok sayıda küçük tenant, B2C/SMB SaaS |
| Tenant başına şema | Orta | Binlerce şemada migration zorlaşır | Onlarca/yüzlerce orta ölçekli tenant |
| Tenant başına veritabanı | En yüksek | En pahalı, ayrı yedek ve izleme | Kurumsal, regülasyonlu (bankacılık, sağlık), veri yerelliği |
Paylaşılan tablo modelinde güvenlik
En büyük risk bir sorguda WHERE tenant_id = ? filtresinin unutulmasıdır. Bunu insan disiplinine bırakmayın:
- Repository/ORM katmanında zorunlu tenant filtresi (Prisma extension, Hibernate filter).
- PostgreSQL Row Level Security: filtre veritabanı seviyesinde zorunlu olur.
ALTER TABLE projects ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON projects
USING (tenant_id = current_setting('app.tenant_id')::uuid);
-- Her istekte transaction başında:
-- SET LOCAL app.tenant_id = '...';- Dikkat: tablo sahibi (owner) ve superuser rolleri RLS'i varsayılan olarak atlar. Uygulama owner rolüyle bağlanıyorsa
ALTER TABLE projects FORCE ROW LEVEL SECURITYkullanın veya uygulamaya ayrı, ayrıcalıksız bir rol verin. - Tüm index'ler
tenant_idile başlamalı:(tenant_id, created_at). - Benzersizlik kısıtları tenant'a göre olmalı:
UNIQUE (tenant_id, slug).
Tenant'ın belirlenmesi
- Alt alan adı (
acme.app.com), özel alan adı veya token içindekitenant_idclaim'i. - Kullanıcı birden fazla tenant'a üye olabiliyorsa
memberships(user_id, tenant_id, role)tablosu ve tenant seçici UI gerekir.
Diğer konular
- Noisy neighbor: bir tenant'ın yoğun kullanımı diğerlerini yavaşlatmasın; tenant bazlı rate limit ve kota.
- Cache anahtarları tenant içermeli:
tenant:{id}:dashboard. Aksi halde veri sızar. - Arka plan job'ları ve loglar tenant bağlamını taşımalı.
- Faturalama ve plan limitleri (kullanıcı sayısı, depolama) tenant seviyesinde uygulanır.
- Veri silme / dışa aktarma: KVKK/GDPR talepleri için bir tenant'ın tüm verisi kolayca bulunabilmeli.
İlgili Sistem Tasarımı soruları
- Dikey ve yatay ölçekleme arasındaki fark nedir?
- Hangi cache stratejilerini biliyorsunuz?
- REST ile GraphQL arasındaki farklar nelerdir?
- Bit.ly benzeri bir URL kısaltma servisi tasarlayın.
- Google Docs benzeri gerçek zamanlı ortak düzenleme yüksek seviyede nasıl tasarlanır?
- CDN nedir, nasıl çalışır ve hangi durumlarda kullanılır?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.