কেস স্টাডি: মনোলিথ থেকে কন্টেইনারে মাইগ্রেশন
এই পাঠে যা শিখবেন
- একটি বাস্তব মনোলিথ-টু-কন্টেইনার মাইগ্রেশনে M6-M8-এর কোন কৌশল কোথায় প্রয়োগ হয়
- স্ট্র্যাংলার-ফিগ (ইনক্রিমেন্টাল) বনাম বিগ-ব্যাং মাইগ্রেশনের ট্রেড-অফ
- মাইগ্রেশন চলাকালীন পুরনো ও নতুন সিস্টেমের মধ্যে ট্রাফিক কীভাবে রাউট করা হয়
- একটি মাইগ্রেশন প্রগ্রেস ট্র্যাকার Python-এ কীভাবে বাস্তবায়ন করা যায়
১ · কনটেক্সট — সমস্যা
একটি কাল্পনিক ই-কমার্স কোম্পানির একটি বড়, পুরনো মনোলিথিক অ্যাপ্লিকেশন আছে — একটি একক কোডবেস, একটি VM-এ চলে (L05-এর ধরন), যেখানে ইউজার অথেন্টিকেশন, প্রোডাক্ট ক্যাটালগ, চেকআউট/পেমেন্ট, ও রিপোর্টিং — সব একসাথে বান্ডল করা। প্রতিটি ছোট পরিবর্তনের জন্য পুরো অ্যাপ্লিকেশন রিবিল্ড ও রিডিপ্লয় করতে হয়, এবং স্কেল করতে হলে পুরো মনোলিথের একটি অতিরিক্ত কপি চালাতে হয় (এমনকি যদি শুধু একটি অংশে বেশি লোড থাকে) — L06-এর অটো-স্কেলিং এখানে অকার্যকর। লক্ষ্য: প্রতিটি কম্পোনেন্টকে স্বাধীনভাবে স্কেল ও ডিপ্লয় করার মতো কন্টেইনারাইজড মাইক্রোসার্ভিসে রূপান্তর করা।
২ · অ্যাপ্রোচ — কোন পাঠের কৌশল কোথায় প্রয়োগ হলো
প্রথমে অ্যাপ্লিকেশনটিকে কন্টেইনারাইজ করা হয় — প্রতিটি কম্পোনেন্টের জন্য আলাদা Dockerfile লেখা হয় (M6/L23), হার্ডকোডেড কনফিগারেশন (ডেটাবেস URL, ফিচার-ফ্ল্যাগ) সরিয়ে ConfigMap/এনভায়রনমেন্ট ভ্যারিয়েবলে বের করে আনা হয় (M7/L30, M9/L38-এর এক্সটার্নালাইজেশন নীতি) — এতে একই ইমেজ dev/staging/production-এ ভিন্ন কনফিগ নিয়ে চলতে পারে। প্রতিটি কমিটে একটি CI পাইপলাইন (M8/L33) নতুন ইমেজ বিল্ড ও স্ক্যান (M6/L26) করে — কোনো known-vulnerable প্যাকেজ পেলে পাইপলাইন ফেল-ফাস্ট থামে। প্রতিটি মাইগ্রেটেড কম্পোনেন্ট একটি Kubernetes Deployment/Service জোড়া (M7/L28-29) হিসেবে ডিপ্লয় হয়, এবং প্রতিটি কাটওভার একটি ঝুঁকিপূর্ণ এক-ধাক্কা সুইচের বদলে একটি ধীর, ক্যানারি-স্টাইল রোলআউটে হয় (M8/L37)।
৩ · মূল ট্রেড-অফ — ইনক্রিমেন্টাল বনাম বিগ-ব্যাং
বিগ-ব্যাং (একবারে পুরো অ্যাপ্লিকেশন মাইগ্রেট করা) দ্রুত মনে হতে পারে, কিন্তু ঝুঁকি বিশাল — একটি একক বড় কাটওভারে কিছু ভুল হলে পুরো সিস্টেম প্রভাবিত হয়, এবং রোলব্যাক করাও জটিল। স্ট্র্যাংলার-ফিগ পদ্ধতি — একটি জীবন্ত গাছ যেভাবে ধীরে ধীরে জড়িয়ে পুরনো কাঠামো প্রতিস্থাপন করে তার নামে — একটি কম্পোনেন্ট মাইগ্রেট করে, রাউটিং নিয়ম দিয়ে সেই একটি কম্পোনেন্টের ট্রাফিক নতুন সিস্টেমে পাঠায়, বাকি সব এখনও পুরনো মনোলিথে রেখে দেয় — পুরনো ও নতুন সিস্টেম সাময়িকভাবে সহাবস্থান করে। এটি নিরাপদ, কিন্তু বেশি সময় নেয় এবং দুটি সিস্টেম একসাথে চালানো ও সমন্বয় করার অতিরিক্ত অপারেশনাল বোঝা তৈরি করে।
৪ · কোড — স্ট্র্যাংলার-ফিগ মাইগ্রেশন ট্র্যাকার
নিচের কোডে প্রতিটি অ্যাপ্লিকেশন কম্পোনেন্টের মাইগ্রেশন স্ট্যাটাস ট্র্যাক করা হয়, এবং L14-এর পথ-ভিত্তিক রাউটিং প্যাটার্ন পুনঃব্যবহার করে প্রতিটি কম্পোনেন্টের জন্য বর্তমান রাউটিং সিদ্ধান্ত (পুরনো নাকি নতুন সিস্টেম) দেখানো হয়।
# প্রতিটি মনোলিথ কম্পোনেন্টের মাইগ্রেশন স্ট্যাটাস
components = {
"ইউজার অথেন্টিকেশন": {"migrated": True},
"প্রোডাক্ট ক্যাটালগ": {"migrated": True},
"চেকআউট/পেমেন্ট": {"migrated": False},
"রিপোর্টিং": {"migrated": False},
}
def routing_decision(component_info):
# L14-এর পথ-ভিত্তিক রাউটিং প্যাটার্নের পুনঃব্যবহার — মাইগ্রেটেড হলে নতুন সিস্টেমে, নাহলে পুরনো মনোলিথে
return "নতুন কন্টেইনারাইজড সার্ভিস (K8s)" if component_info["migrated"] else "পুরনো মনোলিথ (VM)"
def migration_progress(components):
total = len(components)
migrated = sum(1 for info in components.values() if info["migrated"])
pct = (migrated / total) * 100
return migrated, total, pct
print("=== বর্তমান রাউটিং সিদ্ধান্ত ===")
for name, info in components.items():
print(f"{name:20}-> {routing_decision(info)}")
migrated_count, total_count, pct_done = migration_progress(components)
print(f"\nমাইগ্রেশন অগ্রগতি: {migrated_count}/{total_count} কম্পোনেন্ট মাইগ্রেটেড ({pct_done:.0f}%)")
৫ · ফলাফল
দুই কম্পোনেন্ট মাইগ্রেট হওয়ার পর, অ্যাপ্লিকেশন টিম স্বাধীনভাবে প্রোডাক্ট ক্যাটালগ স্কেল করতে পারছে (উচ্চ ট্রাফিকের সময়, বাকি সিস্টেম না ছুঁয়ে) এবং প্রতিটি ছোট ক্যাটালগ ফিচার আলাদাভাবে ডিপ্লয় করতে পারছে (পুরো মনোলিথ রিবিল্ড না করে) — ঠিক যে সমস্যার সমাধানে এই মাইগ্রেশন শুরু হয়েছিল। বাকি দুটি কম্পোনেন্ট (চেকআউট, রিপোর্টিং) একই প্যাটার্নে, একটির পর একটি, আগামী কয়েক মাসে মাইগ্রেট হবে।
একটি বড় মাইগ্রেশন সবসময় একটি একক "প্রজেক্ট" নয় — এটি এই কোর্সের ইতিমধ্যে শেখা ছোট ছোট, স্বাধীনভাবে প্রমাণিত কৌশলের (Dockerfile, কনফিগ এক্সটার্নালাইজেশন, CI স্ক্যানিং, K8s ডিপ্লয়মেন্ট, ক্যানারি রোলআউট) একটি সুশৃঙ্খল, ইনক্রিমেন্টাল প্রয়োগ।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ কেন "চেকআউট/পেমেন্ট" কম্পোনেন্টটি স্ট্র্যাংলার-ফিগ মাইগ্রেশনে সবচেয়ে শেষে মাইগ্রেট করা যুক্তিসঙ্গত?
এটি সবচেয়ে বেশি রাজস্ব-সংবেদনশীল ও সবচেয়ে জটিল কম্পোনেন্ট (পেমেন্ট প্রসেসিং, ইনভেন্টরি সিঙ্ক) — এখানে কোনো বাগ সরাসরি ব্যবসায়িক ক্ষতি করে। যতক্ষণ না টিম কম-ঝুঁকিপূর্ণ কম্পোনেন্ট (অথেন্টিকেশন, ক্যাটালগ) মাইগ্রেট করে তাদের নতুন CI/CD পাইপলাইন, মনিটরিং, ও রোলব্যাক প্রক্রিয়ায় আস্থা অর্জন করে, ততক্ষণ সবচেয়ে ঝুঁকিপূর্ণ অংশ স্পর্শ না করাই বুদ্ধিমানের কাজ।
প্র ০২ পুরনো মনোলিথ ও নতুন কন্টেইনারাইজড সার্ভিস একসাথে চলাকালীন কোন অতিরিক্ত অপারেশনাল জটিলতা তৈরি হয়?
দুটি ভিন্ন ডিপ্লয়মেন্ট মডেল (VM বনাম K8s) একসাথে মনিটর ও মেইনটেইন করতে হয়, দুটি সিস্টেমের মধ্যে ডেটা সামঞ্জস্য (যদি উভয়ই একই ডেটাবেসের ভিন্ন অংশ ছোঁয়) নিশ্চিত করতে হয়, এবং রাউটার নিজেই একটি নতুন, গুরুত্বপূর্ণ সিঙ্গেল পয়েন্ট হয়ে ওঠে যা সঠিকভাবে কাজ না করলে ভুল সিস্টেমে ট্রাফিক পাঠাতে পারে — এই অস্থায়ী জটিলতাই স্ট্র্যাংলার-ফিগের প্রকৃত মূল্য, যা এর নিরাপত্তার বিনিময়ে দিতে হয়।
প্র ০৩ এই কেস স্টাডিতে CI পাইপলাইনে ইমেজ স্ক্যানিং (M6/L26) বাদ দেওয়া হলে কী ঝুঁকি তৈরি হতো?
একটি vulnerable dependency সহ একটি ইমেজ সরাসরি প্রোডাকশনে পৌঁছে যেতে পারত — বিশেষ করে যেহেতু মাইগ্রেশনের সময় প্রচুর নতুন কোড ও ডিপেন্ডেন্সি একসাথে পরিবর্তিত হচ্ছে (উচ্চ পরিবর্তনের হার = ভুল হওয়ার বেশি সুযোগ)। স্ক্যানিংকে একটি বাধ্যতামূলক, স্বয়ংক্রিয় পাইপলাইন গেট রাখা (ঐচ্ছিক না রেখে) নিশ্চিত করে মাইগ্রেশনের তাড়াহুড়োতেও এই নিরাপত্তা ধাপটি কখনো এড়িয়ে যাওয়া যাবে না।
অনুশীলন
-
পরীক্ষা করুন: উপরের কোডে "চেকআউট/পেমেন্ট"-এর
migratedমানTrue-তে পাল্টান এবং কোড আবার চালিয়ে দেখুন রাউটিং সিদ্ধান্ত ও অগ্রগতি শতাংশ কীভাবে পাল্টায়।পরিবর্তনের পর "চেকআউট/পেমেন্ট"-এর রাউটিং সিদ্ধান্ত "নতুন কন্টেইনারাইজড সার্ভিস (K8s)"-এ পাল্টে যাবে, এবং অগ্রগতি ৫০% থেকে ৭৫%-এ উঠবে (৪টির মধ্যে ৩টি মাইগ্রেটেড) — দেখাচ্ছে ট্র্যাকারটি সহজেই যেকোনো মুহূর্তের মাইগ্রেশন অবস্থা প্রতিফলিত করতে পারে।
-
চিন্তা করুন: আপনার পরিচিত কোনো মনোলিথিক অ্যাপ্লিকেশনের (বাস্তব বা কাল্পনিক) কম্পোনেন্টগুলো কোন ক্রমে মাইগ্রেট করা উচিত বলে মনে করেন, এবং কেন?
সাধারণ নীতি: সবচেয়ে কম ঝুঁকিপূর্ণ, সবচেয়ে বেশি স্বাধীন (অন্য কম্পোনেন্টের উপর কম নির্ভরশীল) কম্পোনেন্ট দিয়ে শুরু করুন — এটি টিমকে নতুন টুলচেইনে অভ্যস্ত হতে দেয় প্রকৃত ব্যবসায়িক ঝুঁকি ছাড়াই, তারপর ধীরে ধীরে বেশি জটিল/ঝুঁকিপূর্ণ কম্পোনেন্টের দিকে এগোন।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ পরের কেস স্টাডি — একটি সম্পূর্ণ CI/CD পাইপলাইন তৈরি করা — শীঘ্রই যুক্ত হবে।
- System Design & Software Architecture কোর্স সঙ্গী কোর্স মাইক্রোসার্ভিস আর্কিটেকচার প্যাটার্ন গভীরভাবে ডিজাইন করতে শিখতে দেখুন।
- Cybersecurity & Ethical Hacking কোর্স সঙ্গী কোর্স মাইগ্রেশনের সময় ইমেজ স্ক্যানিং ও সিকিউরিটি গেট আরও গভীরভাবে বুঝতে দেখুন।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity ও Cloud Computing & DevOps — সব এক জায়গায়।