একাধিক স্বাধীন সার্ভার ও ডেটাবেস জুড়ে একটি ব্যাংকিং ট্রানজ্যাকশন সম্পন্ন করার সময় ACID নীতির অ্যাটমিসিটি (Atomicity) রক্ষা করা অত্যন্ত গুরুত্বপূর্ণ: হয় সমস্ত সার্ভারে ডেটা শতভাগ সংরক্ষিত হবে, অথবা কোনো একটি সার্ভারে সমস্যা হলে সমস্ত সার্ভার তাদের পূর্বের অবস্থায় ফিরে যাবে (Rollback)। কোনো আংশিক পরিবর্তন অবশিষ্ট রাখা চলবে না। ঐকমত্য প্রটোকল (Paxos/Raft) যেকোনো একটি নোডকে লিডার নির্বাচন করে, কিন্তু অ্যাটমিক কমিট সিস্টেমে প্রতিটি নোডের শতভাগ সর্বসম্মত সম্মতি বাধ্যতামূলক। ১৯৭৮ সালে জিম গ্রে উদ্ভাবন করেন টু-ফেজ কমিট (2PC)। তবে টু-ফেজ কমিটের মারাত্মক ব্লকিং সীমাবদ্ধতার কারণে আধুনিক ক্লাউড সিস্টেমে থ্রি-ফেজ কমিট (3PC) এবং মাইক্রোসার্ভিসের জন্য সাগা প্যাটার্ন (Saga Pattern) অপরিহার্য হয়ে উঠেছে।
১. টু-ফেজ কমিট প্রটোকল (2PC)
টু-ফেজ কমিট সিস্টেমে একজন কেন্দ্রীয় কোঅর্ডিনেটর (Coordinator) থাকে এবং বাকিরা পার্টিসিপেন্ট (Participant) হিসেবে কাজ করে। প্রক্রিয়াটি দুটি স্পষ্ট ধাপে সম্পন্ন হয়:
১. প্রিপেয়ার ফেজ (Prepare Phase)
- কোঅর্ডিনেটর সমস্ত পার্টিসিপেন্টকে `PREPARE` বার্তা পাঠায়।
- প্রতিটি পার্টিসিপেন্ট লোকাল ডেটাবেসে ট্রানজ্যাকশনটি এক্সিকিউট করে লক ধরে রাখে এবং ডিস্কের লগে লিখে নিশ্চিত করে যে তারা কমিট করতে প্রস্তুত। প্রস্তুত থাকলে তারা `YES` ভোট পাঠায়, অন্যথায় `NO` ভোট পাঠায়।
২. কমিট ফেজ (Commit Phase)
- যদি প্রতিটি পার্টিসিপেন্ট `YES` ভোট দেয়, তবে কোঅর্ডিনেটর সবাইকে `GLOBAL_COMMIT` বার্তা পাঠায় এবং ট্রানজ্যাকশন স্থায়ী হয়।
- যদি একজনও `NO` ভোট দেয় বা নেটওয়ার্কে সাড়া না দেয়, তবে কোঅর্ডিনেটর সবাইকে `GLOBAL_ABORT` বার্তা পাঠায় এবং পূর্বে করা সমস্ত সাময়িক কাজ বাতিল হয়ে যায়।
২. টু-ফেজ কমিটের মারাত্মক ত্রুটি: ব্লকিং সমস্যা
টু-ফেজ কমিট অত্যন্ত জনপ্রিয় হলেও এটি একটি ব্লকিং প্রটোকল (Blocking Protocol)। ধরা যাক, সমস্ত পার্টিসিপেন্ট `YES` ভোট দেওয়ার পর কোঅর্ডিনেটর `GLOBAL_COMMIT` সিদ্ধান্ত নিল, কিন্তু ইন্টারনেটে বার্তা পাঠানোর ঠিক পূর্ব মুহূর্তেই কোঅর্ডিনেটর সার্ভারটি পুড়ে গেল বা ক্র্যাশ করল।
এমতাবস্থায় পার্টিসিপেন্ট নোডগুলো নিজেদের ইচ্ছায় ট্রানজ্যাকশন বাতিল করতে পারে না, কারণ হয়তো কোঅর্ডিনেটর অন্য কাউকে কমিট বার্তা পাঠিয়ে ফেলেছে। আবার তারা একা একা কমিটও করতে পারে না, কারণ হয়তো অন্য কেউ নো ভোট দিয়েছিল। ফলে তারা ডেটাবেসের টেবিল ও রো লক করে অনির্দিষ্টকালের জন্য স্থবির (Blocked) হয়ে বসে থাকে, যার ফলে পুরো ক্লাউড সিস্টেম অচলাবস্থায় পড়ে যায়।
৩. থ্রি-ফেজ কমিট (3PC): ব্লকিং মুক্তির প্রয়াস
১৯৮১ সালে ডেল স্কিন প্রমাণ করেন যে ব্লকিং অবস্থা এড়াতে হলে প্রোটোকলে আরেকটি অতিরিক্ত যোগাযোগের ধাপ যুক্ত করতে হবে। তিনি উদ্ভাবন করেন থ্রি-ফেজ কমিট (3PC): Can-Commit, Pre-Commit, এবং Do-Commit। প্রি-কমিট ধাপের মাধ্যমে নোডগুলো নিশ্চিত হয় যে সবাই সম্মত হয়েছে। তবে সাধারণ ক্র্যাশ সহ্য করতে পারলেও ইন্টারনেট বা WAN নেটওয়ার্কে পার্টিশন (Split-Brain) ঘটলে থ্রি-ফেজ কমিটও ভেঙে পড়ে।
৪. সাগা প্যাটার্ন (The Saga Pattern): আধুনিক মাইক্রোসার্ভিস সমাধান
শত শত স্বাধীন মাইক্রোসার্ভিসে টু-ফেজ কমিটের মতো দীর্ঘমেয়াদী লক ধরে রাখলে ক্লাউড অ্যাপ্লিকেশনের পারফরম্যান্স ধসে পড়ে। ১৯৮৭ সালে হেক্টর গার্সিয়া-মোলিনা প্রস্তাব করেন সাগা প্যাটার্ন (Saga)।
সাগা একটি বিশাল ট্রানজ্যাকশনকে একাধিক ছোট ছোট লোকাল ট্রানজ্যাকশনে ($T_1, T_2, dots, T_n$) ভাগ করে নেয়। প্রতিটি সার্ভিস নিজের ডেটাবেসে কাজ শেষ করে সাথে সাথে কমিট করে লক মুক্ত করে দেয়। কিন্তু যাত্রাপথে যদি কোনো একটি ধাপে ($T_k$) ত্রুটি ঘটে, তবে সাগা রিভার্স অর্ডারে পূর্ববর্তী সমস্ত সার্ভিসের জন্য কমপেনসেটিং ট্রানজ্যাকশন (Compensating Transactions – $C_1, C_2, dots$) চালায়। যেমন: বিমানের টিকিট বুকিং ব্যর্থ হলে ক্রেডিট কার্ড সার্ভিসে স্বয়ংক্রিয়ভাবে রিফান্ড পাঠিয়ে দেওয়া হয়।