पाठ 19 / 32

सर्किट ब्रेकर और रिट्राई

समस्या को फैलाने के बजाय तेज़ी से विफल होना और उसे अलग करना।

कैस्केडिंग विफलता की समस्या

जब कोई डाउनस्ट्रीम सेवा धीमी हो जाती है, कॉलर प्रतीक्षारत थ्रेड/कनेक्शन जमा करते हैं, जिससे वे भी धीमे हो जाते हैं — विफलता ऊपर की ओर फैलती है और पूरा सिस्टम गिरा सकती है।

आपके घर का सर्किट ब्रेकर

बिजली के ब्रेकर की तरह, सर्किट ब्रेकर पैटर्न बार-बार विफलता के बाद ओपन हो जाता है — यह विफल सेवा को कॉल करना तुरंत बंद कर देता है (लटकते टाइमआउट के बजाय तेज़ विफलता), प्रतीक्षा करता है, फिर दोबारा बंद होने से पहले कुछ टेस्ट कॉल (हाफ़-ओपन) आज़माता है।

बैकऑफ़ के साथ रिट्राई

अंधाधुंध तुरंत रिट्राई किसी अतिभारित सेवा को और बदतर बनाती है। घातांकीय रूप से बैकऑफ़ करें और जिटर जोड़ें ताकि सभी रिट्राई एक साथ न पहुँचें।

delay = base * 2^attempt + random_jitter
if attempt > max_attempts: give up, fallback
else: sleep(delay); retry

Output:

Prevents retry storms from making an outage worse

बल्कहेड्स और ग्रेसफुल डिग्रेडेशन

बल्कहेड्स हर डिपेंडेंसी को अपना थ्रेड पूल/कनेक्शन सीमा देते हैं ताकि एक धीमी डिपेंडेंसी बाकी की रिक्वेस्ट न भूखी रखे — जहाज़ के जलरोधक कक्षों की तरह। जब कोई गैर-महत्वपूर्ण डिपेंडेंसी डाउन हो, तो सुंदरता से घटें: पूरा पेज विफल करने के बजाय कैश्ड सिफारिशें दिखाएँ।