تا به حال به ساختار یک هتل دقت کردهاید؟ مهمانانی که در اتاقهای مجزا اقامت دارند و در واحد خود میتوانند از امکانات مختلفی استفاده کنند. با این حال، بعضی از بخشهای هتل مانند رستوران، پارکینگ و اماکن تفریحی جزو بخشهای عمومی بهحساب میآیند و همه مهمانان میتوانند از آنها استفاده کنند.
در دنیای نرمافزارها هم چنین رویکردی تحت عنوان «چندمستأجری» (Multi-Tenancy) وجود دارد؛ معماری که یک سرویس را در اختیار چندین کاربر و سازمان مختلف قرار میدهد تا هرکدام دادهها، تنظیمات و سطح دسترسی مختص به خود را داشته باشند.
در این مطلب به بررسی Multi-Tenancy میپردازیم و مزایا و معایب این معماری پرکاربرد را مرور میکنیم.
تعریف Multi-Tenancy
«چندمستأجری» یا Multi-Tenancy، نوعی معماری نرمافزاری است که در آن، یک برنامه بههمراه دیتابیس و زیرساخت سختافزاری خود، بهصورت همزمان به چند حساب کاربری سرویس میدهد. در این مدل، بهجای پیادهسازی و نگهداری چند نسخه جداگانه از یک نرمافزار، همه کاربران از یک اپلیکیشن مشترک استفاده میکنند و همین امر باعث میشود زمان و هزینه مورد نیاز پروژهها به طور چشمگیری کاهش پیدا کند.
بیشتر بخوانید: استراتژی API Aggregation چیست؟ راهنمای کامل برای توسعهدهندگان
مشترکان یک برنامه Multi-Tenancy به اصطلاح «Tenant» نامیده میشوند. Tenant میتواند طیف وسیعی از کاربران را در بر بگیرد؛ از توسعهدهندگان شخصی گرفته تا سازمانها و تیمهای توسعه بزرگ که از دسترسیها و مجوزهای مشترکی در داخل نرمافزار برخوردارند. آنچه که معماری Multi-Tenancy را حائز اهمیت میکند، حفظ دادههای خصوصی Tenant ها است. در این معماری، دادههای هر کاربر بهصورت ایزوله نگهداری میشود و برای سایر کاربران کاملاً نامرئی و غیرقابل دسترسی است. این ایزولاسیون تضمین میکند که امنیت اطلاعات و حریم خصوصی همه کاربران حفظ شود.
معماری Multi-Tenancy پایه و اساس اصلی مدل SaaS (Software-as-a-Service) محسوب میشود و سرویسهایی مانند Salesforce یا HubSpot که روزانه به هزاران کاربر سرویس میدهند، از همین ساختار پیروی میکنند.
Multi-Tenant API چیست؟
یکی از پرکاربردترین موارد استفاده معماری Multi-Tenancy در APIها است. این رابطهای کاربری برنامهنویسی که به اصطلاح Multi-Tenant API نامیده میشوند، این امکان را دارند که بهصورت همزمان به چندین مشتری یا سازمان (Tenant) سرویس بدهند، بدون آنکه دادهها، تنظیمات یا سطح دسترسی آنها با یکدیگر تداخل پیدا کند.
در معماری Multi-Tenant API:
- دادهها کاملاً از هم ایزوله هستند
- سطح دسترسی هر Tenant مشخص و محدود است
- تنظیمات، سهم مصرف (Quota) و سیاستها میتواند متفاوت باشد
طراحی APIهای Multi-Tenant
برای پیادهسازی Multi-Tenancy در APIها، کافی است مراحل زیر را بهترتیب دنبال کنید:
1. تحلیل نیاز و تعیین Tenant
در مرحله اول، میبایست مشخص کنید چه کسانی Tenant شما هستند. در این مرحله، کاربران شخصی، تیمها یا سازمانها بهعنوان Tenant دستهبندی میشوند. در گام بعدی، تعیین کنید هر Tenant به چه دادهها، امکانات و سطح دسترسیهایی نیاز دارد. در نهایت، نوع ایزولاسیون دادهها را مشخص کنید و منابع عمومی را به اشتراک بگذارید.
2. راهاندازی Context مربوط به Tenant
پس از تعیین کاربران، نوبت به مرحله شناسایی Tenant در هر درخواست میرسد. این فرایند میتواند با ارسال یک شناسه Tenant (مانند Tenant ID) در هدرهای HTTP، Query String یا URL انجام شود.
علاوهبراین، میتوانید مانند تصویر زیر یک Middleware ایجاد کنید که اطلاعات Tenant را از درخواست ورودی استخراج کرده و آن را در اختیار باقی بخشهای برنامه قرار دهد.

. پیکربندی Multi-Tenant
در مدل دیتابیس مشترک، باید مطمئن شویم که تمام عملیات انجام شده روی دادهها فقط به Tenant مربوطه محدود باشد. برای این کار میتوان یک فیلتر Tenant در DbContext اضافه کرد تا هر Query یا عملیات، بهطور خودکار فقط دادههای همان Tenant را تغییر دهد.
در متد OnModelCreating میتوان یک فیلتر سراسری (Global Query Filter) تعریف کرد که محدوده Tenant را در تمام Entityها اعمال کند. با این کار، هر Query که روی دیتابیس اجرا میشود، بهطور خودکار محدود به دادههای Tenant مربوطه خواهد بود و از نشت اطلاعات بین Tenantها جلوگیری میشود.

. ایزولهسازی دادهها بر اساس Tenant
در معماری Multi-Tenancy، جداولی که دادههای اختصاصی هر Tenant را ذخیره میکنند، باید یک ستون Tenant ID داشته باشند. این ستون باعث میشود بتوانیم دادهها را برای هر Tenant فیلتر کنیم و از این طریق، مانع دسترسی یک Tenant به دادههای دیگران شویم.
نمونهای از Tenant-Aware Entity را در تصویر زیر مشاهده میکنیم:

. مسیردهی (Routing) بر اساس Tenant
مسیرها (Routes) را میتوان بهگونهای تعریف کرد که Tenant ID در آنها لحاظ شود. این روش مخصوصاً برای سرویسهایی مفید است که زمینه Tenant باید بخشی از ساختار URL باشد. با این روش، هر درخواست به URL مشخصی که شامل Tenant است، هدایت میشود و API میتواند دادهها و عملکرد خود را بر اساس Tenant مربوطه ارائه دهد.
نمونهای از Routing آگاه به Tenant:

. امنیت Multi-Tenant API
امنیت در محیط Multi-Tenancy اهمیت بالایی دارد و باید اطمینان داشته باشید که موارد زیر بهدرستی رعایت میشود:
- احراز هویت (Authentication): فقط کاربران مجاز قادر به دسترسی به دادههای Tenant خود هستند.
- سطح دسترسی (Authorization): کاربران تنها میتوانند به منابع مربوط به Tenant خود دسترسی داشته باشند.
برای احراز هویت مبتنی بر توکن، میتوان از OAuth2 یا OpenID Connect استفاده کرد. همچنین مطمئن شوید که JWT شامل Tenant ID بهعنوان یک Claim باشد و این Claim در هر درخواست بررسی و اعتبارسنجی شود.

7. خودکارسازی ایجاد Tenant ها
یکی از جنبههای مهم معماری Multi-Tenancy، توانایی ایجاد Tenant های جدید بهصورت دینامیک و خودکار است. وقتی یک Tenant جدید ثبتنام میکند، نیاز است موارد زیر را رعایت کنیم:
- ایجاد رکوردهای اختصاصی Tenant در دیتابیس
- راهاندازی تنظیمات یا ویژگیهای مخصوص همان Tenant
- اختصاص یک Tenant ID منحصربهفرد برای محدودسازی دادهها و درخواستها
در ادامه میتوان یک مثال عملی از خودکارسازی ایجاد Tenant را مشاهده کنیم:

. مانیتورینگ و لاگگیری
در محیط Multi-Tenancy، فرایند مانیتورینگ و ثبت لاگ کمی پیچیدهتر از سایر محیطها است. برای رفع مشکلات یا بررسی میزان استفاده، ضروری است Tenant ID در همه لاگها لحاظ شود. پیشنهاد میشود از ابزارهایی مانند Serilog یا NLog استفاده کنید تا Tenant ID بهطور خودکار در هر رکورد لاگ وارد شود و امکان پیگیری دقیق فعالیتها برای هر Tenant وجود داشته باشد.

این معماری برای اپلیکیشنهای SaaS یا هر سیستمی که نیاز به ایزولهسازی سطح Tenant دارد، گزینهای ایدهآل به حساب میآید. با پیروی از این مراحل، میتوانید اطمینان حاصل کنید که برنامه شما به نیازهای چندین Tenant پاسخ میدهد و همزمان امنیت و عملکرد آن حفظ میشود.
مقایسه Multi-Tenancy با Single-Tenancy
در معماری Single-Tenancy، هر مشتری (Tenant) یک نمونه مستقل از نرمافزار و دیتابیس خود را دارد. این یعنی دادهها، تنظیمات و منابع کاملاً جدا هستند و هیچ اشتراکی بین مشتریها وجود ندارد. مزیت اصلی این مدل، ایزولهسازی کامل و کنترل بالای امنیت است. اما از آنجا که در این معماری هر Tenant نیاز به زیرساخت جداگانه دارد، هزینه نگهداری، منابع و مقیاسپذیری آن بهمراتب از Multi-Tenancy بیشتر است.
در مقابل، Multi-Tenancy به برنامهها اجازه میدهد تا همزمان به چندین مشتری سرویس دهند و دادهها با شناسه Tenant ایزوله شوند. این مدل نسبت به معماری Single-Tenancy بهینهتر و مقیاسپذیرتر است و از آنجا که تمامی Tenant ها از یک دیتابیس مشترک استفاده میکنند، زمان و هزینه پیادهسازی آن چندان بالا نیست. با این حال، رعایت دقیق امنیت و ایزولهسازی دادهها اهمیت بیشتری پیدا میکند، چرا که کوچکترین خطا میتواند منجر به دسترسی یک Tenant به دادههای دیگری شود.
| معیار مقایسه | Multi-Tenancy | Single-Tenancy |
| ساختار معماری | یک نمونه مشترک از نرمافزار برای چند Tenant | یک نمونه مستقل برای هر Tenant |
| ایزولهسازی داده | منطقی | فیزیکی و کامل |
| هزینه زیرساخت | پایینتر و بهصرفهتر | بالاتر به دلیل منابع جداگانه |
| مقیاسپذیری | بالا و مناسب رشد سریع | محدودتر و پرهزینه |
| نگهداری و آپدیت | سادهتر | پیچیدهتر |
| امنیت | وابسته به طراحی صحیح و دقیق | ذاتاً امنتر |
| مصرف منابع | بهینه و اشتراکی | مصرف بالای منابع |
| مناسب برای | SaaS و سرویسهای ابری | سازمانهای بزرگ با نیازهای خاص |
مزایا و معایب Multi-Tenancy
تا به اینجا، برخی از مزایا و قابلیتهای معماری Multi-Tenancy را بررسی کردیم؛ اما مانند هر معماری دیگری، Multi-Tenancy هم در کنار مزایای قابل توجه خود، چالشها و معایب خاص خود را دارد و نیاز است توسعهدهندگان بهخوبی با این محدودیتها آشنا باشند.
در ادامه، نگاهی دقیقتر به مزایا و چالشهای طراحی Multi-Tenant API میاندازیم.
مزایای Multi-Tenancy
1. کاهش هزینهها
یکی از مهمترین مزایای Multi-Tenancy، صرفهجویی قابلتوجه در هزینههاست. از آنجا که همه Tenant ها از یک زیرساخت مشترک استفاده میکنند، هزینههای مربوط به سرور، نگهداری، لایسنس نرمافزار و عملیات فنی بین آنها تقسیم میشود. این مزیت باعث شده تا Multi-Tenancy هم برای ارائهدهنده سرویس و هم برای مشتریان بسیار مقرونبهصرفه باشد.
2. مقیاسپذیری بهتر
معماری Multi-Tenant اصولاً بهگونهای طراحی شده که بالاترین سطح مقیاسپذیری را در اختیار توسعهدهندگان قرار دهد. این ساختار هنگام اضافهشدن مشتریان جدید، نیازی به راهاندازی سیستم جداگانه ندارد و با مدیریت صحیح منابع، میتواند تعداد زیادی Tenant را بهصورت همزمان پشتیبانی کند.
3. نگهداری و بهروزرسانی آسان
در این مدل، بهروزرسانی نرمافزار، رفع باگها و اعمال تغییرات تنها بر روی یک نسخه انجام میشود. در نتیجه، نیازی به آپدیت جداگانه برای هر مشتری نیست و تمام کاربران بلافاصله بعد از آپدیت، به قابلیتهای جدید دسترسی دارند.
4. مدیریت متمرکز
فرایند کنترل و نظارت بر سیستمها در ساختار Multi-Tenancy بسیار ساده و کارآمد است؛ چرا که مدیریت امنیت، مانیتورینگ، لاگگیری و تنظیمات کلی سیستم بهصورت متمرکز انجام میشود و توسعهدهندگان را از انجام چندین فعالیت مختلف بهصورت موازی بینیاز میکند.
معایب Multi-Tenancy
1. چالشهای امنیت و حریم خصوصی
گرچه در معماری Multi-Tenancy تمامی دادههای Tenantها بهصورت مجزا نگهداری میشود، اما همچنان همه آنها روی یک زیرساخت مشترک قرار دارند. در نتیجه، هرگونه نقص امنیتی در طراحی یا پیادهسازی میتواند منجر به دسترسی غیرمجاز به دادههای سایر کاربران شود.
2. محدودیت در سفارشیسازی
معماری Multi-Tenant مزایای پرشمار زیادی دارد، اما سفارشیسازی یکی از آنها نیست. در این ساختار، اعمال تغییرات بزرگ برای یک Tenant ممکن است روی سایر کاربران هم اثر بگذارد و همین باعث میشود تا میزان شخصیسازی در Multi-Tenant محدودتر از روش Single-Tenancy باشد.
3. پیچیدگی در طراحی و توسعه
پیش از این، بارها به تأثیر معماری Multi-Tenant در سادهسازی فرایندها اشاره کردیم؛ با این حال، پیادهسازی اولیه این معماری به هیچ عنوان ساده نیست. برای بهکارگیری این ساختار، توسعهدهندگان میبایست جداسازیها و سطوح دسترسی را با دقت پیادهسازی کنند و تأثیر هر Tenant بر منابع مشترک را زیر نظر بگیرند.
بیشتر بخوانید: پروتکل OAuth 2.0 چیست؟ بررسی نقش آن در مجوزدهی به اپهای وب
به طور کلی، Multi-Tenant یک انتخاب هوشمندانه برای بسیاری از سرویسهای ابری و SaaS بهحساب میآید؛ با این حال، این معماری نیازمند طراحی دقیق، رعایت اصول امنیتی و مدیریت هوشمند منابع است تا از بروز چالشهای اشاره شده جلوگیری شود.
جمعبندی
در مجموع، معماری Multi-Tenancy در ها را میتوان ترکیبی از هوشمندی در طراحی و دقت در اجرا دانست. اگر قصد دارید برنامه خود را در قالب SaaS یا API ارائه کنید، این معماری قطعاً یکی از بهترین انتخابهای شما خواهد بود. انتخابی که در صورت پیادهسازی صحیح و اصولی، زمان و هزینههای پروژه شما را بهطور چشمگیری کاهش میدهد. پیشنهاد میکنیم پیش از استفاده از این ساختار، نیازهای کسبوکار، سطح سفارشیسازی مورد انتظار و الزامات امنیتی مجموعه خود را بهطور دقیق بررسی کنید تا بتوانید تعادلی منطقی میان مقیاسپذیری، امنیت و انعطافپذیری ایجاد کنید.









