पुनः प्रयास और बैकऑफ नीतियां
पुनरावृत्ति (पुनरावृत्ति) अस्थायी विफलताओं से बचने में मदद करती है, लेकिन अगर गलत तरीके से कॉन्फ़िगर किया जाता है, तो वे ट्रैफ़िक के हिमस्खलन, संचालन के डुप्लिकेट और कैस्केडिंग गिरते हैं। एक विश्वसनीय रिट्रे नीति हमेशा समय सीमा/समय समाप्ति के साथ शुरू होती है, पहचान को ध्यान में रखती है और बैकऑफ + जिटर का उपयोग करती है।
1) बुनियादी सिद्धांत
1. पहले टाइमआउट/डेडलाइन, फिर पीछे हटना। समय सीमा के बिना दोहराना केवल विफलता को लंबा करता है।
2. रिट्रे - केवल सुरक्षित/निष्क्रिय संचालन के लिए। असुरक्षित लोगों के लिए - पहचान-कुंजी और लेनदेन की गारंटी के माध्यम से।
3. बैकऑफ अनिवार्य है। एक्सपोनेंशियल या जीसीआरए जैसी तरंगों को डिसिंक्रोनाइज़करने के लिए जिटर के साथ।
4. प्रयासों की संख्या और कुल बजट समय को सीमित करें। उपयोक्ता का SLO न छोड़ें।
5. बुनियादी ढांचे के संकेतों का सम्मा '429/503' + 'रेट्री-आफ्टर', सर्किट ब्रेकर स्थिति, कतार की सीमा।
2) टाइमआउट और डेडलाइन (समय सीमा प्रसार)
समय समाप्ति का अनुरोध करें टाइमआउट रचना: कुल (पहला प्रयास + बैकऑफ + बाद में) ≤ उपयोगकर्ता की समय सीमा। रीड/रिकॉर्ड के लिए अलग-अलग समय: रिकॉर्ड छोटे और सख्त हैं; पढ़ें हेजिंग की अनुमति देता है। 3) पहचान और सुरक्षित दोहराता है पढ़ ता है (GET/idempotent RPC): '5xx', 'UNAVAILABLE', नेटवर्क टाइमआउट के साथ सुरक्षित रूप से दोहराया गया। 4) बैकऑफ एल्गोरिदम घातीय: 'आधार 2 ^ प्रयास', 'max _ backoff' से घिरा हुआ है। सजाया गया जिटर (पूर्ण/समान जिटर) - ग्राहकों को डिसिंक्रोनाइज़करने के लिए रेंज में यादृच्छिकता। GCRA/टोकन-बकेट जैसी देरी: दर सीमा के अनुरूप। सीमाएँ: 'प्रारंभिक _ बैकऑफ' (50-200 एमएस पढ़ ता है; 200-500 ms रिकॉर्ड), 'max _ backoff' (1-5 s), 'max _ elapsed' (उदाहरण के लिए, 3-10 s)। अनुशंसित पैटर्न घातीय बैकऑफ + फुल जिटर है। 5) दोहराएं/निर्णय न दोहराएं 6) कॉन्सुरेंसी कैप और "रेट्रे स्टॉर्म" एक साथ रिट्रे प्रति-क्लाइंट/प्रति-किरायेदार/प्रति-समापन बिंदु सीमित करें। प्रति अनुरोध प्रयासों की कुल सीमा (उदा। 2-3). प्रवेश नियंत्रण के माध्यम से गर्म समापन बिंदुओं को धीमा करें ताकि कतारें न बढ़ें। 7) सर्किट ब्रेकर और सीमाओं के साथ बातचीत यदि सीबी खुला है, तो सीधे रिट्रे प्रदर्शन न करें - फॉलबैक पर जाएं या 'आधे-खुले' नमूनों की प्रतीक्षा करें। '429' पर - 'रेट्री-आफ्टर' का सम्मान; यदि नहीं, तो "सॉफ्ट" बैकऑफ का उपयोग करें। रिट्रेज़तनाव बढ़ा सकता है; अनुकूली थ्रेसहोल्ड (एक घटना के लिए निचला 'मैक्स _ प्रयास') लागू करें। 8) प्रोटोकॉल और अनुबंध HTTP कोड: '408/429/5xx'। हेडर: 'रेट्री-आफ्टर', परिवार 'रेटलिमिट-', 'आइडेम्पोटेंसी-की', 'रिक्वेस्ट-आईडी'। क्लाइंट को 'एक्स-रिक्वेस्ट-टाइमआउट '/' डेडलाइन-एट' (यदि हां) भेजना होगा। समय सीमा के साथ संदर्भ का उपयोग करें; 'UNAVELABLE', 'DEADEMY _ EXCEEED', प्रति विधि नीतियों का सम्मान करें। Idempotent RPC के लिए, retrays शामिल करें; उत्परिवर्तन के लिए - केवल पहचान समर्थन के साथ। 9) कतारें, पृष्ठभूमि कार्य और एकीकरण कम से कम-एक बार हैंडलर - पहचान क्रियाएं, प्रमुख कमी। प्रयासों के बीच बैकऑफ के लिए देरी कतार (उदाहरण के लिए, 5s/30s/2m)। प्रयासों और मैनुअल प्रसंस्करण की सीमा के साथ मृत-अक्षर कतार (DLQ)। आउटबॉक्स/सीडीसी - ताकि रिप्ले लेन-देन की अखंडता से समझौता न करें। 10) हेजिंग बनाम रेट्रीज़ हेजिंग पूंछ विलंबता में अत्यधिक महत्वपूर्ण पढ़ ने के लिए उपयोगी है। सीमा: एक्स% से अधिक अनुरोध, स्टार्ट-ग्रेस देरी (उदाहरण के लिए, p95 विलंबता), हारने वालों का रद्द करना। मजबूत पहचान के बिना संक्रियाओं को लिखने के लिए हेजिंग लागू न करें। 11) टेलीमेट्री और अवलोकन Теги: 'किरायेदार _ id', 'समापन बिंदु', 'प्रयास', 'निर्णय' (पुनरावृत्ति/स्किप), 'कारण', 'बैकऑफ _ एम्स', 'डेडलाइन _ एम्स', 'idempotency _ key'। मेट्रिक्स: रिट्रीट का हिस्सा, रिट्रीट के बाद सफलता, p95/p99 "एंड-टू-एंड", पार की गई समय सीमा की संख्या, सीबी ट्रिगर। ऑडिट लॉग: ऊपरी एन "शोर" कुंजियाँ/समापन बिंदु, 429/503 के साथ सहसंबंध। 12) परीक्षण और अराजकता प्रोफाइल: "देखा" (फट-लुल्ल), "तूफान" (बड़ेपैमाने पर समय), "चिपचिपा" त्रुटियां (हर Nth), विलंबता पूंछ। टोरस लिमिटर/कैश/कतार विफलताएं, घड़ी-तिरछा। जाँच करता है कि कुल अवधि (प्रयास + बैकऑफ़) एसएलओ में फिट बैठता है। 13) नीति स्यूडोकोड 14) कॉन्फ़िगरेशन टेम्पलेट (उदाहरण) 15) प्री-सेल चेकलिस्ट 16) विशिष्ट त्रुटियाँ टाइमआउट/डेडलाइन के बिना रिप्ले "शाश्वत अपेक्षाएं" हैं। बिना झटके के निश्चित ठहराव - तुल्यकालिक तरंगें और DDoS आत्म-तोड़फोड़। निष्क्रियता के बिना असुरक्षित रिकॉर्ड की पुनरावृत्ति - डुप्लिकेट और desynchronization। 'रीट्री-आफ्टर' और सीबी सिग्नल की अनदेखी - बढ़ ती घटना। टोपी और प्रवेश नियंत्रण की कमी के कारण कतारों में अड़ चनें। रेट्रे के कारणों/समाधानों की टेलीमेट्री की कमी - "अंधी उड़ान"। 17) त्वरित व्यंजनों सार्वजनिक एपीआई पढ़ ता है: 3 प्रयास, 'प्रारंभिक = 100 मीटर', 'अधिकतम = 1s', पूर्ण झटका, 5% तक यातायात। महत्वपूर्ण रिकॉर्ड (भुगतान): 1-2 अधिकतम प्रयास, सख्त समय समाप्ति, अनिवार्य 'आइडेम्पोटेंसी-की', कोई हेजिंग नहीं। बाहरी एकीकरण: '429/रीट्री-आफ्टर', 'मैक्स _ प्रयास = 3', 'मैक्स _ बैकऑफ = 2-5 एस', आउटगोइंग प्रवाह सीमा का सम्मान करें। पृष्ठभूमि कार्य: देरी-बैकऑफ़ (5s → 30 → 2m), DLQ, पहचानने वाले हैंडलर। एक अच्छी पुनरावृत्ति नीति तेजी से वसूली और नियंत्रित विफलता के बीच एक संतुलन है। डेडलाइन, पहचान, जिटर के साथ घातीय बैकऑफ, प्रतिस्पर्धा को सीमित करना और बुनियादी ढांचे के संकेतों का सम्मान करना एसएलओ विश्वसनीयता और प्रतिधारण में सुधार के लिए एक उपकरण में "तूफान" से पीछे हट जाता है।
दोहराएँ नहीं जब:
स्मार्ट अपवाद:
gRPC
pseudo handle(req, deadline):
attempt = 0 backoff = initial()
while attempt < MAX_ATTEMPTS and now() < deadline:
attempt += 1 with timeout(per_attempt_timeout(deadline, attempt)):
try:
resp = call(req)
if isRetryableStatus(resp): raise Retryable(resp. status)
return resp except Retryable as e:
if circuit. isOpen(dep) or! isIdempotent(req): break sleep(jitter(backoff))
backoff = min(exp(backoff), MAX_BACKOFF)
except NonRetryable:
break return fail_or_fallback(req)yaml retries:
default:
max_attempts: 3 initial_backoff_ms: 150 max_backoff_ms: 2000 strategy: exponential_full_jitter respect_retry_after: true per_attempt_timeout_fraction: 0. 4 # 40% of remaining deadline hedging:
enabled: false read_heavy:
max_attempts: 4 initial_backoff_ms: 80 max_backoff_ms: 1200 hedging:
enabled: true start_after_p95_ms: 300 max_extra_requests_ratio: 0. 05 write_strict:
max_attempts: 2 initial_backoff_ms: 250 max_backoff_ms: 1000 idempotency_required: true
limits:
concurrent_retries_per_tenant: 100 concurrent_retries_per_endpoint: 20
निष्कर्ष