Circuit breaker ও bulkhead: একটি ব্যর্থতা ছড়ানো ঠেকান
একটি dependency ব্যর্থ হলে সে সবকিছু টেনে নামাতে পারে। Circuit breaker ও bulkhead ক্ষতি সীমিত রাখে।

ব্যর্থতা ছড়ায়। একটি ধীর database আপনার API thread-দের অপেক্ষায় রাখে, thread শেষ হয়ে যায়, আর সুস্থ endpoint-ও উত্তর দেওয়া বন্ধ করে। দুটি pattern এটি ঠেকায়।
Circuit breaker
বিদ্যুতের breaker-এর মতো, কিছু ভুল হলে এটি খুলে যায়, যাতে দোষ পুরো বাড়ি পোড়াতে না পারে।
তিনটি অবস্থা:
- Closed: call স্বাভাবিকভাবে যায়। Breaker ব্যর্থতা গোনে।
- Open: অনেক ব্যর্থতার পর (যেমন গত ১০ সেকেন্ডে ৫০% error), call ভাঙা service ছোঁয় না, সাথে সাথে ব্যর্থ হয়। এতে সেটি সামলে উঠার সময় পায় এবং আপনার নিজের thread বাঁচে।
- Half-open: অপেক্ষার পর কয়েকটি পরীক্ষামূলক call অনুমোদিত হয়। সফল হলে breaker বন্ধ (closed), না হলে আবার open।
ব্যর্থতার সীমা, বিচারের আগে ন্যূনতম call সংখ্যা এবং অপেক্ষার সময় tune করুন।
Circuit open থাকলে কী করবেন
কাজের কিছু ফেরত দিন, একটি fallback:
- Cached বা ডিফল্ট মান (যেমন "recommendation পাওয়া যাচ্ছে না", জনপ্রিয় item দেখান)।
- কমানো feature, যেমন অংশটি লুকানো।
- caller দ্রুত সামলাতে পারে এমন পরিষ্কার error।
Bulkhead
জাহাজে সিল করা কুঠুরি থাকে যাতে একটি ছিদ্রে একটিই ভাসে। Bulkhead resource আলাদা করে, যাতে একটি dependency সবটা খেতে না পারে:
- প্রতি dependency-র আলাদা thread বা connection pool। Payment service ঝুলে গেলে শুধু payment pool শেষ হয়, search ও login চলে।
- গুরুত্বপূর্ণ বনাম কম গুরুত্বের traffic-এর আলাদা pool বা queue।
- প্রতি tenant বা client-এর সীমা, যাতে একজন ভারী user বাকিদের ক্ষুধার্ত না রাখে।
Load shedding
সিস্টেম overload হলে সবকিছু নিয়ে timeout করার বদলে কম নিন ও দ্রুত উত্তর দিন। আগে কম গুরুত্বের request ফেলুন, Retry-After সহ 503 দিন, এবং login ও checkout-এর মতো মূল পথ রক্ষা করুন।
Graceful degradation
Feature-কে ঐচ্ছিক স্তর হিসেবে ডিজাইন করুন। সংবাদের পেজ comment, recommendation বা view count ছাড়াও লোড হতে পারে। আগেই ঠিক করুন কোন অংশ অপরিহার্য।
পরীক্ষা করুন
ব্যর্থতার অনুশীলন করুন: staging-এ dependency বন্ধ করুন, কৃত্রিম latency দিন এবং দেখুন breaker খুলছে, fallback আসছে ও পুনরুদ্ধার হচ্ছে। না-পরীক্ষিত resilience কোড সাধারণত দরকারের সময় ব্যর্থ হয়।
মূল কথা: bulkhead দিয়ে dependency আলাদা করুন, circuit breaker দিয়ে ব্যর্থ service-কে ডাকা থামান, আগেভাগে load ফেলুন, আর সবসময় fallback রাখুন।
System Design সিরিজ, পর্ব ৫ (failure ও security): 2 নম্বর (মোট 6)। আগের লেখা: Timeout, retry ও backoff: retry storm কীভাবে এড়াবেন.


