إنشاء خدمة SaaS متعددة المستأجرين: قاعدة بيانات لكل مستأجر مقابل مخطط مشترك
أهم قرار معماري في تطوير خدمات البرمجيات كخدمة (SaaS): كيفية عزل بيانات المستأجرين. نقارن بين ثلاث طرق مع تحليل التكاليف الفعلية واستراتيجيات الترحيل وأمثلة على الأكواد البرمجية.
القرار الذي يحدد كل شيء
عند تطوير منتج SaaS، فإن القرار الهندسي الأهم هو عزل المستأجرين. إذا أخطأت في هذا الأمر، فستضطر إلى قضاء أشهر في عملية الترحيل لاحقًا. هناك ثلاث طرق، لكل منها مزايا وعيوب واضحة:
النهج 1: قاعدة بيانات مشتركة، مخطط مشترك (عزل على مستوى الصفوف)
تُخزَّن بيانات كل مستأجر في نفس الجداول، ويتم تمييزها بواسطة عمود tenant_id. وهذه هي الطريقة الأبسط والأقل تكلفة.
# Django: التصفية التلقائية للمستأجرين باستخدام الوسيط
البرمجي class TenantMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# تعيين المستأجر من JWT أو النطاق الفرعي
request.tenant = get_tenant_from_request(request)
return self.get_response(request)
class TenantManager(models.Manager):
def get_queryset(self):
from threading import local
_thread_locals = local()
tenant = getattr(_thread_locals, 'tenant', None)
qs = super().get_queryset()
if tenant:
qs = qs.filter(tenant_id=tenant.id)
return
qsclass Order(models.Model):
tenant = models.ForeignKey('Tenant', on_delete=models.CASCADE)
# ... حقول أخرى
objects = TenantManager() # يتم تصفية جميع الاستعلامات تلقائيًاالمزايا: بسيطة، ورخيصة (50-200 دولار شهريًا لقاعدة بيانات واحدة)، وسهلة النشر، وتتميز بمجمع اتصالات مشترك. العيوب: خطر تسرب البيانات في حالة نسيان أحد المرشحات، ومشكلة "الجار المزعج" (حيث تؤثر الاستعلامات المكثفة لأحد المستخدمين على الآخرين)، وصعوبة الامتثال (حذف البيانات وفقًا للائحة العامة لحماية البيانات).
النهج الثاني: قاعدة بيانات مشتركة، مخططات منفصلة (مخططات PostgreSQL)
يحصل كل مستأجر على مخطط PostgreSQL خاص به ضمن قاعدة بيانات واحدة. الجداول متطابقة ولكنها معزولة عن بعضها البعض بواسطة مساحة الاسم.
# استخدام مكتبة
django-tenants# كل طلب يحدد المخطط بناءً على النطاق
الفرعي# settings.
pyDATABASE_ROUTERS = ['django_tenants.routers.TenantSyncRouter']
# تحدد البرمجيات الوسيطة المخطط لكل طلب#
acme.yourapp.com -> المخطط
'acme'# globex.yourapp.com -> المخطط
'globex'# المكافئ في SQL:
# SET search_path TO 'acme'; -- جميع الاستعلامات تصل الآن إلى جداول
acme# SELECT * FROM orders; -- يعرض طلبات acme فقطالمزايا: عزل قوي دون الحاجة إلى قواعد بيانات إضافية، وسهولة حذف البيانات (DROP SCHEMA CASCADE)، وفهارس منفصلة لكل مستأجر. العيوب: تعقيد عملية الترحيل (يلزم ترحيل كل مخطط)، وصعوبة تجميع الاتصالات، والحد الأقصى يبلغ حوالي 500 مستأجر قبل أن يتدهور الأداء.
النهج 3: قاعدة بيانات لكل مستأجر
يحصل كل مستأجر على قاعدة بيانات خاصة به. أقصى درجات العزل، وأقصى درجات التعقيد التشغيلي.
المزايا: عزل تام، قابلية التوسع المستقلة، سهولة الامتثال، إمكانية توفير بنية تحتية مخصصة للعملاء من الشركات. العيوب: التكلفة الباهظة (50-200 دولار شهريًا لكل مستأجر)، صعوبة إدارة تجميع الاتصالات، عمليات الترحيل عبر مئات قواعد البيانات، تتطلب التحليلات المشتركة بين المستأجرين وجود مستودع بيانات.
مصفوفة القرار: أي نهج يجب اختياره
| العامل | المخطط المشترك | مخططات منفصلة | قواعد بيانات منفصلة |
|---|---|---|---|
| التكلفة الشهرية (100 مستأجر) | 100-200 دولار | 200-500 دولار | 5,000-20,000 دولار |
| الحد الأقصى لعدد المستأجرين | بلا حدود | حوالي 500 | حوالي 100 (يمكن التحكم فيها) |
| عزل البيانات | ضعيف (على مستوى الصف) | قوي (على مستوى المخطط) | كامل |
| الامتثال (اللائحة العامة لحماية البيانات/SOC2) | صعب | معتدل | سهل |
| خطر الجار المزعج | مرتفع | متوسط | لا شيء |
| الأفضل لـ | الخدمات المباشرة للمستهلكين (B2C)، خدمات البرمجيات كخدمة للشركات الصغيرة والمتوسطة (SMB SaaS) | خدمات البرمجيات كخدمة (SaaS) للشركات المتوسطة | خدمات البرمجيات كخدمة (SaaS) للشركات |
توصيتنا: ابدأ بالخيار المشترك، ثم قم بالترقية
ابدأ باستخدام مخطط مشترك + عزل على مستوى الصفوف. فهذا يتيح لك الوصول إلى السوق بسرعة ويغطي 90% من حالات الاستخدام. وعندما تحصل على عملاء من الشركات التي تحتاج إلى ضمانات العزل، فقدم مخططات أو قواعد بيانات منفصلة كخدمة مميزة.
المفتاح هو تصميم نماذجك باستخدام معرّف المستأجر (tenant_id) منذ البداية. وهذا يجعل الانتقال إلى أي نهج آخر ممكنًا لاحقًا دون الحاجة إلى إعادة كتابة التطبيق.
أفضل بنية متعددة المستأجرين هي تلك التي تتناسب مع المرحلة التي تمر بها شركتك حالياً. فالشركة الناشئة التي لديها 10 مستأجرين وتستخدم نموذج "قاعدة بيانات لكل مستأجر" تدفع عشرة أضعاف ما ينبغي أن تدفعه.
— شركة ألوكنايت للهندسة
