<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های محمد جواد اکبری | mohammad javad akbari</title><link>https://virgool.ir/feed/@mjak</link><description>Software Developer | Java &amp; Spring Boot | Flutter&#xA;علاقه‌مند به Backend، Microservices، معماری نرم‌افزار و دنیای Cloud ☁️</description><language>fa</language><pubDate>2026-11-11 12:49:12</pubDate><image><url>https://files.virgool.ir/upload/users/4943623/avatar/VnBZK5.jpg</url><title>محمد جواد اکبری | mohammad javad akbari</title><link>https://virgool.ir/@mjak</link></image><item><title>تفاوت IaaS، PaaS و SaaS با مثال‌های واقعی</title><link>https://virgool.ir/@mjak/تفاوت-iaas-paas-و-saas-با-مثال-های-واقعی-zbmhiitczcsb</link><description>مقدمهرایانش ابری سه مدل خدمات اصلی دارد: IaaS، PaaS و SaaS. تفاوت آن‌ها در این است که چه بخشی را شما مدیریت می‌کنید و چه بخشی را ارائه‌دهنده. هرچه از IaaS به سمت SaaS می‌رویم، کنترل کمتر و سادگی بیشتر می‌شود.تشبیه ساده: پیتزا به‌عنوان سرویسIaaS: مواد اولیه و فر را اجاره می‌کنید، اما پخت، سس و تزئین با خودتان است.PaaS: خمیر و فر آماده است و فقط رویه‌ی پیتزا را خودتان انتخاب می‌کنید.SaaS: پیتزای پخته‌شده را تحویل می‌گیرید و فقط می‌خورید.IaaS (زیرساخت به‌عنوان سرویس)ارائه‌دهنده سرور مجازی، ذخیره‌سازی و شبکه را در اختیارتان می‌گذارد. سیستم‌عامل، نرم‌افزارها، امنیت و به‌روزرسانی‌ها با شماست.مثال‌های واقعی: Amazon EC2، Google Compute Engine، Microsoft Azure Virtual Machines، DigitalOcean Droplets، و در ایران سرورهای ابری ارائه‌شده توسط شرکت‌هایی مثل ابرآروان و ایران‌سرور.مناسب برای: تیم‌هایی که کنترل کامل لازم دارند، مثل راه‌اندازی دیتابیس سفارشی، زیرساخت‌های خاص یا انتقال سرورهای فیزیکی به ابر.مزیت: انعطاف و کنترل حداکثری.عیب: مدیریت و نگهداری سنگین‌تر و نیاز به تخصص DevOps.PaaS (پلتفرم به‌عنوان سرویس)ارائه‌دهنده علاوه بر زیرساخت، سیستم‌عامل، محیط اجرا و ابزارهای استقرار را هم مدیریت می‌کند. شما فقط کد و داده‌ها را می‌آورید.مثال‌های واقعی: Heroku، Google App Engine، Azure App Service، Vercel، Render، AWS Elastic Beanstalk. در دنیای وردپرس، هاست‌های مدیریت‌شده‌ای مانند WP Engine و Kinsta هم عملاً PaaS هستند، چون سرور، کش، امنیت و بکاپ را برای شما مدیریت می‌کنند.مناسب برای: توسعه‌دهندگانی که می‌خواهند به‌جای درگیری با سرور، روی کد تمرکز کنند و سریع مستقر شوند.مزیت: سرعت توسعه و مقیاس‌پذیری ساده.عیب: محدودیت در تنظیمات سطح پایین و وابستگی به پلتفرم (Vendor Lock-in).SaaS (نرم‌افزار به‌عنوان سرویس)نرم‌افزار کامل و آماده از طریق مرورگر یا اپلیکیشن ارائه می‌شود. همه‌چیز را ارائه‌دهنده مدیریت می‌کند و شما فقط استفاده می‌کنید، معمولاً با اشتراک ماهانه.مثال‌های واقعی: Gmail، Google Workspace، Microsoft 365، Slack، Zoom، Dropbox، Salesforce، Notion و WordPress.com (در مقابل WordPress خودمیزبان).مناسب برای: کاربران نهایی و کسب‌وکارهایی که فقط نتیجه می‌خواهند، بدون نگرانی از نصب و نگهداری.مزیت: راه‌اندازی فوری و بدون دغدغه فنی.عیب: کمترین امکان شخصی‌سازی و وابستگی کامل به ارائه‌دهنده.جدول مقایسهویژگیIaaSPaaSSaaSکنترل کاربربالامتوسطکممدیریت سرور و سیستم‌عاملکاربرارائه‌دهندهارائه‌دهندهمدیریت کد و اپلیکیشنکاربرکاربرارائه‌دهندهمخاطب اصلیمدیر سیستم، DevOpsتوسعه‌دهندهکاربر نهاییمثالAWS EC2HerokuGmailچطور انتخاب کنیم؟نیاز به کنترل کامل دارید؟ سراغ IaaS بروید.می‌خواهید سریع نرم‌افزار بسازید و منتشر کنید؟ PaaS گزینه‌ی بهتری است.فقط یک ابزار آماده برای کار روزمره لازم دارید؟ SaaS کافی است.در عمل، بسیاری از سازمان‌ها ترکیبی از هر سه را به کار می‌برند: مثلاً اپلیکیشن اصلی روی PaaS، دیتابیس اختصاصی روی IaaS، و ایمیل و مدیریت پروژه با SaaS.جمع‌بندیIaaS یعنی «زیرساخت را به من بده»، PaaS یعنی «بستر ساخت را به من بده» و SaaS یعنی «محصول نهایی را به من بده». انتخاب درست به تعادل میان کنترل، سرعت و هزینه‌ی نگهداری در پروژه‌ی شما بستگی دارد.</description><category>محمد جواد اکبری | mohammad javad akbari</category><author>محمد جواد اکبری | mohammad javad akbari</author><pubDate>Tue, 06 Oct 2026 07:39:22 +0330</pubDate></item><item><title>انواع Cloud چیست؟ آشنایی با Public، Private، Hybrid و مدل‌های سرویس ابری</title><link>https://virgool.ir/@mjak/انواع-cloud-چیست-آشنایی-با-public-private-hybrid-و-مدل-های-سرویس-ابری-akhtpwjswu3g</link><description>امروزه تقریباً هر توسعه‌دهنده‌ای به شکلی با Cloud Computing سروکار دارد.ممکن است یک Backend را روی یک VPS اجرا کنیم، یک Database را از یک Cloud Provider بگیریم، فایل‌ها را روی Object Storage ذخیره کنیم یا حتی بدون مدیریت هیچ سروری، یک Function را اجرا کنیم.اما وقتی درباره Cloud صحبت می‌کنیم، با چند مفهوم متفاوت روبه‌رو هستیم.مثلاً:- Public Cloud چیست؟- Private Cloud چه تفاوتی با آن دارد؟- Hybrid Cloud یعنی چه؟- IaaS و PaaS و SaaS چه هستند؟- آیا VPS همان Cloud است؟- Kubernetes جزو Cloud محسوب می‌شود؟در این مقاله می‌خواهیم این مفاهیم را از هم جدا کنیم.---Cloud Computing چیست؟به زبان ساده، Cloud Computing یعنی استفاده از منابع محاسباتی از طریق شبکه، بدون اینکه الزاماً خودمان مالک و مدیر تمام سخت‌افزار زیرساخت باشیم.این منابع می‌توانند شامل موارد مختلفی باشند:- CPU- RAM- Storage- Database- Networking- Virtual Machines- Containers- Application Services- AI Servicesمثلاً به جای اینکه یک Server فیزیکی بخریم:Your Company     │     ▼Buy Server     │     ▼Install OS     │     ▼Configure Network     │     ▼Deploy Applicationمی‌توانیم منابع موردنیازمان را از یک Cloud Provider دریافت کنیم:Your Company     │     ▼Cloud Provider     │     ├── Compute     ├── Storage     ├── Database     └── Networkالبته Cloud فقط به معنی «کامپیوتر شخص دیگری» نیست؛ سرویس‌های ابری معمولاً قابلیت‌هایی مثل Provisioning سریع، مدیریت منابع، اتوماسیون و مقیاس‌پذیری را هم فراهم می‌کنند.---Cloud چند نوع دارد؟وقتی می‌گوییم «انواع Cloud»، در واقع دو دسته‌بندی متفاوت داریم.دسته اول: بر اساس محل و نحوه مالکیت زیرساخت- Public Cloud- Private Cloud- Hybrid Cloud- Community Cloudدسته دوم: بر اساس سطح سرویسی که دریافت می‌کنیم- IaaS- PaaS- SaaS- FaaSاین دو دسته‌بندی را نباید با یکدیگر اشتباه بگیریم.مثلاً یک شرکت می‌تواند از Public Cloud استفاده کند و در آن یک سرویس IaaS دریافت کند.---1. Public Cloud چیست؟در Public Cloud زیرساخت توسط یک Cloud Provider ارائه می‌شود و منابع میان مشتریان مختلف به‌صورت کنترل‌شده و منطقی جدا می‌شوند.نمونه‌هایی از Providerهای معروف:- AWS- Microsoft Azure- Google Cloud- Oracle Cloudفرض کنید به یک سرور نیاز دارید.در Public Cloud معمولاً لازم نیست Server فیزیکی بخرید.می‌توانید یک Virtual Machine ایجاد کنید:Cloud Provider│├── VM A → Company A├── VM B → Company B├── VM C → Company C└── VM D → Company Dهر مشتری منابع و محیط خودش را دارد، در حالی که Provider زیرساخت فیزیکی را مدیریت می‌کند.مزایای Public Cloud- شروع سریع- عدم نیاز به خرید Server- دسترسی به سرویس‌های مختلف- امکان افزایش یا کاهش منابع- امکانات اتوماسیون- پرداخت بر اساس مصرف یا مدل قیمت‌گذاری سرویسمعایب- هزینه می‌تواند با افزایش مصرف زیاد شود.- وابستگی بیشتری به Provider ایجاد می‌شود.- کنترل کامل روی سخت‌افزار ندارید.- در بعضی شرایط مسائل مربوط به Location و Compliance اهمیت پیدا می‌کند.---2. Private Cloud چیست؟در Private Cloud، زیرساخت ابری برای یک سازمان یا مجموعه مشخص اختصاص داده می‌شود.ممکن است این زیرساخت در دیتاسنتر خود سازمان یا در یک دیتاسنتر دیگر قرار داشته باشد.مثلاً:Company   │   ▼Private Cloud   │   ├── Compute   ├── Storage   ├── Network   └── Virtual Machinesبرای ساخت Private Cloud می‌توان از تکنولوژی‌هایی مانند OpenStack یا VMware و راهکارهای دیگر استفاده کرد.البته Private Cloud صرفاً به این معنی نیست که «یک Server در شرکت داریم».Cloud بودن معمولاً به قابلیت‌هایی مثل Resource Pooling، Provisioning، Automation و مدیریت سرویس‌ها مربوط می‌شود.مزایا- کنترل بیشتر- امکان تنظیم دقیق زیرساخت- کنترل بیشتر روی محل نگهداری داده- امکان تطبیق با بعضی نیازهای امنیتی و سازمانیمعایب- هزینه اولیه بالاتر- نیاز به تیم زیرساخت- مسئولیت بیشتر در نگهداری- پیچیدگی عملیاتی بیشتر---3. Hybrid Cloud چیست؟Hybrid Cloud ترکیبی از Private و Public Cloud است.مثلاً یک شرکت ممکن است اطلاعات یا سیستم‌های خاصی را در زیرساخت Private نگه دارد، اما برای بعضی Workloadها از Public Cloud استفاده کند.             ┌───────────────┐             │ Private Cloud │             └───────┬───────┘                     │                  Network                     │             ┌───────▼───────┐             │ Public Cloud  │             └───────────────┘برای مثال:Sensitive Data      ↓Private InfrastructureWeb Application      ↓Public Cloudالبته طراحی Hybrid Cloud می‌تواند بسیار پیچیده‌تر از این مثال ساده باشد.چرا از Hybrid استفاده کنیم؟گاهی یک سازمان نمی‌خواهد یا نمی‌تواند همه چیز را به Public Cloud منتقل کند.در عین حال ممکن است بخواهد از قابلیت‌های Cloud Providerها برای بخش‌هایی از سیستم استفاده کند.Hybrid Cloud می‌تواند در چنین شرایطی مطرح شود.---4. Multi-Cloud چیست؟Multi-Cloud کمی متفاوت است.در Multi-Cloud، سازمان از چند Cloud Provider استفاده می‌کند.مثلاً:Application   │   ├── AWS   ├── Azure   └── Google Cloudدلیل این کار می‌تواند متفاوت باشد:- استفاده از سرویس خاص هر Provider- نیازهای جغرافیایی- کاهش وابستگی به یک Provider- نیازهای سازمانی- استفاده از زیرساخت‌های موجوداما Multi-Cloud هم پیچیدگی خودش را دارد.مدیریت چند Provider یعنی معمولاً باید با:- IAMهای مختلف- Networkهای مختلف- Billingهای مختلف- Monitoringهای مختلف- APIهای مختلفکار کنید.بنابراین Multi-Cloud الزاماً ساده‌تر یا ارزان‌تر نیست.---حالا برویم سراغ IaaS، PaaS و SaaSتا اینجا درباره نوع Cloud بر اساس مدل استقرار صحبت کردیم.حالا سؤال دیگری داریم:چه مقدار از زیرساخت را خودمان مدیریت می‌کنیم؟اینجا با مفهوم‌های IaaS، PaaS و SaaS مواجه می‌شویم.---IaaS چیست؟IaaS مخفف:Infrastructure as a Serviceاست.در IaaS معمولاً منابع زیرساختی مثل:- VM- Storage- Networkرا دریافت می‌کنیم.مثلاً:Cloud Provider      ↓Virtual Machine      ↓Operating System      ↓Your Applicationدر این مدل، Provider سخت‌افزار فیزیکی و زیرساخت پایه را مدیریت می‌کند، اما بخش زیادی از مدیریت نرم‌افزار با خود شماست.مثلاً ممکن است خودتان مسئول این موارد باشید:- نصب و مدیریت OS- نصب Application- تنظیم Firewall- Deployment- بعضی تنظیمات Network- Monitoring---PaaS چیست؟PaaS مخفف:Platform as a Serviceاست.در PaaS، Provider بخش بیشتری از زیرساخت و Platform را مدیریت می‌کند.در نتیجه شما بیشتر روی Application تمرکز می‌کنید.به‌صورت ساده:You │ └── ApplicationProvider ├── Runtime ├── OS ├── Infrastructure └── Hardwareمثلاً به جای اینکه خودمان Server بسازیم و Runtime را نصب کنیم، Application را به یک Platform می‌دهیم و Platform آن را اجرا می‌کند.این مدل می‌تواند فرآیند Deployment را ساده‌تر کند.---SaaS چیست؟SaaS مخفف:Software as a Serviceاست.اینجا دیگر معمولاً قرار نیست Application را خودمان Deploy و مدیریت کنیم.فقط از Software استفاده می‌کنیم.مثلاً:You │ ▼Software │ ▼Cloud Providerنمونه‌های SaaS می‌توانند شامل ابزارهای مختلفی برای:- Email- Project Management- Collaboration- CRM- Office Softwareباشند.در این مدل، کاربر بیشتر با خود Application سروکار دارد تا زیرساخت پشت آن.---FaaS چیست؟FaaS مخفف:Function as a Serviceاست و معمولاً با مفهوم Serverless ارتباط دارد.در این مدل می‌توانیم یک Function را تعریف کنیم که در زمان مشخصی اجرا شود.مثلاً:public void processOrder(Order order) {    // process order}Provider مسئول اجرای Infrastructure موردنیاز برای اجرای Function است.در معماری Serverless معمولاً شما بیشتر روی Logic تمرکز می‌کنید و Provider بخش زیادی از زیرساخت اجرای آن را مدیریت می‌کند.---مسئولیت‌ها در این مدل‌هابرای درک بهتر، می‌توانیم تقریباً این‌طور تصور کنیم:              IaaS      PaaS      SaaS-----------------------------------------Application    YOU       YOU       ProviderRuntime        YOU       Provider  ProviderOS             YOU       Provider  ProviderInfrastructure Provider  Provider  ProviderHardware       Provider  Provider  Providerهرچه از IaaS به سمت SaaS می‌رویم، مسئولیت بیشتری به Provider منتقل می‌شود.در مقابل، کنترل مستقیم ما روی زیرساخت کمتر می‌شود.---Cloud و Virtual Machine یکی هستند؟خیر.یک VM می‌تواند یکی از اجزای Cloud باشد، اما Cloud مفهوم بزرگ‌تری است.مثلاً:Cloud│├── Virtual Machines├── Containers├── Databases├── Object Storage├── Load Balancers├── Queues├── Functions└── Monitoringبنابراین Cloud را نباید فقط با VM یا VPS یکی بدانیم.---VPS هم Cloud است؟بستگی دارد.VPS یک Virtual Private Server است و می‌تواند روی زیرساخت Cloud ارائه شود، اما صرف اینکه یک VPS داریم الزاماً به معنی استفاده از تمام قابلیت‌های Cloud Computing نیست.مثلاً ممکن است یک Provider فقط یک VM با IP عمومی و مقدار مشخصی RAM و CPU در اختیار شما قرار دهد.در این حالت شما بیشتر با یک Server مجازی سروکار دارید.در Cloudهای بزرگ، معمولاً سرویس‌ها و قابلیت‌های بسیار بیشتری در اختیار شما قرار می‌گیرد.---کدام مدل برای چه پروژه‌ای مناسب است؟هیچ جواب واحدی وجود ندارد.برای یک پروژه کوچک ممکن است یک VM ساده کاملاً کافی باشد.برای یک Startup ممکن است ترکیبی از VM، Managed Database و Object Storage استفاده شود.برای یک سازمان بزرگ ممکن است Hybrid Cloud یا Multi-Cloud مطرح شود.و برای یک Application خاص، Serverless یا PaaS می‌تواند گزینه‌ای مناسب برای بررسی باشد.مهم این است که قبل از انتخاب تکنولوژی بپرسیم:«من دقیقاً چه چیزی را می‌خواهم مدیریت کنم و چه چیزی را می‌خواهم به Provider بسپارم؟»---یک مثال واقعیفرض کنید می‌خواهیم یک فروشگاه اینترنتی بسازیم.می‌توانیم آن را روی یک VM اجرا کنیم:Internet   ↓VM   ├── Backend   ├── Database   └── Nginxاین ساده است، اما مسئولیت زیادی بر عهده خودمان است.یا می‌توانیم از سرویس‌های Managed استفاده کنیم:Internet   ↓Load Balancer   ↓Application Platform   ↓Managed Database   ↓Object Storageدر این حالت Provider بخش بیشتری از زیرساخت را مدیریت می‌کند.هیچ‌کدام ذاتاً برای همه پروژه‌ها بهترین انتخاب نیستند.---جمع‌بندیوقتی درباره Cloud صحبت می‌کنیم، بهتر است دو سؤال متفاوت را از هم جدا کنیم.سؤال اول: زیرساخت کجا و چگونه ارائه می‌شود؟PublicPrivateHybridMulti-Cloudسؤال دوم: چه مقدار از زیرساخت را مدیریت می‌کنیم؟IaaSPaaSSaaSFaaSاین دو دسته‌بندی مکمل یکدیگر هستند.برای مثال می‌توانیم یک سرویس در Public Cloud داشته باشیم که به شکل IaaS ارائه شده باشد.یا از یک سرویس PaaS در یک Public Cloud استفاده کنیم.در نهایت، Cloud قرار نیست فقط تکنولوژی بیشتری به پروژه اضافه کند.هدف اصلی این است که بتوانیم منابع محاسباتی و سرویس‌های موردنیاز را با سطح مناسبی از کنترل، انعطاف‌پذیری، هزینه و مسئولیت عملیاتی دریافت کنیم.و شاید مهم‌ترین نکته این باشد:«Cloud یعنی انتخاب اینکه چه مقدار از زیرساخت را خودمان مدیریت کنیم و چه مقدار را به یک Provider بسپاریم.»</description><category>محمد جواد اکبری | mohammad javad akbari</category><author>محمد جواد اکبری | mohammad javad akbari</author><pubDate>Fri, 25 Sep 2026 00:12:08 +0330</pubDate></item><item><title>WebFlux در Spring Boot چیست و چه زمانی به درد می‌خورد؟</title><link>https://virgool.ir/@mjak/webflux-در-spring-boot-چیست-و-چه-زمانی-به-درد-می-خورد-plnzoj8iytuk</link><description>اگر با Spring Boot کار کرده باشید، احتمالاً اسم Spring WebFlux را شنیده‌اید.خیلی وقت‌ها WebFlux به عنوان نسخه «سریع‌تر» یا «مدرن‌تر» Spring MVC معرفی می‌شود.اما این توضیح کامل نیست.WebFlux قرار نیست به‌صورت جادویی هر برنامه Spring Boot را سریع‌تر کند.WebFlux بیشتر درباره‌ی مدل پردازش درخواست‌ها و I/O غیرهمزمان و Non-Blocking است.در این مقاله می‌خواهیم ببینیم WebFlux چیست، چه تفاوتی با Spring MVC دارد و مهم‌تر از همه، چه زمانی استفاده از آن منطقی است؟اول از همه: WebFlux چیست؟Spring WebFlux یک Web Framework در اکوسیستم Spring است که برای ساخت Applicationهای Reactive و Non-Blocking طراحی شده است.در Spring MVC معمولاً با یک مدل Blocking مواجه هستیم.مثلاً:@GetMapping(&#34;/users&#34;)&#xA;public User getUser() {&#xA;    return userService.getUser();&#xA;}&#xA;اگر getUser() برای دریافت اطلاعات از Database یا یک API خارجی مجبور شود منتظر بماند، Thread مربوط به Request تا پایان عملیات منتظر می‌ماند.در WebFlux هدف این است که Thread را هنگام انتظار برای I/O بی‌دلیل Block نکنیم.برای مثال:@GetMapping(&#34;/users&#34;)&#xA;public Mono&lt;User&gt; getUser() {&#xA;    return userService.getUser();&#xA;}&#xA;در اینجا Mono&lt;User&gt; نشان می‌دهد که نتیجه در آینده تولید خواهد شد.Mono و Flux چیستند؟اگر WebFlux را یاد بگیرید، تقریباً بلافاصله با دو مفهوم مهم مواجه می‌شوید:MonoMono&lt;T&gt; می‌تواند صفر یا یک مقدار را در آینده تولید کند.مثلاً:Mono&lt;User&gt;&#xA;یعنی ممکن است یک User داشته باشیم یا نداشته باشیم.FluxFlux&lt;T&gt; می‌تواند صفر تا تعداد زیادی مقدار را به‌صورت Reactive منتشر کند.مثلاً:Flux&lt;User&gt;&#xA;یعنی می‌توانیم مجموعه‌ای از Userها را دریافت کنیم.به شکل ساده:Mono  →  0..1 value&#xA;&#xA;Flux  →  0..N values&#xA;Blocking و Non-Blocking یعنی چه؟فرض کنید Application شما باید اطلاعاتی را از یک API خارجی دریافت کند.در مدل Blocking:Request&#xA;   ↓&#xA;Thread&#xA;   ↓&#xA;Call API&#xA;   ↓&#xA;WAIT...&#xA;   ↓&#xA;Response&#xA;   ↓&#xA;Continue&#xA;Thread در زمان انتظار عملاً منتظر نتیجه می‌ماند.اما در مدل Non-Blocking:Request&#xA;   ↓&#xA;Start API Call&#xA;   ↓&#xA;Thread آزاد می‌شود&#xA;   ↓&#xA;Other Work&#xA;   ↓&#xA;API Response&#xA;   ↓&#xA;Continue Pipeline&#xA;ایده این است که Threadها کمتر صرف انتظار برای I/O شوند.این موضوع مخصوصاً در سیستم‌هایی که تعداد زیادی عملیات I/O همزمان دارند می‌تواند اهمیت پیدا کند.آیا WebFlux یعنی Thread نداریم؟نه.این یک تصور اشتباه است.WebFlux همچنان از Thread استفاده می‌کند.تفاوت اصلی در نحوه مدیریت عملیات I/O و مدل اجرای Reactive است.هدف این نیست که Thread را حذف کنیم.هدف این است که هنگام انتظار برای I/O، Thread را بی‌دلیل Block نکنیم.یک مثال سادهفرض کنید API ما باید اطلاعات یک User را بگیرد و بعد اطلاعات سفارش‌های او را از یک سرویس دیگر دریافت کند.در یک مدل Blocking ممکن است چیزی شبیه این داشته باشیم:User user = userService.getUser(id);&#xA;&#xA;Orders orders = orderService.getOrders(user.getId());&#xA;&#xA;return new UserResponse(user, orders);&#xA;هر عملیات می‌تواند Thread را منتظر نگه دارد.در WebFlux می‌توانیم این عملیات را در یک Reactive Pipeline قرار دهیم:return userService.getUser(id)&#xA;        .flatMap(user -&gt;&#xA;            orderService.getOrders(user.getId())&#xA;                .collectList()&#xA;                .map(orders -&gt;&#xA;                    new UserResponse(user, orders)&#xA;                )&#xA;        );&#xA;اینجا به جای اینکه نتیجه را به شکل مستقیم و Blocking دریافت کنیم، یک Pipeline از عملیات Reactive می‌سازیم.WebFlux کجا واقعاً مفید است؟WebFlux معمولاً زمانی جذاب‌تر می‌شود که Application شما تعداد زیادی عملیات I/O همزمان داشته باشد.مثلاً:۱. API GatewayGateway ممکن است همزمان با چندین سرویس ارتباط داشته باشد.             ┌── User Service&#xA;             │&#xA;Client → API Gateway ── Product Service&#xA;             │&#xA;             └── Order Service&#xA;در چنین شرایطی Non-Blocking I/O می‌تواند مفید باشد.۲. ارتباط با سرویس‌های خارجیفرض کنید Application شما دائماً با چند API خارجی ارتباط دارد:Your Service&#xA;     │&#xA;     ├── Payment API&#xA;     ├── SMS API&#xA;     ├── Email API&#xA;     └── Shipping API&#xA;اگر تعداد زیادی Request همزمان داشته باشید، مدیریت کارآمد I/O می‌تواند اهمیت پیدا کند.۳. سیستم‌هایی با تعداد Connection زیادWebFlux می‌تواند برای سیستم‌هایی که Connectionهای همزمان زیادی دارند مناسب باشد.برای مثال:StreamingServer-Sent EventsReal-time applicationsبعضی WebSocket workloadsAPIهای با I/O زیاددر چنین سناریوهایی مدل Reactive می‌تواند مزیت داشته باشد.آیا WebFlux همیشه سریع‌تر است؟خیر.این یکی از مهم‌ترین نکاتی است که باید درباره WebFlux بدانیم.سرعت Application فقط به Framework بستگی ندارد.موارد زیادی تأثیر دارند:DatabaseNetworkCPUالگوریتم‌هامعماریتعداد Requestهانحوه استفاده از ThreadهاExternal ServicesCachingبنابراین نمی‌توان گفت:WebFlux سریع است، پس همیشه بهتر است.ممکن است برای یک Application ساده، Spring MVC عملکرد بسیار خوبی داشته باشد و WebFlux حتی پیچیدگی بیشتری ایجاد کند.یکی از مهم‌ترین نکات: Databaseاینجا جایی است که خیلی از پروژه‌ها دچار مشکل می‌شوند.فرض کنید Application شما کاملاً Reactive نوشته شده:Controller&#xA;   ↓&#xA;Service&#xA;   ↓&#xA;Repository&#xA;   ↓&#xA;Reactive Database&#xA;اما در وسط کار از یک Database Driver معمولی و Blocking استفاده کنید.مثلاً:WebFlux&#xA;   ↓&#xA;Blocking JDBC&#xA;   ↓&#xA;Database&#xA;در این حالت بخشی از مزیت Non-Blocking بودن را از دست می‌دهید.اگر قرار است Reactive Programming را جدی استفاده کنید، باید زنجیره I/O شما تا حد زیادی با این مدل سازگار باشد.برای Database معمولاً باید سراغ گزینه‌های Reactive مانند R2DBC یا دیتابیس‌هایی با Driver Reactive مناسب بروید.آیا می‌توانیم JDBC را با WebFlux استفاده کنیم؟از نظر فنی می‌توان Applicationی داشت که WebFlux و کد Blocking را با هم ترکیب کند.اما باید بدانیم چه اتفاقی می‌افتد.مثلاً اگر داخل مسیر اصلی Reactive خود یک عملیات Blocking انجام دهیم:return Mono.fromCallable(() -&gt; blockingRepository.findById(id));&#xA;این کار ممکن است نیازمند انتقال عملیات Blocking به Scheduler مناسب باشد.برای مثال:Mono.fromCallable(() -&gt; blockingRepository.findById(id))&#xA;    .subscribeOn(Schedulers.boundedElastic());&#xA;اما این به معنی Reactive شدن JDBC نیست.در واقع داریم عملیات Blocking را روی Thread مناسب‌تری اجرا می‌کنیم تا Event Loop را Block نکند.بنابراین:استفاده از WebFlux به‌تنهایی یک سیستم Blocking را Non-Blocking نمی‌کند.WebFlux و Spring MVC چه تفاوتی دارند؟به‌صورت خیلی ساده:ویژگی Spring MVC Spring WebFlux مدل عمدتاً Blocking Non-Blocking / Reactive Programming Model Imperative Reactive Return Type Object Mono / Flux و انواع Reactive یادگیری ساده‌تر پیچیده‌تر Debugging معمولاً ساده‌تر می‌تواند پیچیده‌تر باشد I/O همزمان زیاد مناسب می‌تواند بسیار مناسب باشد اکوسیستم Blocking بسیار گسترده نیازمند توجه بیشتر Reactive Streams محور اصلی نیست بخش اصلی معماریالبته WebFlux فقط به Mono و Flux محدود نمی‌شود و Spring امکان استفاده از مدل‌های مختلف Programming را فراهم می‌کند.یک اشتباه رایج: استفاده از WebFlux فقط به خاطر Microserviceگاهی این استدلال را می‌بینیم:«ما Microservice داریم، پس باید WebFlux استفاده کنیم.»این نتیجه‌گیری درست نیست.Microservice و Reactive Programming دو مفهوم متفاوت هستند.می‌توانیم داشته باشیم:Spring MVC + Microservices&#xA;یا:Spring WebFlux + Microservices&#xA;یا حتی:Monolith + WebFlux&#xA;این انتخاب‌ها مستقل از یکدیگرند.چه زمانی بهتر است WebFlux استفاده نکنیم؟اگر پروژه شما:کوچک است،Requestهای همزمان بسیار زیادی ندارد،بیشتر عملیات آن CPU-bound است،وابستگی زیادی به Libraryهای Blocking دارد،تیم با Reactive Programming آشنا نیست،Database شما عمدتاً Blocking است،و Spring MVC به‌راحتی نیازهای شما را برطرف می‌کند،احتمالاً دلیل محکمی برای مهاجرت به WebFlux ندارید.چون Reactive Programming پیچیدگی ذهنی جدیدی وارد پروژه می‌کند.مثلاً به جای:User user = service.getUser();&#xA;با مفاهیمی مثل:Mono&lt;User&gt;&#xA;و:flatMap()&#xA;map()&#xA;zip()&#xA;retry()&#xA;timeout()&#xA;و مفاهیم مربوط به Backpressure و Schedulerها سروکار خواهید داشت.این پیچیدگی همیشه بد نیست؛ اما باید دلیل مشخصی برای پرداخت هزینه آن داشته باشید.WebFlux را مثل یک ابزار ببینیدیکی از بهترین روش‌ها برای تصمیم‌گیری این است که WebFlux را یک Tool ببینیم، نه یک Upgrade.اگر پروژه شما چنین شکلی دارد:10 users&#xA;      ↓&#xA;Simple CRUD API&#xA;      ↓&#xA;PostgreSQL&#xA;احتمالاً استفاده از WebFlux فقط به خاطر «مدرن بودن» دلیل کافی ندارد.اما اگر با چنین سیستمی مواجه باشید:Thousands of concurrent connections&#xA;              ↓&#xA;         API Gateway&#xA;              ↓&#xA;    Multiple external APIs&#xA;              ↓&#xA;       Reactive Database&#xA;آن وقت WebFlux می‌تواند گزینه‌ای جدی برای بررسی باشد.یک قانون سادهقبل از استفاده از WebFlux از خودتان بپرسید:آیا مشکل واقعی من با Blocking I/O و تعداد زیاد عملیات همزمان است؟اگر جواب «نه» است، احتمالاً نیازی نیست فقط برای استفاده از تکنولوژی جدید سراغ WebFlux بروید.اگر جواب «بله» است، آن وقت می‌توان WebFlux را جدی‌تر بررسی کرد و با Benchmark واقعی تصمیم گرفت.جمع‌بندیSpring WebFlux یک Framework برای ساخت Applicationهای Reactive و Non-Blocking در اکوسیستم Spring است.مهم‌ترین ویژگی آن این نیست که «از Spring MVC جدیدتر است».ویژگی اصلی WebFlux این است که می‌تواند برای Workloadهایی که I/O زیاد و Connectionهای همزمان زیادی دارند، مدل مناسبی ارائه دهد.اما استفاده از آن هزینه‌هایی هم دارد:پیچیدگی بیشترنیاز به درک Reactive Programmingتوجه به Blocking Operationsنیاز به اکوسیستم Reactive مناسبDebugging متفاوتپیچیدگی بیشتر در برخی سناریوهابنابراین قبل از انتخاب WebFlux، به جای پرسیدن:«آیا WebFlux بهتر از MVC است؟»بهتر است بپرسیم:«آیا مسئله‌ای که داریم، واقعاً به مزایای WebFlux نیاز دارد؟»در مهندسی نرم‌افزار، همیشه جدیدترین ابزار، بهترین ابزار برای پروژه شما نیست.</description><category>محمد جواد اکبری | mohammad javad akbari</category><author>محمد جواد اکبری | mohammad javad akbari</author><pubDate>Thu, 24 Sep 2026 23:52:25 +0330</pubDate></item><item><title>Microservice چیست و چه زمانی نباید از آن استفاده کنیم؟</title><link>https://virgool.ir/@mjak/microservice-چیست-و-چه-زمانی-نباید-از-آن-استفاده-کنیم-vvkikglj4vwc</link><description>اگر در دنیای توسعه نرم‌افزار فعالیت کرده باشید، احتمالاً بارها عبارت Microservice Architecture را شنیده‌اید.معماری‌ای که قرار است سیستم‌های بزرگ را به بخش‌های کوچک‌تر و مستقل تقسیم کند، امکان توسعه و استقرار جداگانه سرویس‌ها را فراهم کند و مقیاس‌پذیری را ساده‌تر کند.اما یک سؤال مهم وجود دارد:آیا Microservice همیشه انتخاب بهتری است؟جواب کوتاه: نه.گاهی استفاده از Microservice به‌جای حل کردن مشکلات، پیچیدگی‌های جدیدی به پروژه اضافه می‌کند.در این مقاله می‌خواهیم ببینیم Microservice دقیقاً چیست، چه مزایایی دارد و مهم‌تر از همه، چه زمانی بهتر است سراغ آن نرویم.---Microservice چیست؟در یک معماری سنتی، ممکن است کل برنامه در قالب یک پروژه واحد ساخته شود.مثلاً فرض کنید یک فروشگاه اینترنتی داریم:E-Commerce Application│├── User├── Product├── Order├── Payment├── Notification└── Adminتمام این قسمت‌ها داخل یک Application قرار دارند.به چنین معماری‌ای معمولاً Monolithic Architecture گفته می‌شود.در معماری Microservice، همین سیستم می‌تواند به چند سرویس مستقل تقسیم شود:             ┌──────────────┐             │ User Service │             └──────┬───────┘                    │┌──────────────┐    │    ┌───────────────┐│Product       │────┼────│ Order Service ││Service       │    │    └───────┬───────┘└──────────────┘    │            │                    │      ┌─────▼──────┐                    └──────│  Payment   │                           │  Service   │                           └────────────┘هر سرویس مسئول یک بخش مشخص از سیستم است.برای مثال:User Service مسئول کاربران است.Product Service مسئول محصولات است.Order Service مسئول سفارش‌هاست.Payment Service مسئول پرداخت‌هاست.این سرویس‌ها می‌توانند به‌صورت مستقل توسعه، Deploy و Scale شوند.---چرا اصلاً از Microservice استفاده کنیم؟فرض کنید یک فروشگاه اینترنتی بسیار بزرگ داریم.بخش پرداخت ناگهان به منابع بیشتری نیاز دارد، اما بخش کاربران چنین نیازی ندارد.در یک معماری Microservice می‌توانیم فقط Payment Service را Scale کنیم.یا فرض کنید تیمی روی بخش سفارش‌ها کار می‌کند و تیم دیگری روی پرداخت.هر تیم می‌تواند روی سرویس خودش کار کند بدون اینکه الزاماً کل Application را تغییر دهد.بنابراین Microservice می‌تواند در شرایط مناسب مزایایی مثل این‌ها داشته باشد:۱. استقلال سرویس‌هاهر سرویس می‌تواند Lifecycle مستقلی داشته باشد.۲. مقیاس‌پذیری مستقلمی‌توانیم فقط سرویس‌هایی را که نیاز به منابع بیشتری دارند Scale کنیم.۳. استقلال تیم‌هاتیم‌های مختلف می‌توانند روی بخش‌های مختلف سیستم کار کنند.۴. استقرار مستقلتغییر در یک سرویس لزوماً به معنی Deploy کردن کل سیستم نیست.۵. جداسازی مسئولیت‌هاهر سرویس یک مسئولیت مشخص دارد.اما این‌ها فقط یک طرف ماجرا هستند.---مشکل از کجا شروع می‌شود؟Microservice رایگان نیست.وقتی یک Monolith را به چند سرویس تقسیم می‌کنیم، در واقع بخشی از پیچیدگی داخل کد را به زیرساخت و شبکه منتقل می‌کنیم.در یک Monolith ممکن است این اتفاق بیفتد:Order → Paymentیک Function را صدا می‌زنیم.اما در Microservice ممکن است تبدیل شود به:Order Service      │      │ HTTP / gRPC      ▼Payment Service      │      ▼Databaseحالا موضوعاتی مثل این‌ها وارد بازی می‌شوند:Network latencyService discoveryAuthenticationAuthorizationRetryTimeoutCircuit breakerLoggingDistributed tracingMessage brokerDeploymentMonitoringContainer orchestrationمدیریت خطاهای توزیع‌شدهیعنی ممکن است یک مسئله ساده، ناگهان به یک مسئله Distributed Systems تبدیل شود.---پس چه زمانی نباید از Microservice استفاده کنیم؟۱. وقتی پروژه کوچک استاگر یک تیم کوچک دارید و یک Application نسبتاً ساده می‌سازید، احتمالاً تقسیم کردن آن به ۱۰ سرویس مستقل ارزش پیچیدگی اضافه‌شده را ندارد.مثلاً:UserProductOrderPaymentNotificationاگر کل سیستم چند هزار کاربر دارد، شاید داشتن پنج Deployment، چند Database، Message Broker و سیستم Monitoring برای آن بیش از نیاز پروژه باشد.در چنین شرایطی یک Monolith خوب می‌تواند کاملاً کافی باشد.---۲. وقتی هنوز Domain را نمی‌شناسیدیکی از اشتباهات رایج این است که قبل از اینکه بفهمیم سیستم دقیقاً چگونه کار می‌کند، شروع به تقسیم کردن آن به Microservice کنیم.مثلاً از همان روز اول بگوییم:User ServiceOrder ServicePayment ServiceProduct Service...اما بعد از چند ماه متوجه شویم مرزهای بین این سرویس‌ها اشتباه بوده‌اند.در این حالت تغییر معماری می‌تواند بسیار پرهزینه شود.گاهی بهتر است ابتدا سیستم را به شکل ساده‌تری بسازیم و با شناخت بهتر Domain، مرزهای سرویس‌ها را مشخص کنیم.---۳. وقتی تیم کوچک استMicroservice معمولاً زمانی ارزش بیشتری پیدا می‌کند که تیم‌ها و مسئولیت‌ها نیز بتوانند تا حدی مستقل شوند.اگر سه برنامه‌نویس دارید و قرار است روی ۱۵ Microservice کار کنند، احتمالاً به‌جای ساده‌تر شدن پروژه، با تعداد زیادی Repository، Pipeline، Deployment و Configuration مواجه خواهید شد.به عبارت دیگر:Microservice فقط یک تصمیم معماری نیست؛ یک تصمیم سازمانی و عملیاتی هم هست.---۴. وقتی زیرساخت مناسبی نداریدفرض کنید ۲۰ سرویس دارید ولی:Monitoring مناسب ندارید.Centralized Logging ندارید.CI/CD ندارید.Distributed Tracing ندارید.مدیریت Secretها مشخص نیست.Deployment فرآیند دستی دارد.در این شرایط Debug کردن یک مشکل می‌تواند بسیار سخت شود.مثلاً کاربر می‌گوید:&gt; «پرداخت انجام نشد.»حالا باید بررسی کنید:API Gateway   ↓Order Service   ↓Payment Service   ↓Payment Provider   ↓Message Brokerمشکل دقیقاً کجاست؟بدون Observability مناسب، پیدا کردن پاسخ می‌تواند زمان زیادی ببرد.---۵. وقتی هدف اصلی شما فقط «مدرن بودن» استیکی از بدترین دلایل استفاده از Microservice این است:&gt; «چون شرکت‌های بزرگ از Microservice استفاده می‌کنند، ما هم باید استفاده کنیم.»Amazon، Netflix، Uber یا شرکت‌های بزرگ دیگر نیازهای خاص خودشان را دارند.معماری‌ای که برای یک سیستم با هزاران درخواست در ثانیه و صدها توسعه‌دهنده مناسب است، لزوماً برای یک Startup با سه نفر توسعه‌دهنده مناسب نیست.Architecture باید از نیازهای سیستم بیاید، نه از مد روز.---Monolith بد است؟نه.این یکی از سوءتفاهم‌های رایج است.Monolith می‌تواند کاملاً خوب طراحی شود.مشکل زمانی ایجاد می‌شود که Monolith به یک Big Ball of Mud تبدیل شود؛ یعنی همه چیز به همه چیز وابسته باشد و تغییر دادن یک بخش، بخش‌های زیادی را تحت تأثیر قرار دهد.یک Monolith با طراحی مناسب می‌تواند:ساده‌تر Deploy شود.ساده‌تر Debug شود.توسعه اولیه سریع‌تری داشته باشد.هزینه زیرساخت پایین‌تری داشته باشد.برای تیم‌های کوچک بسیار مناسب باشد.بنابراین انتخاب بین Monolith و Microservice، انتخاب بین «معماری خوب» و «معماری بد» نیست.---یک راه میانه: Modular Monolithبین Monolith و Microservice یک گزینه بسیار جالب وجود دارد:Modular Monolithدر این معماری Application همچنان یک Deployment است، اما کد از نظر Domain به ماژول‌های مشخص تقسیم می‌شود.مثلاً:Application│├── User Module├── Product Module├── Order Module├── Payment Module└── Notification Moduleهر ماژول مسئولیت مشخصی دارد و وابستگی‌ها کنترل می‌شوند.مزیت بزرگ این روش این است که می‌توانید ابتدا با سادگی Monolith شروع کنید و اگر در آینده واقعاً نیاز شد، بعضی از ماژول‌ها را به سرویس مستقل تبدیل کنید.مثلاً:Modular Monolith        ↓Payment Module        ↓Payment Serviceیعنی لازم نیست از روز اول همه‌چیز را Distributed کنیم.---پس چه زمانی Microservice منطقی‌تر می‌شود؟هیچ عدد جادویی مثل «وقتی به ۱ میلیون کاربر رسیدی» وجود ندارد.اما معمولاً عواملی مثل این‌ها می‌توانند نشان دهند که معماری توزیع‌شده ارزش بررسی بیشتری دارد:بخش‌های مختلف سیستم نیازهای Scaling متفاوتی دارند.تیم‌های متعدد نیاز به استقلال در توسعه و Deploy دارند.بعضی Domainها Lifecycle متفاوتی دارند.Deploy کردن کل Application به یک Bottleneck تبدیل شده است.مرزهای Domain به‌خوبی شناخته شده‌اند.سازمان زیرساخت و DevOps مناسبی دارد.هزینه پیچیدگی Distributed System قابل توجیه است.نکته مهم این است که Microservice یک هدف نیست.Microservice یک ابزار است.---قبل از انتخاب Microservice این سؤال‌ها را بپرسیدقبل از اینکه پروژه را به چندین سرویس تقسیم کنید، از خودتان بپرسید:آیا واقعاً به استقلال سرویس‌ها نیاز داریم؟آیا تیم ما توانایی مدیریت Distributed System را دارد؟آیا Scaling بخش‌های مختلف سیستم متفاوت است؟آیا مرزهای Domain را به‌خوبی می‌شناسیم؟آیا زیرساخت Monitoring و Deployment مناسبی داریم؟آیا مزایای Microservice بیشتر از پیچیدگی آن خواهد بود؟اگر جواب این سؤال‌ها مشخص نیست، شاید بهتر باشد فعلاً معماری ساده‌تری انتخاب کنید.---جمع‌بندیMicroservice می‌تواند یک راه‌حل بسیار قدرتمند برای سیستم‌های بزرگ و سازمان‌های پیچیده باشد.اما کوچک کردن سرویس‌ها لزوماً به معنی بهتر کردن سیستم نیست.گاهی اوقات چیزی که واقعاً نیاز داریم، نه ۲۰ Microservice، بلکه یک Monolith تمیز و Modular است.به نظر من یکی از مهم‌ترین اصول معماری نرم‌افزار این است:اول مسئله را حل کن، بعد معماری را پیچیده کن.**اگر یک Monolith ساده نیازهای پروژه را برطرف می‌کند، استفاده از Microservice فقط به خاطر اینکه «معماری مدرن‌تری» به نظر می‌رسد، ممکن است پیچیدگی غیرضروری ایجاد کند.معماری خوب، معماری‌ای نیست که بیشترین تکنولوژی را در خود داشته باشد؛ معماری‌ای است که با کمترین پیچیدگی، نیاز واقعی سیستم را برطرف کند.</description><category>محمد جواد اکبری | mohammad javad akbari</category><author>محمد جواد اکبری | mohammad javad akbari</author><pubDate>Thu, 24 Sep 2026 23:27:07 +0330</pubDate></item></channel></rss>