Monolith vs Microservices
- ●Monolith মানে পুরো application একটাই deployable unit — সব feature এক code base, এক process-এ।
- ●Microservices মানে application-কে অনেক ছোট স্বাধীন service-এ ভাগ করা, প্রত্যেকে আলাদা deploy ও scale হয়।
- ●Monolith ছোট দল ও শুরুতে সহজ; Microservices বড় দল ও বিপুল scale-এ ভালো, কিন্তু distributed জটিলতা আনে।
সমস্যাটা কী?
তুমি একটা বড় application বানাচ্ছ — ধরো একটা e-commerce platform। এতে আছে user account, product catalog, cart, payment, shipping, notification — অনেক আলাদা feature।
এই সব feature কীভাবে সাজাবে?
- সব এক জায়গায়, এক code base, এক deployable unit — একসাথে build, একসাথে deploy। এটাই Monolith।
- প্রতিটা feature আলাদা ছোট service — user service, payment service, shipping service; প্রত্যেকে নিজে deploy ও scale হয়। এটাই Microservices।
এই সিদ্ধান্ত শুধু code নয়, পুরো দল-গঠন, deploy পদ্ধতি ও খরচ বদলে দেয়। তাই trade-off ভালো করে বোঝা দরকার।
প্রথমটা: Monolith
Monolith মানে পুরো application একটাই Deployable Unit — সব feature-এর code এক জায়গায়, একসাথে build হয়, একসাথে চলে এক process-এ, একটাই database-এ সাধারণত।
সুবিধা:
- সহজ শুরু। এক project, এক code base — নতুন ডেভেলপার দ্রুত বুঝে কাজ শুরু করতে পারে।
- সহজ deploy। একটা জিনিস build করে deploy করলেই হলো।
- সহজ debugging ও testing। সব এক জায়গায়, এক function আরেকটাকে সরাসরি call করে — কোনো network নেই।
- দ্রুত development শুরুর দিকে — কম যন্ত্রপাতি, কম জটিলতা।
অসুবিধা:
- বড় হলে ভারী হয়। code base বিশাল হলে বোঝা, build ও deploy ধীর হয়।
- পুরোটা একসাথে scale করতে হয় — শুধু payment-এ চাপ বাড়লেও পুরো app-কে scale করতে হয়।
- একটা bug পুরো app ফেলে দিতে পারে। এক feature crash করলে সব বন্ধ।
- বড় দলে অনেকে একই code-এ একসাথে কাজ করলে পরস্পরের পথে এসে দাঁড়ায়।
দ্বিতীয়টা: Microservices
Microservices মানে application-কে অনেক ছোট, স্বাধীন service-এ ভাগ করা — প্রতিটা একটা নির্দিষ্ট কাজ করে (user, payment, shipping)। প্রত্যেকের নিজের code base, প্রায়ই নিজের database, এবং প্রত্যেকে আলাদাভাবে deploy ও scale হয়। এরা পরস্পরের সাথে network (API/message) দিয়ে কথা বলে — অর্থাৎ এটি একটা Distributed System।
কোন কাজ কোন service-এ থাকবে, সেই সীমারেখাকে বলে Service Boundary — এটা ঠিকভাবে টানা microservices-এর সবচেয়ে কঠিন ও গুরুত্বপূর্ণ অংশ।
সুবিধা:
- স্বাধীন deploy। payment service আপডেট করতে পুরো app নয়, শুধু সেটাই deploy করো।
- আলাদা scaling। শুধু যে service-এ চাপ, সেটাই বেশি বানাও — সাশ্রয়ী।
- দলগত স্বাধীনতা। আলাদা দল আলাদা service-এ নিজের গতিতে কাজ করে।
- আংশিক fault isolation। একটা service পড়ে গেলে পুরো app না-ও পড়তে পারে।
অসুবিধা:
- Distributed জটিলতা। service-রা network দিয়ে কথা বলে — তাই network failure, latency, retry সামলাতে হয়।
- Monitoring ও debugging কঠিন — একটা request অনেক service ঘুরে যায়।
- Data consistency কঠিন — আলাদা database-এ data মিলিয়ে রাখা জটিল।
- বাড়তি অবকাঠামো (deployment, service discovery) — খরচ ও পরিশ্রম বেশি।
Monolith হলো এক রান্নাঘরের বড় রেস্টুরেন্ট — সব রাঁধুনি এক জায়গায়, সমন্বয় সহজ, সবাই সবার পাশে। কিন্তু রান্নাঘরে আগুন লাগলে পুরো রেস্টুরেন্ট বন্ধ, আর শুধু বিরিয়ানির চাহিদা বাড়লেও পুরো রান্নাঘর বড় করতে হয়।
Microservices হলো ফুড কোর্ট — আলাদা আলাদা দোকান (বিরিয়ানি, পিৎজা, জুস)। একটা দোকান বন্ধ হলে বাকিরা চলে, বিরিয়ানির ভিড় হলে শুধু সেই দোকানে লোক বাড়াও। কিন্তু এখন অনেক দোকান সামলানো, সবার মধ্যে সমন্বয় ও একটা সাধারণ ব্যবস্থাপনা দরকার — অনেক বেশি ঝক্কি।
পাশাপাশি তুলনা
| বিষয় | Monolith | Microservices |
|---|---|---|
| গঠন | এক deployable unit | অনেক স্বাধীন service |
| Deploy | একসাথে সব | আলাদা আলাদা |
| Scaling | পুরোটা একসাথে | service-ভিত্তিক |
| Fault isolation | দুর্বল | তুলনামূলক ভালো |
| জটিলতা | কম | বেশি (distributed) |
| Debugging | সহজ | কঠিন |
| উপযুক্ত দল | ছোট দল | বড়, একাধিক দল |
| শুরুর গতি | দ্রুত | ধীর |
কখন কোনটা বেছে নেবে
- Monolith দিয়ে শুরু করো — ছোট দল, নতুন product, যখন দ্রুত বাজারে আসা জরুরি আর scale এখনও বড় নয়। বেশিরভাগ startup-এর জন্য এটাই সঠিক শুরু।
- Microservices-এ যাও যখন — দল বড় ও একাধিক, কিছু অংশ আলাদাভাবে scale করা দরকার, এবং distributed system সামলানোর প্রকৌশলগত পরিপক্বতা আছে।
- জনপ্রিয় ব্যবহারিক পথ: monolith দিয়ে শুরু, ব্যথা বুঝে ধীরে ধীরে নির্দিষ্ট অংশ আলাদা service-এ বের করা।
সবচেয়ে সাধারণ ভুল: শুরুর দিনেই microservices দিয়ে শুরু করা, "কারণ বড় কোম্পানিরা তো এটাই করে।" ছোট দল ও অনিশ্চিত product-এ এতে network, deployment ও data consistency-র জটিলতা feature বানানোর গতি একদম থামিয়ে দেয়। যখন service boundary-ই এখনও পরিষ্কার নয়, তখন তাড়াহুড়ো করে ভাগ করলে পরে ভুল সীমা শোধরাতে বহুগুণ কষ্ট। আগে monolith, পরে দরকার বুঝে ভাঙো।
বাস্তব উদাহরণ
- Amazon ও Netflix শুরু করেছিল monolith দিয়ে, পরে scale ও দল বড় হওয়ায় microservices-এ গেছে — এখন Netflix-এর শত শত service।
- Shopify ইচ্ছাকৃতভাবে একটা সুসংগঠিত বড় monolith (modular monolith) বজায় রেখেছে এবং বিশাল scale সামলায় — প্রমাণ যে microservices-ই একমাত্র পথ নয়।
- Uber দ্রুত বৃদ্ধির সময় বহু microservice বানিয়েছিল, পরে অতিরিক্ত খণ্ডিতকরণের জটিলতা টের পেয়ে কিছু অংশ একত্র করার দিকে গেছে — অর্থাৎ ভারসাম্যই আসল।
Interview-তে কেউ "microservices design করো" বললে অন্ধভাবে ভাগতে শুরু কোরো না। আগে বলো: "দল ও scale ছোট হলে আমি একটা পরিচ্ছন্ন modular monolith দিয়ে শুরু করব, কারণ তা দ্রুত ও সহজ। Scale ও দল বাড়লে যে অংশে আলাদা scaling বা স্বাধীন deploy দরকার, সেটাকে আগে service হিসেবে বের করব।" — এই পরিমিত, trade-off-সচেতন উত্তরই পরিণত প্রকৌশলীর চিহ্ন।
মূল শব্দ (Key Terms)
মিনি কুইজ
1. Monolith architecture বলতে কী বোঝায়?
2. Microservices-এর সবচেয়ে বড় খরচ (downside) কোনটি?
3. কখন microservices সাধারণত উপযুক্ত নয়?