معظم فرق SaaS في لبنان والمنطقة تصطدم بنفس الجدار المعماري عند 50 إلى 200 مستأجر. هذا دليل عملي لقرارات Go و PostgreSQL التي تصنع الفارق الحقيقي عند التوسع.
معظم فرق SaaS في لبنان ومنطقة الشرق الأوسط تصطدم بنفس العائق المعماري عندما يصل عدد المستأجرين إلى ما بين 50 و200 عميل. تكون قواعد البيانات قد صُممت لخدمة مستأجر واحد، وطبقة API لا تعرف مفهوم العزل بين المستأجرين، وكل استعلام يمسح الجدول بأكمله. هذا الدليل يستعرض القرارات العملية في Go و PostgreSQL التي تحدد الفارق عند التوسع الفعلي.
لماذا يجب اتخاذ قرار تعدد المستأجرين قبل كتابة أول مسار في API؟
الاختيار بين عزل الصفوف وعزل المخططات وعزل قواعد البيانات يحدد شكل كل شيء يأتي بعده: استراتيجية الترحيل، أداء الاستعلامات، نهج تجميع الاتصالات، دقة النسخ الاحتياطي، وموقفك من الامتثال عندما يسأل مستأجر عن مكان بياناته.
في السياق العربي تحديداً، تأتي أسئلة إقامة البيانات مبكراً. الشركات اللبنانية التي تبيع لمؤسسات خليجية، أو منتجات SaaS الخليجية التي تبيع لجهات سعودية مرتبطة بالحكومة، تواجه طلبات العزل المادي في مرحلة أبكر بكثير مما تواجهه شركات SaaS الغربية.
ثلاثة نماذج للعزل ومتى تفشل كل منها
عزل الصفوف هو نقطة البداية الأكثر شيوعاً. جميع المستأجرين يشتركون في نفس الجداول، وعمود tenant_id موجود على كل سجل. سياسات أمان الصفوف في PostgreSQL تفرض العزل على مستوى قاعدة البيانات.
هذا النموذج يعمل جيداً من الصفر حتى عدة آلاف من المستأجرين. تكلفة التشغيل منخفضة، النسخ الاحتياطي بسيط، والاستعلام عبر المستأجرين للتحليلات التجميعية سهل. المشاكل تظهر عندما يبدأ مستأجر كبير بتوليد بيانات بحجم يضر بأداء الاستعلامات لجميع المستأجرين الآخرين.
عزل المخططات يمنح كل مستأجر مخططه الخاص داخل نفس قاعدة بيانات PostgreSQL. بنية الجداول متطابقة عبر المخططات لكن البيانات معزولة تماماً. آلية search_path في PostgreSQL تُوجّه كل اتصال إلى المخطط الصحيح.
هذا النموذج يستوعب حتى نحو 1000 مستأجر لكل قاعدة بيانات بشكل مريح. أدوات الترحيل تحتاج لتطبيق تغييرات المخطط عبر جميع مخططات المستأجرين، وهو ما يتطلب سكريبتات دقيقة.
قاعدة بيانات لكل مستأجر هو الخيار الصحيح عندما يكون للمستأجرين خصائص حمل مختلفة فعلاً، أو عندما يتطلب الامتثال عزلاً مادياً صارماً. التكلفة التشغيلية أعلى بكثير.
لمعظم منتجات SaaS التي تُبنى في لبنان والمنطقة في مرحلة النمو المبكر، عزل الصفوف مع سياسات أمان صفوف PostgreSQL هو نقطة البداية الصحيحة.
إعداد سياق المستأجر في Middleware بـ Go
أساس أي backend Go متعدد المستأجرين هو نشر سياق المستأجر بشكل موثوق. كل طلب يصل إلى معالج يجب أن يحمل بالفعل معرف المستأجر المحلول. الحل يتم في middleware، ومعرف المستأجر يتدفق عبر سياق الطلب.
معرف المستأجر يمكن أن يُسحب من مطالبة JWT أو نطاق فرعي أو بحث مفتاح API. المهم أن الحل مركزي ويحدث قبل أي منطق في المعالج.
استخدام sqlc للوصول الآمن لقاعدة البيانات
sqlc يولّد كود Go من استعلامات SQL خام. هذا مهم في backend SaaS لأن البديل - كتابة SQL كنصوص في كود Go ومسح النتائج يدوياً - لا يتوسع مع حجم الفريق أو تعقيد قاعدة الكود.
مع sqlc، تكتب ملفات SQL والأداة تولد دوال Go بأنواع معلمات صحيحة وهياكل نتائج. في backend متعدد المستأجرين، يجعل sqlc أيضاً من السهل مراجعة كل استعلام للتأكد من وجود فلاتر tenant_id.
تجميع الاتصالات مع PgBouncer عند التوسع
حد الاتصالات الأصلي لـ PostgreSQL هو أحد أوائل قيود التوسع في أي backend SaaS. كل اتصال بـ PostgreSQL يستهلك تقريباً 5 إلى 10 ميغابايت من ذاكرة الخادم.
لخوادم Go الخلفية لـ SaaS، PgBouncer في وضع المعاملات هو الحل المعياري. خدمات Go تتحدث إلى PgBouncer الذي يحافظ على مجموعة أصغر من اتصالات PostgreSQL الفعلية.
التحذير مع PgBouncer في وضع المعاملات هو أن ميزات جلسة PostgreSQL على مستوى الجلسة، بما في ذلك SET search_path لعزل المخطط، لا تعمل بشكل موثوق. إذا كنت تستخدم عزل المخطط، فإما أن تستخدم PgBouncer في وضع الجلسة أو تنفّذ توجيه المخطط على مستوى الاستعلام.
دروس من الإنتاج
القرارات المعمارية التي تؤلم أكثر في وقت لاحق هي تلك التي تُتخذ بشكل افتراضي لا بتصميم. تعدد المستأجرين يستحق قراراً تصميمياً صريحاً في بداية المشروع.
عزل الصفوف مع سياسات أمان صفوف PostgreSQL قوي بما يكفي لمعظم منتجات SaaS في المنطقة العربية خلال أول بضع مئات من المستأجرين. sqlc يقضي على فئة كاملة من أخطاء وقت التشغيل ويجعل عزل المستأجرين قابلاً للتدقيق في مرحلة مراجعة الكود. PgBouncer في وضع المعاملات ليس اختيارياً عند التوسع.
هل تحتاج إلى مساعدة في تصميم نظامك؟
Voxire تبني backends إنتاجية بـ Go و PostgreSQL لفرق SaaS في لبنان وعبر منطقة الشرق الأوسط. إذا كنت تصمم نظاماً متعدد المستأجرين أو تهاجر منتجاً قائماً، يمكننا مساعدتك في اتخاذ القرارات البنيوية الصحيحة قبل أن تصبح مكلفة التغيير.
https://voxire.com/get-a-quote/



