6 মিনিট

এরিক ব্রিউয়ারের CAP চিন্তা: কেন বিতরণকৃত সিস্টেম ট্রেডঅফ করে

এরিক ব্রিউয়ারের CAP তত্ত্বকে একটি ব্যবহারিক মানসিক মডেলে শিখুন: কীভাবে সামঞ্জস্য, প্রাপ্যতা এবং পার্টিশন বিতরণকৃত সিস্টেমে সিদ্ধান্তকে আকার দেয়।

এরিক ব্রিউয়ারের CAP চিন্তা: কেন বিতরণকৃত সিস্টেম ট্রেডঅফ করে

কেন CAP হলো ব্যবহৃত মানসিক মডেল

যখন আপনি একই ডেটা একের বেশি মেশিনে সংরক্ষণ করেন, আপনি গতি ও ত্রুটি সহনশীলতা পান—কিন্তু এক নতুন সমস্যা বাড়ে: অমিল। দুইটি সার্ভার ভিন্ন আপডেট পেতে পারে, মেসেজ বিলম্বিত বা হারিয়ে যেতে পারে, এবং ব্যবহারকারীরা যে রেপ্লিকায় কাছে যায় তার উপর ভিত্তি করে ভিন্ন ফলাফল পড়তে পারে। CAP জনপ্রিয় হয়ে ওঠে কারণ এটি ইঞ্জিনিয়ারদের সেই গোলমেলে বাস্তবতাকে হাতাঘোরা ছাড়া পরিষ্কারভাবে আলোচনা করার উপায় দেয়।

এরিক ব্রিউয়ার, একজন কম্পিউটার বিজ্ঞানী এবং Inktomi-এর সহ-প্রতিষ্ঠাতা, ২০০০ সালে প্রতিলিপিযুক্ত সিস্টেমের ব্যর্থতার সময় এই মূল ধারণাটি একটি প্রয়োজনীয় বিবৃতির রূপে উপস্থাপন করেন। এটি দ্রুত ছড়িয়ে পড়ে কারণ এটি উৎপাদনে দলেরা যা অনুভব করছিলেন তার সঙ্গে মেলে: বিতরণকৃত সিস্টেম কেবল ডাউন হয়ে যায় না; সেগুলো বিভক্ত হয়ে যায়।

CAP একটি ব্যর্থতার লেন্স, ফিচারের চেকলিস্ট নয়

CAP সবচেয়ে বেশি কাজে লাগে যখন জিনিস খারাপ হয়—বিশেষত যখন নেটওয়ার্ক আচরণ করে না। স্বাভাবিক দিনে বহু সিস্টেম একসাথে যথেষ্ট সামঞ্জস্যপূর্ণ ও প্রাপ্য মনে হতে পারে। পরীক্ষা তখনই সত্যিকারের—যখন মেশিনগুলো নির্ভরযোগ্যভাবে যোগাযোগ করতে পারে না এবং আপনাকে সিদ্ধান্ত নিতে হবে পার্টিশনের সময় রিড ও রাইট নিয়ে কী করা হবে।

এই ফ্রেমটাই CAP-কে একটি জনপ্রিয় মানসিক মডেল হিসেবে দাঁড় করায়: এটি সেরা অনুশীলন নিয়ে তর্ক করে না; বরং একটি স্পষ্ট প্রশ্ন জোর করে—বিভাজনের সময় আমরা কী ত্যাগ করব?

এই নিবন্ধ পড়ে আপনি কী সিদ্ধান্ত নিতে পারবেন

এই নিবন্ধের শেষে আপনি সক্ষম হবেন:

  • বুঝতে কখন আপনি প্রকৃত CAP পরিস্থিতির মোকাবিলা করছেন (প্রতিলিপি + সম্ভাব্য যোগাযোগ বিঘ্ন)।
  • সচেতনভাবে বেছে নিতে, বিভাজনের সময় আপনার সিস্টেম সামঞ্জস্য (সবাই একই সত্য দেখে) নাকি প্রাপ্যতা (সিস্টেম উত্তর দিচ্ছে) অগ্রাধিকার দেবে।
  • সেই সিদ্ধান্তকে প্রোডাক্ট প্রভাবের সাথে যোগ করতে: ব্যবহারকারী কী অভিজ্ঞতা করবে, আপনি কী ত্রুটি দেখাবেন, এবং বিভাজন সেরে গেলে কী ঠিক করতে হবে।

CAP টিকে বহাল রাখে কারণ এটি "বিতরণকৃত হওয়া কঠিন" কথাটিকে একটি রক্ষা করা সিদ্ধান্তে রূপান্তর করে—এবং তা আপনি দাঁড়িয়ে ব্যাখ্যা করতে পারবেন।

সেটআপ: প্রতিলিপি এবং অমিল সমস্যাটি

একটি বিতরণকৃত সিস্টেম সরল ভাষায় হলো একাধিক কম্পিউটার একটি একক সিস্টেম আচরণ করার চেষ্টা করছে। আপনার কাছে কয়েকটি সার্ভার থাকতে পারে বিভিন্ন র্যাক, রিজিয়ন বা ক্লাউড জোনে, কিন্তু ব্যবহারকারীর কাছে এটি "অ্যাপ" বা "ডেটাবেস"।

আমরা কেন ডেটা প্রতিলিপি করি

রিয়াল-ওয়ার্ল্ড স্কেলে সেই শেয়ারড সিস্টেম কাজ করতে হলে আমরা সাধারণত প্রতিলিপি করি: একই ডেটার একাধিক কপি বিভিন্ন মেশিনে রাখি।

প্রতিলিপির জনপ্রিয়তার তিনটি বাস্তবিক কারণ:

  • স্কেল: বেশি মেশিন বেশি ট্রাফিক সামলাতে পারে।
  • পারফরম্যান্স: ব্যবহারকারী নিকটস্থ কপি থেকে সার্ভিস পেলে লেটেন্সি কমে।
  • নির্ভরযোগ্যতা: এক মেশিন মারা গেলে অন্য প্রতিলিপি সার্ভিস চালিয়ে রাখতে পারে।

এখন পর্যন্ত, প্রতিলিপি যেন সরল জয় মনে হচ্ছে। কিন্তু কিছুকাল পর দেখা যায় প্রতিলিপি একটি নতুন কাজ তৈরি করে: সব কপিকে একমত রাখা।

মূল টানাপোড়েন: কপিগুলো অমতে পরতে পারে

যদি প্রত্যেকে রেপ্লিকা সবসময় একে অপরের সাথে ত্রুটিহীনভাবে কথা বলতে পারত, তারা আপডেটগুলিতে সমন্বয় করে একই অবস্থায় থাকতে পারত। কিন্তু বাস্তব নেটওয়ার্ক নিখুঁত নয়। মেসেজ বিলম্বিত হতে পারে, হারিয়ে যেতে পারে, বা ফেইলারের চারপাশ দিয়ে রুট হতে পারে।

যোগাযোগ স্বাস্থ্যকর হলে রেপ্লিকাগুলো সাধারণত আপডেট বিনিময় করে সমবতী হয়ে ওঠে। কিন্তু যোগাযোগ ভেঙে গেলে (অল্প সময়ের জন্য হলেও), আপনি দুইটি বৈধ-দেখা করা “সত্য” সংস্করণ পেতে পারেন।

উদাহরণ: একজন ব্যবহারকারী তার চালান ঠিকানা পরিবর্তন করে। রেপ্লিকা A আপডেট পায়, রেপ্লিকা B পায় না। এখন সিস্টেমকে সহজ প্রশ্নের উত্তর দিতে হবে: বর্তমান ঠিকানাটি কী?

স্বাভাবিক অপারেশন বনাম ব্যর্থতার সময় অপারেশন

এটাই পার্থক্য:

  • স্বাভাবিক অপারেশন: রেপ্লিকাগুলো সমন্বয় করতে পারে; অমিল মূলত সময় সংক্রান্ত সমস্যা।
  • ব্যর্থতার সময় অপারেশন: কিছু রেপ্লিকা যোগাযোগ করতে পারে না; অমিল অনিবার্য হয়ে ওঠে।

CAP চিন্তা ঠিক এখান থেকেই শুরু করে: প্রতিলিপি একবার হলে, যোগাযোগ বিঘ্নে অমিল আর এজ কেস নয়—এটি কেন্দ্রীয় ডিজাইন সমস্যা।

CAP সরল ভাষায়: C, A, এবং P

CAP হল একটি মানসিক মডেল যা বলেে যে ব্যবহারকারী বাস্তবে কেমন অনুভব করে যখন সিস্টেম অনেক মেশিনে ছড়িয়ে থাকে (প্রায়ই বিভিন্ন লোকেশনে)। এটা “ভালো” বা “খারাপ” সিস্টেম নির্ধারণ করে না—শুধু সেই টানাপোড়েন আপনাকে কীভাবে পরিচালনা করতে হবে তা বোঝায়।

সামঞ্জস্য (C): আমি সর্বশেষ রাইট দেখছি কি?

সামঞ্জস্য হলো একমত থাকার ব্যাপার। আপনি যদি কিছু আপডেট করেন, তখন কি পরের রিড (যেকোনো জায়গা থেকে) সেই আপডেট প্রতিফলিত করবে?

ব্যবহারকারীর কাছে এটি পার্থক্য “আমি এটা ঠিক করেছি, এবং সবাই নতুন মানটা দেখছে” বনাম “কেউ কেউ এখনও পুরনো মান দেখছে”।

প্রাপ্যতা (A): আমি কি কোনো উত্তর পাচ্ছি?

প্রাপ্যতা মানে সিস্টেম অনুরোধগুলোর—রিড এবং রাইট—সফল ফলাফল দিয়ে প্রতিক্রিয়া দেয়। বলতে হচ্ছে না “সবচেয়ে দ্রুত”; বলছে “এটি আপনাকে সেবা দিতে অস্বীকার করে না।”

সমস্যার সময় (একটি সার্ভার ডাউনে, নেটওয়ার্ক হিক-আপ), একটি প্রাপ্য সিস্টেম অনুরোধ গ্রহণ করতে থাকে, এমনকি যদি উত্তর একটু পুরানো হয়ে থাকে।

পার্টিশন টলারেন্স (P): যখন নোডগুলো কথা বলতে পারে না কী হবে?

পার্টিশন হলো যখন নেটওয়ার্ক বিভক্ত হয়: মেশিনগুলো চলছে, কিন্তু তাদের মধ্যে কিছু মেসেজ পৌঁছাতে পারে না (বা খুব দেরিতে পৌঁছায়)। বিতরণকৃত সিস্টেমে আপনি এটিকে অসম্ভব বলে বিবেচনা করতে পারবেন না—আপনাকে এটি ঘটলে কী করা হবে তা নির্ধারণ করতে হবে।

সহজ গল্প: দুটো দোকান, একটি ইনভেন্টরি

ধরা যাক দুইটি রিটেল শপ একই পণ্য বিক্রি করে এবং তাদের “1 ইনভেন্টরি কাউন্ট” শেয়ার। একজন ক্রেতা দোকান A-তে শেষ আইটেমটা কিনে, তাই দোকান A লেখে inventory = 0। একই সময়ে একটি নেটওয়ার্ক পার্টিশন দোকান B-কে এটি জানাতে বাধা দেয়।

যদি দোকান B প্রাপ্যতা বজায় রাখে, তাহলে এটি এমন একটি আইটেমও বিক্রি করতে পারে যা আর নেই (বিভাজিত অবস্থায় সেল গ্রহণ করবে)। যদি দোকান B সামঞ্জস্য বজায় রাখে, তাহলে এটি বিক্রয় প্রত্যাখ্যান করতে পারে যতক্ষণ না এটি সর্বশেষ ইনভেন্টরি নিশ্চিত করতে পারে (স্প্লিট চলাকালীন সার্ভিস অস্বীকার করবে)।

আসলে পার্টিশনগুলি কী (এবং কেন আপনি এগুলো উপেক্ষা করতে পারবেন না)

“পার্টিশন” মানে শুধু “ইন্টারনেট ডাউন” নয়। এটি এমন যেকোনো পরিস্থিতি যেখানে আপনার সিস্টেমের অংশগুলো নির্ভরযোগ্যভাবে একে অপরকে বলতে পারে না—যদিও প্রতিটি অংশ ঠিকঠাক চালু থাকতে পারে।

প্রতিলিপিযুক্ত সিস্টেমে, নোডগুলো ক্রমাগত মেসেজ বিনিময় করে: রাইট, স্বীকৃতি, হার্টবিট, লিডার নির্বাচন, রিড রিকোয়েস্ট। একটি পার্টিশন হলো যখন সেই মেসেজগুলো পৌঁছানো বন্ধ করে দেয় (অথবা দেরিতে পৌঁছে), ফলে বাস্তবতা সম্পর্কে অমিল সৃষ্টি হয়: “রাইটটি ঘটেছে কিনা?” “কে লিডার?” “নোড B জীবিত কি না?”

পার্টিশনগুলো হলো যোগাযোগ ব্যর্থতা

যোগাযোগ অগোছালো, আংশিক উপায়ে ব্যর্থ হতে পারে:

  • প্যাকেট লস যা রিট্রাই ও টাইমআউট ট্রিগার করে
  • রাউটিং সমস্যা যেখানে ট্রাফিক লম্বা পথ নেয় বা ব্ল্যাকহোল হয়
  • ওভারলোডেড লিঙ্ক (বা স্যাচুরেটেড NICs) যা বড় দেরি সৃষ্টি করে
  • মিসকনফিগার্ড ফায়ারওয়াল/সিকিউরিটি গ্রুপ যা সঠিক পোর্ট বা দিক ব্লক করে
  • DNS বা সার্ভিস ডিসকভারি সমস্যায় নোড খুঁজে পাওয়া যায় না

গুরুত্বপূর্ণ পয়েন্ট: পার্টিশন প্রায়ই অবনতি—পূর্ণ অন/অফ আউটেজ নয়। অ্যাপ্লিকেশনের দৃষ্টিকোণ থেকে, “পর্যাপ্ত ধীর” হওয়া প্রায়ই “ডাউন” হওয়ার সমান।

স্কেলে পার্টিশন অবশ্যম্ভাবী কেন

আপনি যত বেশি মেশিন, নেটওয়ার্ক, রিজিয়ন এবং চলমান উপাদান যোগ করবেন, যোগাযোগ ভেঙে পড়ার সুযোগও তত বাড়ে। যদিও পৃথক উপাদানগুলি নির্ভরযোগ্য, সামগ্রিক সিস্টেম আরও নির্ভরতা এবং ক্রস-নোড সমন্বয় থাকার কারণে ব্যর্থতা অনুভব করে।

নিয়ন্ত্রিত কোন নির্দিষ্ট ব্যর্থতার হার ধরে না রাখলেও বাস্তবতা হল: আপনার সিস্টেম যদি পর্যাপ্ত সময় ধরে এবং পর্যাপ্ত পরিকাঠামো ছড়িয়ে থাকে, পার্টিশন ঘটবেই।

বাস্তবে “পার্টিশন সহ্য করা” মানে কী

পার্টিশন টলারেন্স মানে আপনার সিস্টেম এমনভাবে ডিজাইন করা যাতে এটি বিভাজনের সময় পরিচালনা চালিয়ে রাখে—এমনকি যখন নোডগুলো একে অপরের যা দেখেছে তা নিশ্চিত করতে পারে না। এর ফলে একটি সিদ্ধান্ত নিতেই হয়: অনুরোধ গ্রহণ করা চালিয়ে যাবে (অসামঞ্জস্যের ঝুঁকি নিয়ে) না কি কিছু অনুরোধ বন্ধ/প্রত্যাখ্যান করা হবে (সামঞ্জস্য রক্ষা করে)।

মূল মুহূর্ত: বিভাজনের সময় সামঞ্জস্য না প্রাপ্যতার সিদ্ধান্ত নেওয়া

CAP অনুমানগুলো আগেভাগেই পরীক্ষা করুন
একটি ছোট সিস্টেম তৈরি করে বাস্তবসম্মত ক্লায়েন্ট আচরণ দিয়ে পার্টিশন-সদৃশ ল্যাটেন্সি পরীক্ষা করুন।

একবার প্রতিলিপি থাকলে, একটি পার্টিশন কেবল একটি যোগাযোগ ভাঙা: আপনার সিস্টেমের দুটি অংশ নির্দিষ্ট সময়ের জন্য একে অপরের সাথে নির্ভরযোগ্যভাবে কথা বলতে পারে না। রেপ্লিকা এখনও চলছে, ব্যবহারকারীরা ক্লিক করছে, এবং আপনার সার্ভিস অনুরোধ পাচ্ছে—কিন্তু রেপ্লিকাগুলো সর্বশেষ সত্যে একমত হতে পারে না।

CAP টানাপোড়েন এক বাক্যে: একটি পার্টিশনের সময় আপনাকে সামঞ্জস্য (C) নাকি প্রাপ্যতা (A) অগ্রাধিকার দেবেন তা বেছে নিতে হবে। একসাথে আপনি দুইটিই পেতে পারবেন না।

যদি আপনি সামঞ্জস্য বেছে নেন (C)

আপনি বলছেন: “আমি প্রতিক্রিয়াশীল হওয়ার চেয়ে সঠিক থাকা বেশি চাই।” যখন সিস্টেম নিশ্চিত করতে পারে না যে একটি অনুরোধ সব রেপ্লিকায় সিঙ্ক থাকবে, তখন এটি ব্যর্থ হবে বা অপেক্ষা করবে

প্রায়োগিক প্রভাব: কিছু ব্যবহারকারী ত্রুটি, টাইমআউট বা “আবার চেষ্টা করুন” বার্তা দেখবে—বিশেষত ডেটা পরিবর্তন অপারেশনের সময়। এটি সাধারণ যখন আপনি দ্বিগুণ চার্জ হওয়ার ঝুঁকি নিতে চান না, বা কোনো আসন ওভারসেল করতে চান না।

যদি আপনি প্রাপ্যতা বেছে নেন (A)

আপনি বলছেন: “আমি ব্লক করার চেয়ে উত্তর দেওয়াকে অগ্রাধিকার দেব।” পার্টিশনের প্রতিটি অংশ অনুরোধ গ্রহণ করতে থাকবে, এমনকি যদি তারা সমন্বয় করতে না পারে।

প্রায়োগিক প্রভাব: ব্যবহারকারীরা সফল প্রতিক্রিয়া পাবে, কিন্তু পড়া ডেটা স্টাল হতে পারে এবং সমসাময়িক আপডেটগুলো কনফ্লিক্ট করতে পারে। পরে আপনি রিকনসিলিয়েশনের উপর নির্ভর করবেন (মার্জ রুল, লাস্ট-রাইট-উইনস, ম্যানুয়াল রিভিউ ইত্যাদি)।

সিদ্ধান্তটি অপারেশনের ওপরও ভিন্ন হতে পারে

এটি সবসময় একটি গ্লোবাল সেটিং না। অনেক প্রোডাক্ট কৌশল মিশ্রিত করে:

  • রিড বনাম রাইট: রিডগুলো প্রাপ্য রাখুন, কিন্তু রাইটগুলো কঠোর করুন।
  • সমালোচনামূলক বনাম অ-সমালোচনামূলক: অর্থ, পরিচয়, ইনভেন্টরির জন্য সামঞ্জস্য জোর দিন; ফিড, অ্যানালিটিক্স, “লাইক” বা ক্যাশড প্রোফাইলের জন্য প্রাপ্যতা দিন।

মূল বিষয়: প্রতিটি অপারেশনের জন্য সিদ্ধান্ত নিন—এখন একজন ব্যবহারকারী ব্লক হওয়া খারাপ নাকি পরে কনফ্লিক্ট মেরামত করা খারাপ।

প্রচলিত ভুল ধারণা: “দুটি বেছে নিন” স্লোগানের বাইরে

ত্রুটি-সচেতন ফ্লো তৈরি করুন
ডিগ্রেডেড মোড এবং স্পষ্ট ব্যবহারকারীর বার্তা সমর্থন করে এমন API ও UI তৈরি করুন।

“দুটি বেছে নিন” স্লোগান মনে রাখতে সহজ, কিন্তু এটি প্রায়ই মানুষকে ভুল বোঝায় যে CAP হলো তিনটি ফিচারের একটি মেনু যেখানে আপনি চিরতরে মাত্র দুইটি রাখতে পারবেন। CAP মূলত বলে কি হয় যখন নেটওয়ার্ক সহযোগিতা বন্ধ করে দেয়: পার্টিশনের সময় একটি বিতরণকৃত সিস্টেমকে রিডের জন্য সামঞ্জস্যপূর্ণ উত্তর দেওয়া নাকি প্রতিটি অনুরোধের জন্য প্রাপ্য থাকা—এই দুইটার মধ্যে বেছে নিতে হয়।

ভুল ধারণা 1: “আমি C ও A বেছে নিয়ে পার্টিশন এড়িয়ে নেব”

বাস্তব বিতরণকৃত সিস্টেমে, পার্টিশন একটি সেটিং নয় যা আপনি নিষ্ক্রিয় করতে পারবেন। যদি আপনার সিস্টেম মেশিন, র্যাক, জোন বা রিজিয়ন জুড়ে ছড়িয়ে পড়ে, তবে বারবার বার্তা বিলম্বিত, হারানো বা পুনরায় অর্ডার হতে পারে। এটি সফটওয়্যারের দৃষ্টিকোণ থেকে একটি পার্টিশন।

এven যদি ফিজিক্যাল নেটওয়ার্ক ঠিকঠাক থাকে, অন্যান্য ব্যর্থতা একই প্রভাব তৈরি করে—ওভারলোডেড নোড, GC পজ, নইজি নেবরস, DNS সমস্যা, অস্থির লোড ব্যালান্সার। ফলাফল একই: সিস্টেমের কিছু অংশ অন্য অংশের সাথে পর্যাপ্তভাবে সমন্বয় করতে পারে না

ভুল ধারণা 2: “পার্টিশন বিরল এজ-কেস”

অ্যাপ্লিকেশনগুলোর কাছে “পার্টিশন” হলো একটি পরিমিত, বাইনারি ইভেন্ট নয়। তারা অনুভব করে লেটেন্সি স্পাইক এবং টাইমআউট। যদি একটি রিকোয়েস্ট ২০০ মি.সে. পরে টাইমআউট হয়, সেটি পার্থক্য করে না প্যাকেট ২০১ মি.সে. এ পৌঁছেছে নাকি কখনো পৌঁছায়নি: অ্যাপকে পরবর্তী পদক্ষেপ ঠিক করতে হয়। অ্যাপের দৃষ্টিকোণ থেকে ধীর যোগাযোগ প্রায়ই ভাঙা যোগাযোগের সমান।

ভুল ধারণা 3: “সিস্টেমগুলো কেবল CP বা AP”

অনেক বাস্তব সিস্টেম প্রধানত সামঞ্জস্যপূর্ণ বা প্রধানত প্রাপ্য হতে পারে, কনফিগারেশন ও অপারেটিং অবস্থার ওপর নির্ভর করে। টাইমআউট, রিট্রাই নীতি, কোয়ারাম সাইজ, এবং “read your writes” বিকল্পগুলি আচরণ সরানোতে পারে।

স্বাভাবিক অবস্থায় একটি ডাটাবেস শক্তভাবে সামঞ্জস্যপূর্ণ মনে হতে পারে; সঙ্কটের সময় বা ক্রস-রিজিয়ন হিক-আপে এটি রিকোয়েস্ট ফেইল করতে পারে (সামঞ্জস্যকে অগ্রাধিকার দেয়) বা পুরানো ডেটা ফেরত দিতে পারে (প্রাপ্যতাকে অগ্রাধিকার দেয়)।

CAP পণ্যের লেবেল দেয়ার চেয়ে বেশি—এটি বোঝার বিষয় আপনি কোনো বিবাদে কী ট্রেড নিচ্ছেন, বিশেষত যখন সেই বিবাদ সাধারণ ধীরতার কারণে উদ্ভূত।

আপনি বাস্তবে বেছে নিতে পারবেন এমন সামঞ্জস্য অপশনগুলো

CAP আলোচনা প্রায়ই সামঞ্জস্যকে সর্বচ্ছন্ন বা পুরোপুরি অনিয়ন্ত্রিত ভাবতে বাধ্য করে। বাস্তব সিস্টেমগুলো গ্যারান্টির একটি মেনু অফার করে, প্রতিটিই বিভাজন বা যোগাযোগ ব্যর্থতার সময় ভিন্ন ব্যবহারকারী অভিজ্ঞতা দেয়।

শক্ত সামঞ্জস্য (এবং ব্যর্থতার সময় এর মূল্য)

শক্ত সামঞ্জস্য (প্রায়ই "linearizable") মানে: একবার একটি রাইট স্বীকৃত হলে, যে কোনো পরে রিড—যে রেপ্লিকাই হোক না কেন—এই রাইটটি ফেরত দেবে।

এর দাম: একটি পার্টিশন বা গরিষ্ঠ রেপ্লিকার অনুপলব্ধ হলে সিস্টেম রিড/রাইট বিলম্ব বা প্রত্যাখ্যান করতে পারে যাতে বিরোধ এড়ানো যায়। ব্যবহারকারীরা এটিকে টাইমআউট, “আবার চেষ্টা করুন” বা সাময়িক রিড-ওনলি হিসেবে দেখবে।

অবশেষে সামঞ্জস্য (এবং ব্যবহারকারীরা কী দেখতে পারেন)

অবশেষে সামঞ্জস্য প্রতিশ্রুতি দেয় যে যদি আর নতুন আপডেট না ঘটে, সব রেপ্লিকা মিলবে। এটা গ্যারান্টি করে না যে দুই ব্যবহারকারী ঠিক এখন একই জিনিস দেখবে।

ব্যবহারকারীরা দেখতে পারেন: সদ্য আপডেট করা প্রোফাইল ছবি কিছুকাল পরে "ফিরে যায়", কাউন্টারগুলো বিলম্ব করে আপডেট হয়, বা ঠিক এখন পাঠানো একটি মেসেজ অন্য ডিভাইসে কিছুকাল পরে দেখা যায়।

উপকারী মধ্যবর্তী গ্যারান্টি

আপনি প্রায়ই পুরো শক্ত সামঞ্জস্য ছাড়াও ভাল ব্যবহারকারি অভিজ্ঞতা কিনতে পারেন:

  • Read-your-writes: আপনি আপডেট করার পরে নিজের ডেটার পুরোনো সংস্করণ দেখবেন না।
  • Monotonic reads: একবার কোনো সংস্করণ N দেখলে পরে N-1 দেখবেন না।
  • Causal consistency: যদি ইভেন্ট B, A-র উপরে নির্ভর করে (উদা. কোনো মেসেজ দেখার পরে উত্তর), সবাই A-র আগে B দেখবে।

এই গ্যারান্টিগুলি মানুষের চিন্তাভাবনার সঙ্গে ভালভাবে মানায় ("আমার নিজের পরিবর্তন হারিয়ে যাবে না") এবং আংশিক ব্যর্থতার সময় রক্ষা করা তুলনায় সহজ।

প্রত্যাশার ওপর ভিত্তি করে সামঞ্জস্য স্তর বাছাই

ব্যবহারকারীর প্রতিশ্রুতি থেকে শুরু করুন, জার্গন থেকে নয়:

  • যদি ভুল পড়া অপরিবর্তনীয় ক্ষতি সৃষ্টি করে (টাকা স্থানান্তর, ইনভেন্টরি রিজার্ভ, পারমিশন পরিবর্তন), কঠোর সামঞ্জস্য নিন এবং সাময়িক অপ্রাপ্যতা মেনে নিন।
  • যদি ফিচার সামান্য সময়ের জন্য অমিলে চলতে পারে (লাইক, ভিউ কাউন্ট, ফিড র‌্যাঙ্কিং), অবশেষে বা কারজাল সামঞ্জস্য যথেষ্ট।
  • যদি প্রধান কষ্টটি ব্যক্তিগত বিভ্রান্তি ("আমি এটি সেভ করেছি—কেন আমি এটি দেখতে পারছি না?") হয়, read-your-writesmonotonic reads অগ্রাধিকার দিন।

সামঞ্জস্য একটি পণ্য-সিদ্ধান্ত: ব্যবহারকারীর জন্য “ভুল” কী তা সংজ্ঞায়িত করুন, তারপর সেই ভুল প্রতিহত করার জন্য সবচেয়ে দুর্বল গ্যারান্টি বেছে নিন।

প্রাপ্যতা: কেবল আপটাইম নয়, একটি পণ্য সিদ্ধান্ত

ছোট থেকেই শুরু করুন, পরে স্কেল করুন
ফ্রি টিয়ার থেকে শুরু করুন এবং আপনার প্রোটোটাইপে বেশি ক্ষমতার প্রয়োজন হলে পরে আপগ্রেড করুন।

CAP-এ প্রাপ্যতা কোনো প্রচারসংক্রান্ত সংখ্যা (“ফাইভ নাইনস”) নয়—এটা একটি প্রতিশ্রুতি যা আপনি ব্যবহারকারীর প্রতি দেন যখন সিস্টেম নিশ্চিত নয়।

দ্রুত সফলতা বনাম সঠিক সফলতা

রিপ্লিকাগুলো একমত না হলে প্রায়ই আপনি বেছে নেন:

  • দ্রুত সফলতা: দ্রুতভাবে কিছু ফেরত দিন (এভাবেও যে সেটি স্টেল হতে পারে)।
  • সঠিক সফলতা: শুধুমাত্র তখন ফেরত দিন যখন আপনি উত্তরটি বর্তমান তা প্রমাণ করতে পারেন।

ব্যবহারকারীরা এটিকে “অ্যাপ কাজ করছে” বনাম “অ্যাপ সঠিক” হিসেবে অনুভব করে। একটি সামান্য পুরানো সোশ্যাল ফিড বিরক্তিকর; একটি পুরানো অ্যাকাউন্ট ব্যালান্স ক্ষতিকর।

“ফেইল ক্লোজড” বনাম “ফেইল ওপেন”

অনিশ্চয়তার সময় দুটি সাধারণ আচরণ:

  • ফেইল ক্লোজড: অনুরোধ প্রত্যাখ্যান করুন (এরর, টাইমআউট, রিড-ওনলি)। আপনি সঠিকতা রক্ষা করেন, কিন্তু ব্যবহারকারীরা ব্লক হতে পারে।
  • ফেইল ওপেন: বেষ্ট-এফফর্ট উত্তর দিন (ক্যাশড ডেটা, লোকাল রেপ্লিকা, কিউ করা রাইট)। আপনি ফ্লো রক্ষা করেন, কিন্তু অসামঞ্জস্য প্রদর্শিত হতে পারে।

এটি শুধুমাত্র প্রযুক্তিগত নয়; এটি একটি পলিসি সিদ্ধান্ত। পণ্যকে নির্ধারণ করতে হবে কী দেখানো গ্রহণযোগ্য, আর কী কখনো অনুমান করা যাবেনা।

আংশিক প্রাপ্যতাও প্রাপ্যতা

প্রাপ্যতা জটলা কদাচিৎ সব-অথবা-কিছু নয়। বিভাজনের সময় আপনি দেখতে পারেন আংশিক প্রাপ্যতা: কিছু রিজিয়ন, নেটওয়ার্ক বা ব্যবহারকারী গ্রুপ সফল হয় আর অন্যরা ব্যর্থ হয়। এটি ইচ্ছাকৃত ডিজাইন হতে পারে (স্থানীয় রেপ্লিকা যেখানে স্বাস্থ্যবান সেখানে সার্ভ করা) বা দুর্ঘটনাজনিত (রাউটিং ভারসাম্যহীনতা, অসম কোয়ারাম অ্যাক্সেস)।

ডিগ্রেড মোড: মূল বজায় রেখে ঝুঁকি সীমাবদ্ধ করা

একটি বাস্তবসম্মত মাঝামাঝি হল ডিগ্রেড মোড: নিরাপদ ক্রিয়াগুলো চালু রেখে ঝুঁকিপূর্ণগুলো সীমাবদ্ধ রাখুন। উদাহরণস্বরূপ, ব্রাউজ ও সার্চ চালু রাখুন, কিন্তু সাময়িকভাবে “ট্রান্সফার ফান্ডস”, “পাসওয়ার্ড বদলানো” বা অন্য ঝুঁকিপূর্ণ অপারেশন বন্ধ করে দিন।

সাধারণ প্রশ্ন

What problem does CAP help engineers reason about?

CAP একটি মানসিক মডেল যা যোগাযোগ বিঘ্নের সময় প্রতিলিপিযুক্ত সিস্টেম নিয়ন্ত্রণ করতে সাহায্য করে। এটা সবচেয়ে কাজে লাগে যখন নেটওয়ার্ক ধীর, প্যাকেট হারায় বা বিভাজিত হয়, কারণ তখন রেপ্লিকাগুলি নির্ভরযোগ্যভাবে একমত হতে পারে না এবং আপনাকে নিচের দুইটির মধ্যে সিদ্ধান্ত নিতে হয়:

  • Consistency: প্রত্যেকে একই সর্বশেষ মান দেখে
  • Availability: সিস্টেম ধারাবাহিকভাবে সফল উত্তর দিচ্ছে

এই মডেলটি "বিতরণকৃত সিস্টেম জটিল" কথাটিকে একটি স্পষ্ট প্রোডাক্ট ও ইঞ্জিনিয়ারিং সিদ্ধান্তে রূপান্তর করে।

When am I actually in a CAP situation?

একটি সত্যিকারের CAP পরিস্থিতির জন্য দরকার উভয়ই:

  • প্রতিলিপি (Replication) (একাধিক নোড একই ডেটার জন্য রিড/রাইট করতে পারে)
  • একটি বাস্তবসম্মত সম্ভাবনা যে যোগাযোগ ব্যর্থ হবে (পার্টিশন, টাইমআউট, দীর্ঘ দেরি)

আপনি যদি একটি একক নোডে চলেন, বা স্টেট রেপ্লিকেট না করেন, তাহলে CAP ট্রেডঅফগুলো প্রধান সমস্যা নয়।

What counts as a network partition in real systems?

পার্টিশন বলতে এমন কোনো পরিস্থিতিকে বোঝায় যেখানে সিস্টেমের অংশগুলো নির্ভরযোগ্যভাবে বা প্রয়োজনীয় সময়সীমার মধ্যে যোগাযোগ করতে পারে না—যদিও প্রতিটি মেশিন এখনও চালু থাকতে পারে।

বাস্তবে, “পার্টিশন” প্রায়শই এভাবে প্রকাশ পায়:

  • টাইমআউট ঘটানো লেটেন্সি স্পাইক
  • প্যাকেট হারানো বা ব্ল্যাকহোলিং
  • ফায়ারওয়াল বা রাউটিং কনফিগারেশন ত্রুটি
  • অতিরিক্ত লোড দেয়া নোড যা সময়মতো প্রতিক্রিয়া দেয় না

অ্যাপের দৃষ্টিকোণ থেকে, “খুব ধীর” হওয়া অনেক সময় “ডাউন” হওয়ার সমান।

What’s the difference between consistency and availability in user terms?

Consistency (C) মানে হলো রিডগুলো স্বীকৃত সর্বশেষ রাইট প্রতিফলিত করে—অর্থাৎ সবাই একই সর্বশেষ মান দেখে। ব্যবহারকারীর অভিজ্ঞতায় এটি হয় “আমি এটি বদলেয়েছি, এবং সবাই একই নতুন মান দেখছে।”

Availability (A) মানে হলো প্রত্যেক অনুরোধ একটি সফল প্রতিক্রিয়া পায় (অবশ্যই সর্বশেষ ডেটা নাও হতে পারে)। ব্যবহারকারী এটি অনুভব করে “অ্যাপটি চালু আছে,” কেবল কিছু ফলাফল আগের হতে পারে।

একটি পার্টিশনের সময় সাধারণত আপনি উভয়ই একসাথে গ্যারান্টি করতে পারবেন না।

Why can’t I just choose consistency and availability and ignore partitions?

কারণ পার্টিশন বিতরণকৃত সিস্টেমে ঐচ্ছিক নয়—যদি আপনি মেশিন, র্যাক, জোন বা রিজিয়ন জুড়ে প্রতিলিপি করেন, তাহলে নোডগুলো কখনো না কখনো সমন্বয় করতে অসফল হবে।

"পার্টিশনকে উপেক্ষা করা" সম্ভব নয়—আপনি প্রতিবার যোগাযোগ বিঘ্ন ঘটলে কী করবেন তা নির্দিষ্ট করে রাখতে হবে। সাধারণত তা হয়: কিছু অ্যাকশন প্রত্যাখ্যান/বিলম্বিত করা (সামঞ্জস্যকে বেছে নেওয়া) অথবা বেষ্ট-এফফর্ট ফলাফল দেখানো (প্রাপ্যতাকে বেছে নেওয়া)।

What does a consistency-first (CP) choice look like during a split?

যদি আপনি সামঞ্জস্য (Consistency) কে অগ্রাধিকার দেন, তাহলে সাধারণত আপনি:

  • এমন অপারেশন প্রত্যাখ্যান বা বিলম্ব করবেন যখন আপনি নিশ্চিত হতে পারবেন না যে সব রেপ্লিকা একমত থাকবে
  • রিড/রাইটের জন্য কোয়ারাম/মেজরিটি চালান
  • টাইমআউট, “পুনরায় চেষ্টা করুন” বা রিড-ওনলি মুডের মতো ত্রুটি প্রদর্শন করবেন

এটি সাধারণত টাকা লেনদেন, ইনভেন্টরি রিজার্ভেশন বা অনুমতি পরিবর্তনের মতো ক্ষেত্রে ব্যবহৃত হয়—যেখানে ভুল হওয়া ক্ষতির চেয়ে ইন্টারাপশন গ্রহণযোগ্য।

What does an availability-first (AP) choice look like during a split?

যদি আপনি প্রাপ্যতা (Availability) কে অগ্রাধিকার দেন, তাহলে সাধারণত আপনি:

  • বিভাজনের প্রতিটি দিকেই রিড/রাইট গ্রহণ চালিয়ে দেবেন
  • রেপ্লিকাগুলো সাময়িকভাবে বিভক্ত হতে দিবেন
  • পরে একত্রিত করে মেরামত করবেন (মার্জ রুল, কনফ্লিক্ট রেজলিউশন, ম্যানুয়াল রিভিউ)

ব্যবহারকারীরা কম হার্ড এরর দেখবে, কিন্তু স্টেল ডেটা, ডুপ্লিকেট ইফেক্ট (যদি আইডেমপোটেন্সি না থাকে), অথবা কনফ্লিক্ট যা পরে ক্লিনআপ প্রয়োজন—এগুলো দেখা যেতে পারে।

Can I mix consistency and availability choices by operation?

হ্যাঁ। আপনি প্রতিটি এন্ডপয়েন্ট বা ডেটা টাইপ অনুযায়ী আলাদা সিদ্ধান্ত নিতে পারেন। প্রচলিত মিক্সড কৌশলগুলো:

  • রিডগুলো প্রাপ্য রাখুন, লেখা (writes) কঠোর করুন (ব্রাউজ করা কাজ করবে; ঝুঁকিপূর্ণ আপডেট ব্যর্থ হতে পারে)
  • সমালোচনামূলক অ্যাকশনগুলো ক্লোজ করে ফেলুন (পেমেন্ট, ইনভেন্টরি, অথ) যখন অপ্রয়োজনীয় ফিচারগুলো খুলে রাখুন (ফিড, অ্যানালিটিক্স)
  • ডিগ্রেডেড মোড: নিরাপদ অপারেশন চালিয়ে রাখুন, ঝুঁকিপূর্ণগুলো অস্থায়ীভাবে নিষ্ক্রিয় করুন

এভাবে একটি একক “আমরা AP/CP” লেবেল এড়ানো যায়, যা বাস্তবে প্রায়ই উপযুক্ত হয় না।

What consistency guarantees can I choose besides “strong” vs “eventual”?

আপনি বেছে নিতে পারেন:

  • স্ট্রং কনসিস্টেন্সি (linearizable): একটি রাইট স্বীকৃত হলে সব পরে হওয়া রিড সেই রাইট দেখাবে। এর দাম: বিভাজন বা একটি সংখ্যাগরিষ্ঠ রেপ্লিকা অনুপলব্ধ হলে সিস্টেম রিড/রাইট বিলম্ব বা প্রত্যাখ্যান করতে পারে।
  • অবশেষে সামঞ্জস্য (eventual consistency): যদি নতুন আপডেট না ঘটে, সব রেপ্লিকা শেষমেষ একে অপরের সাথে মিলবে। ব্যবহারকারীরা সাময়িক স্টেল ডেটা দেখতে পারেন।
  • মধ্যম ধরন গ্যারান্টি:
    • read-your-writes (আপনি যে আপডেট করেছেন তা পরে নিজের হাতে দেখতে পারবেন)
    • monotonic reads (একবার N সংস্করণ দেখলে পরে N-1 দেখবেন না)
    • causal consistency (যদি B ঘটনার উপর A নির্ভর করে, সবাই আগে A পরে B দেখবে)

আপনি এমন দুর্বলতম গ্যারান্টি বাছাই করুন যা ব্যবহারকারী-দৃষ্টিতে অগ্রহণযোগ্য “ভুল” প্রতিরোধ করে।

How do CAP choices map to common use cases?

প্রশ্ন হলো: একটি বিভাজনের সময় আপনার ব্যবহারকারীরা কী অনুভব করবে—আপনি সিস্টেমকে প্রতিক্রিয়া দেখাতে চান না কি ভুল ডেটা থেকে বিরত রাখতে চান?

  • ইভেন্টার, ইনভেন্টরি: যদি চেকআউট চালু রাখেন, প্রতিটি দিকই শেষ আইটেমটি বিক্রি করতে পারে (ওভারসেল)। কম-স্টেক পণ্যের ক্ষেত্রে এটি মেনে নেওয়া যায়; সীমিত ড্রপের ক্ষেত্রে ব্যথাদায়ক।
  • পেমেন্ট: সাধারণত এখানে কনসিস্টেন্সি-ফার্স্ট উপযোগী—বাধ্যতার চেয়ে আপাতত কিছু ব্যর্থতা গ্রহণ করা ভালো যাতে ভুল লেনদেন না ঘটে।
  • চ্যাট/ফিড/অ্যানালিটিক্স: সামান্য স্টেল ডেটা সাধারণত গ্রহণযোগ্য, তাই প্রাপ্যতা-ভিত্তিক নীতি ভাল হতে পারে।

সংক্ষেপে: আপনার ব্যবসায়িক খরচ কত—এই সিদ্ধান্তটাই নির্ধারণ করে।

What design patterns implement CAP tradeoffs?

যদি আপনি বিভাজনের সময় আপনার সিদ্ধান্তগুলো বাস্তব করে তুলতে চান, তাহলে সাধারণভাবে ব্যবহৃত কিছু নকশাগত প্যাটার্ন আছে:

  • কোয়ারাম (মেজরিটি): বেশিরভাগ রেপ্লিকার সম্মতি চাইলে স্টেল বা কনফ্লিক্ট কম হয়; কিন্তু মেজরিটি অনুপলব্ধ হলে অপারেশন প্রত্যাখ্যান হতে পারে — এভাবে আপনি সামঞ্জস্যকে অগ্রাধিকার দেন।
  • টাইমআউট, রিট্রাই, ব্যাকঅফ: দ্রুত টাইমআউট সিস্টেমকে ফড়িং করে তুলতে পারে; রিট্রাই সহ ব্যাকঅফ ও জিটার সফল পুনরুদ্ধারে সহায়তা করে।
  • কনফ্লিক্ট হ্যান্ডলিং: যদি বিভাজনকালে ভিন্ন আপডেট গ্রহণ করা হয়, পরে reconcile করতে হয়—যেমন LWW, ভার্সন ভেক্টর, বা ডেটা-মডেল-ভিত্তিক মার্জ রুল।
  • আইডেমপোটেন্সি: রিট্রাই ডুপ্লিকেশন এড়াতে অনুরোধ আইডি ব্যবহার করে একই ফলাফল ফেরত দেয়া যায়, ফলে রিট্রাই প্রাপ্যতা বাড়ায় কিন্তু ডেটা নষ্ট করে না।
How do I validate CAP assumptions in real life?

সিস্টেমটি কিভাবে আচরণ করবে তা নিশ্চিত করতে আপনি ইচ্ছাকৃতভাবে সেই পরিস্থিতি তৈরি করে পরীক্ষা করবেন:

  • স্টেজিং-এ (এবং সাবধানে প্রোডাকশনে) পার্টিশন সিমুলেট করুন: নির্দিষ্ট সার্ভিস/নোডগুলোর মধ্যে ট্রাফিক ব্ল্যাকহোল করুন, পোর্ট ব্লক করুন, চরম লেটেন্সি বা প্যাকেট লস যোগ করুন, লিডারকে বিচ্ছিন্ন করুন।
  • লক্ষ্য প্রশ্নগুলো: রাইটগুলো প্রত্যাখ্যান হয় নাকি গ্রহণ? রিডগুলো স্টেল হয়? পুনরায় একত্রিত হলে পুনর্মিলন কেমন কাজ করে?
  • মনিটরিং: কেবল আপটাইম নয়, দেখুন অপারেশন-নির্দিষ্ট এরর রেট (রিড বনাম রাইট), স্টেল-রিড সূচক (read-your-writes ভায়লেশন), রেপ্লিকা বিচ্যুতির মেট্রিক, টাইমআউট ও রিট্রাই।
  • রানবুক এবং ব্যবহারকারী যোগাযোগ: বিভাজনের সময় কখন লিখা ফ্রিজ করবেন, কখন ফেলওভার করবেন, কোন ফিচার ডিগ্রেড করবেন—এসব আগে থেকে নির্ধারণ করুন এবং ব্যবহারকারীকে উপযুক্ত বার্তা দিন।
What practical checklist should I use for CAP decisions?

নির্দিষ্টভাবে প্রশ্নগুলো জিজ্ঞাসা করুন:

  1. কি সঠিক থাকতে হবে? (উদাহরণ: ব্যালান্স কখনও ঋণাত্মক হওয়া যাবেনা; ইনভেন্টরি ওভারসেল চলবে না)
  2. কি চলতেই থাকলে চলবে? (উদাহরণ: ব্রাউজ বা কেটালগ রিড)
  3. কি অস্থায়ীভাবে অবনতি মানা যাবে? (উদাহরণ: অ্যানালিটিক্স, রিকমেন্ডেশন, প্রোফাইল অবতার)

প্রতিটি ডেটা টাইপ ও এন্ডপয়েন্ট আলাদাভাবে নির্ধারণ করুন—গ্লোবাল “আমরা AP” বলা এড়ান।

এবং সবশেষে: পার্টিশন হারিয়ে গেলে কী ধরনের অসঙ্গতি আপনি গ্রহণ করতে পারেন তা স্পষ্টভাবে বর্ণনা করুন (সময়সীমা, পরিমাণ, ক্ষেত্র-নির্ভর সীমা) এবং ব্যবহারকারীকে কী দেখাবেন তা নির্ধারণ করুন।

Related posts