Multi-tenancy
Multi-tenancy হলো এমন একটি আর্কিটেকচার যেখানে একটি অ্যাপ্লিকেশন ইনস্ট্যান্স একাধিক ক্লায়েন্ট (Tenant) সার্ভ করে। প্রতিটি টেন্যান্টের ডেটা আলাদা এবং সিকিউর থাকে।
Multi-tenancy Approaches
1. Shared Database with Tenant Column
প্রতিটি টেবিলে tenant_id কলাম যোগ করা। সহজ কিন্তু স্কেলেবিলিটি লিমিটেড।
2. Separate Databases
প্রতিটি টেন্যান্টের জন্য আলাদা ডাটাবেস। সিকিউর কিন্তু ম্যানেজমেন্ট কমপ্লেক্স।
3. Schema-based (PostgreSQL)
একই ডাটাবেসে প্রতিটি টেন্যান্টের জন্য আলাদা স্কিমা। সবচেয়ে জনপ্রিয়।
django-tenant-schemas
PostgreSQL এর স্কিমা ফিচার ব্যবহার করে মাল্টি-টেন্যান্সি ইমপ্লিমেন্ট করার জন্য।
Installation:
bash
pip install django-tenant-schemasConfiguration:
python
# settings.py
INSTALLED_APPS = [
'tenant_schemas',
'customers', # Your tenant app
# ...
]
DATABASE_ROUTERS = (
'tenant_schemas.routers.TenantSyncRouter',
)
TENANT_MODEL = "customers.Client"
TENANT_DOMAIN_MODEL = "customers.Domain"
# Shared apps (সব টেন্যান্টে থাকবে)
SHARED_APPS = (
'tenant_schemas',
'customers',
'django.contrib.contenttypes',
'django.contrib.auth',
)
# Tenant-specific apps
TENANT_APPS = (
'django.contrib.admin',
'myapp',
)Tenant Model
python
# customers/models.py
from django.db import models
from tenant_schemas.models import TenantMixin, DomainMixin
class Client(TenantMixin):
name = models.CharField(max_length=100)
created_on = models.DateField(auto_now_add=True)
auto_create_schema = True
class Domain(DomainMixin):
passMiddleware
python
# settings.py
MIDDLEWARE = [
'tenant_schemas.middleware.TenantMiddleware',
# ... other middleware
]Creating Tenants
python
from customers.models import Client, Domain
# Create tenant
tenant = Client(schema_name='client1', name='Client 1')
tenant.save()
# Create domain
domain = Domain()
domain.domain = 'client1.example.com'
domain.tenant = tenant
domain.is_primary = True
domain.save()Domain Routing
প্রতিটি টেন্যান্টের জন্য সাবডোমেইন:
client1.example.com→ Client 1 এর স্কিমাclient2.example.com→ Client 2 এর স্কিমা
Migrations
bash
# Shared apps এর জন্য
python manage.py migrate_schemas --shared
# সব টেন্যান্টের জন্য
python manage.py migrate_schemasAccessing Tenant Data
python
from tenant_schemas.utils import schema_context
with schema_context('client1'):
# এখন client1 স্কিমায় কাজ করছি
products = Product.objects.all()Tenant Isolation
প্রতিটি টেন্যান্টের ডেটা সম্পূর্ণ আলাদা স্কিমায় থাকে, তাই ডেটা লিক হওয়ার সম্ভাবনা কম।