وقتی یک کسب وکار تصمیم می گیرد یک اپلیکیشن موبایل طراحی کند، معمولاً اولین سوال ها درباره ظاهر اپلیکیشن، امکانات مورد نیاز و زمان تحویل پروژه است. اما یکی از مهم ترین تصمیم هایی که آینده محصول را مشخص می کند، قبل از شروع طراحی رابط کاربری و کدنویسی اتفاق می افتد:
انتخاب معماری اپلیکیشن موبایل تعیین می کند که سیستم در آینده چقدر قابلیت توسعه، افزایش کاربر، اضافه کردن امکانات جدید و مدیریت هزینه ها را خواهد داشت.
برای مثال یک اپلیکیشن فروشگاهی کوچک را تصور کنید که در نسخه اول فقط چند صد محصول، ثبت سفارش و پرداخت آنلاین دارد. چنین پروژه ای ممکن است با یک معماری ساده به خوبی کار کند.
اما اگر همین کسب وکار رشد کند و تبدیل به یک مارکت پلیس بزرگ شود که هزاران فروشنده، میلیون ها محصول، سیستم پیشنهاد کالا، مدیریت انبار، حمل ونقل، تخفیف های هوشمند و تحلیل رفتار کاربران دارد، معماری اولیه دیگر پاسخگوی نیازهای آن نخواهد بود.
در واقع معماری نرم افزار مانند نقشه ساختمان است. همان طور که یک ساختمان چند طبقه نیازمند طراحی سازه ای متفاوت از یک خانه کوچک است، یک اپلیکیشن با میلیون ها کاربر نیز به معماری متفاوتی نسبت به یک اپلیکیشن ساده نیاز دارد.
در این مقاله بررسی می کنیم:

معماری اپلیکیشن موبایل (Mobile Application Architecture) ساختار فنی یک اپلیکیشن و نحوه ارتباط بخش های مختلف آن با یکدیگر است.
به زبان ساده، معماری مشخص می کند:
یک اپلیکیشن موبایل حرفه ای فقط همان چیزی نیست که کاربر روی صفحه گوشی مشاهده می کند. پشت یک اپلیکیشن ساده، مجموعه ای از سرویس ها، سرورها، پایگاه های داده و APIها فعالیت می کنند.
برای مثال در یک اپلیکیشن فروشگاهی مشابه دیجی کالا، کاربر فقط صفحه محصولات را می بیند؛ اما پشت این صفحه، سیستم های مختلفی فعالیت می کنند:
نحوه سازمان دهی و ارتباط این بخش ها همان معماری اپلیکیشن است.

معماری یک اپلیکیشن معمولاً از چند بخش اصلی تشکیل می شود:
| اجزا | تعریف | نمونه | تکنولوژی ها |
| فرانت اند | Frontend همان بخشی است که کاربر با آن تعامل دارد. | صفحه ورود، صفحه محصولات، سبدخرید، پروفایل کاربر، منوها و صفحات داخلی | Native Android، Native iOS، Flutter ، React Native |
Backend مغز اصلی اپلیکیشن است.
| اجزا | تعریف | نمونه |
| بک اند | Backendمغز اصلی اپلیکیشن است. | ثبت و مدیریت کاربران، پردازش سفارش، مدیریت دسترسی ها، اجرای قوانین کسب وکار،ارتباط با سرویس های دیگر |
برای مثال وقتی کاربر در یک اپلیکیشن فروشگاهی سفارش ثبت می کند، Backend باید:
تمام اطلاعات مهم اپلیکیشن در دیتابیس ذخیره می شود.
مانند:
انتخاب ساختار مناسب دیتابیس، مخصوصاً در اپلیکیشن های پرترافیک، تاثیر مستقیمی روی سرعت و عملکرد سیستم دارد.
API مانند یک پل ارتباطی بین اپلیکیشن موبایل و Backend عمل می کند.
برای مثال زمانی که کاربر وارد اپلیکیشن می شود:
اپلیکیشن درخواست اطلاعات حساب کاربری را ارسال می کند.
↓
API درخواست را دریافت می کند.
↓
Backend اطلاعات را پردازش می کند.
↓
نتیجه به اپلیکیشن برمی گردد.
بسیاری از مشکلات اپلیکیشن ها زمانی ظاهر می شوند که محصول رشد می کند.
در مراحل اولیه شاید همه چیز خوب کار کند، اما با افزایش کاربران مشکلاتی مانند موارد زیر ایجاد می شود:
برای مثال یک اپلیکیشن سفارش غذا را تصور کنید. در ابتدای کار شاید روزانه چند صد سفارش داشته باشد و یک ساختار ساده پاسخگو باشد. اما بعد از رشد کسب وکار، سیستم باید همزمان موارد زیر را مدیریت کند:
در این مرحله معماری اولیه اهمیت خود را نشان می دهد.

سه مدل معماری رایج در توسعه اپلیکیشن های مدرن عبارت اند از:
هیچ کدام از این معماری ها به صورت مطلق بهتر از دیگری نیستند. انتخاب مناسب به شرایط پروژه بستگی دارد.

Monolithic Architecture یا معماری یکپارچه، مدلی است که در آن تمام بخش های اصلی سیستم در یک پروژه واحد قرار می گیرند.
در این معماری:
همگی در یک ساختار مشترک توسعه داده می شوند.
برای مثال یک فروشگاه اینترنتی کوچک را در نظر بگیرید.
نسخه اول اپلیکیشن شامل:
است.
در معماری Monolithic، تمام این قابلیت ها در یک سیستم واحد قرار دارند.
فرض کنید یک برند تولیدکننده پوشاک قصد دارد اپلیکیشن فروش خود را راه اندازی کند.
در شروع:
در این شرایط Monolithic می تواند انتخاب مناسبی باشد.
مزایا:
اما مشکل زمانی شروع می شود که کسب وکار رشد کند.
مثلاً بعد از چند سال امکاناتی مانند:
به اپلیکیشن اضافه شود.
در این حالت، وابستگی بخش ها به یکدیگر افزایش پیدا می کند و توسعه سیستم سخت تر می شود.

با وجود اینکه معماری Monolithic برای بسیاری از پروژه ها انتخاب مناسبی است، اما با رشد محصول می تواند به یک محدودیت جدی تبدیل شود.
مهم ترین چالش های این معماری عبارت اند از:
در یک سیستم یکپارچه، بخش های مختلف معمولاً ارتباط نزدیکی با هم دارند.
برای مثال در یک اپلیکیشن فروشگاهی، اگر سیستم تخفیف ها، سفارش ها و پرداخت همگی در یک ساختار واحد قرار داشته باشند، تغییر در یکی از این بخش ها ممکن است روی بخش های دیگر تاثیر بگذارد.
فرض کنید یک تیم توسعه روی اپلیکیشنی کار می کند که چند سال از عمر آن گذشته و صدها هزار خط کد دارد.
در این شرایط اضافه کردن یک قابلیت جدید ممکن است نیازمند بررسی بخش های مختلف سیستم باشد.
نتیجه:
در معماری Monolithic معمولاً کل سیستم باید با هم Scale شود.
برای مثال اگر فقط بخش جستجوی محصولات در یک فروشگاه پرترافیک نیاز به منابع بیشتری داشته باشد، ممکن است مجبور شوید کل اپلیکیشن را روی سرورهای قوی تر اجرا کنید.
در حالی که شاید فقط یک بخش خاص نیاز به افزایش ظرفیت داشته باشد.

Microservices Architecture یا معماری مایکروسرویس، روشی برای طراحی نرم افزار است که در آن یک سیستم بزرگ به مجموعه ای از سرویس های کوچک تر و مستقل تقسیم می شود.
در این معماری، هر سرویس مسئول انجام یک وظیفه مشخص است و می تواند به صورت مستقل توسعه، تست و مدیریت شود.
برای مثال در یک اپلیکیشن Marketplace چند فروشنده، معماری می تواند شامل سرویس های زیر باشد:
هرکدام از این بخش ها مانند یک سیستم مستقل عمل می کنند، اما از طریق API با یکدیگر ارتباط دارند.
برای درک بهتر، یک پلتفرم فروشگاهی چند فروشنده را تصور کنید.
در چنین سیستمی، هزاران فروشنده ممکن است محصولات خود را ثبت کنند و کاربران همزمان در حال:
باشند.
در این شرایط، همه بخش های سیستم نیاز یکسانی ندارند.
مثلاً:
در یک مارکت پلیس بزرگ، کاربران ممکن است در هر لحظه هزاران درخواست جستجو ارسال کنند.
پس این سرویس باید بتواند جداگانه توسعه پیدا کند و منابع بیشتری دریافت کند.
ثبت سفارش یکی از حساس ترین بخش های سیستم است.
این سرویس باید:
جدا بودن این سرویس باعث می شود تغییرات بخش سفارش، سایر قسمت های اپلیکیشن را مختل نکند.
سیستم های پیشنهاد کالا معمولاً دائماً در حال بهبود هستند.
برای مثال:
می توانند به صورت یک سرویس مستقل توسعه پیدا کنند.

یکی از بزرگ ترین مزایای Microservices این است که هر بخش می تواند جداگانه توسعه پیدا کند.
برای مثال در یک اپلیکیشن حمل ونقل آنلاین:
در ساعات پرترافیک، سرویس موقعیت مکانی و درخواست سفر فشار زیادی تحمل می کنند.
با Microservices می توان فقط همین بخش ها را تقویت کرد، نه کل سیستم را.
در پروژه های بزرگ معمولاً چند تیم همزمان روی محصول کار می کنند.
برای مثال:
می توانند روی سرویس های مستقل فعالیت کنند.
در معماری Microservices، خرابی یک سرویس لزوماً باعث از کار افتادن کل سیستم نمی شود.
برای مثال اگر سرویس پیشنهاد محصولات دچار مشکل شود، کاربران همچنان می توانند:

با وجود مزایای زیاد، Microservices برای همه پروژه ها مناسب نیست.
در یک سیستم Monolithic ممکن است با یک برنامه اصلی سروکار داشته باشید.
اما در Microservices تعداد زیادی سرویس وجود دارد که باید مدیریت شوند.
مواردی مانند:
اهمیت زیادی پیدا می کنند.
اجرای صحیح Microservices معمولاً نیازمند دانش در حوزه های زیر است:
به همین دلیل انتخاب این معماری بدون داشتن زیرساخت مناسب می تواند باعث افزایش هزینه شود.

Serverless Architecture یا معماری بدون سرور، مدلی است که در آن مدیریت زیرساخت سرورها بر عهده ارائه دهنده سرویس ابری قرار می گیرد.
در این مدل، توسعه دهنده به جای مدیریت مستقیم سرور، روی توسعه قابلیت های نرم افزار تمرکز می کند.
البته Serverless به معنی نبود سرور نیست؛ بلکه یعنی تیم توسعه نیازی به مدیریت مستقیم سرورها ندارد.
نمونه سرویس های Serverless:
در معماری سنتی، معمولاً یک سرور همیشه فعال دارید.
اما در Serverless، اجرای کد معمولاً با یک Event اتفاق می افتد.
برای مثال در یک اپلیکیشن فروشگاهی:
کاربر یک تصویر محصول جدید آپلود می کند.
↓
سیستم یک Event ایجاد می کند.
↓
Function مربوط به پردازش تصویر اجرا می شود.
↓
تصویر:
↓
پس از پایان عملیات، منابع آزاد می شوند.
فرض کنید یک Marketplace روزانه هزاران تصویر محصول از فروشندگان دریافت می کند.
اگر برای این کار همیشه یک سرور قدرتمند فعال نگه داشته شود، هزینه زیرساخت افزایش پیدا می کند.
اما با Serverless می توان فقط زمانی که تصویر جدیدی آپلود می شود، عملیات پردازش را اجرا کرد.
این معماری برای بخش هایی مانند:
می تواند بسیار کاربردی باشد.

در بسیاری از مدل های Serverless، هزینه بر اساس میزان استفاده محاسبه می شود.
این ویژگی برای سرویس هایی که ترافیک ثابت ندارند، مفید است.
اگر تعداد درخواست ها افزایش پیدا کند، سرویس می تواند منابع بیشتری اختصاص دهد.
این موضوع برای کمپین های فروش، جشنواره ها و افزایش ناگهانی کاربران کاربردی است.
تیم توسعه کمتر درگیر موارد زیر می شود:

یکی از چالش های Serverless، زمان اولیه اجرای Functionهایی است که مدتی استفاده نشده اند.
در برخی کاربردهای حساس به سرعت، این موضوع باید مدیریت شود.
استفاده گسترده از سرویس های یک Cloud Provider می تواند مهاجرت به زیرساخت دیگر را دشوار کند.
برخی Functionهای Serverless برای پردازش های بسیار سنگین یا طولانی مناسب نیستند.
یکی از سوال های رایج کسب وکارها این است:
اگر بخواهیم یک اپلیکیشن بزرگ مشابه نمونه های موفق بازار بسازیم، آیا باید از ابتدا Microservices استفاده کنیم؟
پاسخ همیشه مثبت نیست.
معماری باید بر اساس مرحله رشد محصول انتخاب شود.
در نسخه اولیه یک اپلیکیشن، هدف اصلی بررسی بازار و دریافت بازخورد کاربران است.
در این مرحله معمولاً:
اهمیت بیشتری از پیچیدگی معماری دارد.
بنابراین یک معماری ساده و قابل توسعه می تواند انتخاب مناسبی باشد.
وقتی تعداد کاربران افزایش پیدا می کند و قابلیت های بیشتری اضافه می شود، ممکن است بخش هایی از سیستم نیازمند جداسازی شوند.
برای مثال در یک اپلیکیشن مشابه اسنپ:
می توانند به سرویس های مستقل تبدیل شوند.
در یک پلتفرم بزرگ با:
معماری Microservices یا ترکیبی از معماری ها می تواند انتخاب مناسب تری باشد.
| معیار | Monolithic | Microservices | Serverless |
| ساختار | یک سیستم یکپارچه | چند سرویس مستقل | Functionهای مستقل |
| سرعت توسعه اولیه | بسیار بالا | متوسط | بالا |
| هزینه شروع | کم | زیاد | متغیر |
| مقیاس پذیری | محدودتر | بسیار بالا | خودکار |
| مدیریت زیرساخت | ساده | پیچیده | ساده تر |
| مناسب برای | MVP و پروژه کوچک | سیستم های بزرگ | پردازش های Event محور |
| نیاز به DevOps | کم | زیاد | متوسط |
انتخاب معماری باید بر اساس شرایط واقعی پروژه انجام شود:
| نوع پروژه | معماری پیشنهادی |
| اپلیکیشن ساده فروشگاهی | Monolithic |
| MVP استارتاپی | Monolithic قابل توسعه |
| اپلیکیشن در حال رشد | Modular Monolith یا Hybrid |
| Marketplace چند فروشنده | Microservices یا Hybrid |
| اپلیکیشن پرترافیک حمل ونقل | Microservices |
| پردازش تصویر و وظایف پس زمینه | Serverless |
| اپلیکیشن سازمانی | Modular Architecture |
یکی از اشتباهات رایج در پروژه های نرم افزاری این است که کسب وکارها تصور می کنند پیچیده ترین معماری همیشه بهترین انتخاب است.
برای مثال یک استارتاپ تازه تاسیس ممکن است از ابتدا سراغ Microservices برود، در حالی که هنوز مدل کسب وکار خود را اعتبارسنجی نکرده است.
این تصمیم می تواند:
از طرف دیگر، ساخت یک پلتفرم بزرگ بدون توجه به آینده نیز باعث محدودیت های جدی در زمان رشد خواهد شد.
معماری مناسب باید با این موارد هماهنگ باشد:
طراحی یک اپلیکیشن حرفه ای فقط به ساخت رابط کاربری و پیاده سازی چند قابلیت محدود نمی شود.
انتخاب معماری مناسب، تکنولوژی توسعه، ساختار Backend، امنیت، مقیاس پذیری و مسیر توسعه آینده، همگی روی موفقیت محصول تاثیر دارند.
تیم کیان تجارت با تجربه طراحی و توسعه اپلیکیشن های موبایل، می تواند در انتخاب معماری مناسب برای پروژه های مختلف؛ از MVPهای اولیه تا پلتفرم های بزرگ و چندسرویسی، به کسب وکارها کمک کند.
یک معماری درست در ابتدای مسیر، می تواند هزینه های توسعه آینده را کاهش دهد و مسیر رشد اپلیکیشن را هموار کند.
پرسش و پاسخ
پرسش مورد نظر خود را مطرح نمایید