GH GambleHub

पुनरावृत्ति रणनीतियाँ और पहचान

1) आपको इसकी आवश्यकता क्यों है

नेटवर्क में, विफलताएं आदर्श हैं: टाइमआउट, क्षणिक त्रुटियां, नेटवर्क फ्लैपिंग, ओवरलोड। रिट्रीट केवल विश्वसनीयता में सुधार करता है यदि:

1. सुरक्षित दोहराएं (पहचान),

2. दोहराव के बीच देरी देखी जाती है,

3. सीमा/कोटा और व्यसनों "स्वास्थ्य" का सम्मान किया जाता है।

लक्ष्य गलत लेने और दौड़ के बिना व्यावसायिक संचालन के स्तर पर प्रभावी रूप से एक बार व्यवहार

2) वितरण शब्दार्थ का वर्गीकरण

सबसे अधिक एक बार: कोई पुनरावृत्ति, नुकसान का जोखिम (लॉगिंग, आग-और-भूल)।

कम से कम-एक बार: डुप्लिकेट संभव है - उपभोक्ता की पहचान की आवश्यकता है (अधिकांश कतारें, वेबहूक)।

प्रभावी रूप से-एक बार: डुप्लिकेट संभव हैं, लेकिन सही ढंग से डिडप्लिकेटेड (कुंजी, लेनदेन, आउटबॉक्स)।

3) कब पीछे हटना है और कब नहीं

रिट्रीट समझ में आता है: '408', '429' ('रेट्री-आफ्टर'), '425' (बहुत अर्ली), '499' (क्लाइंट परिधि पर बंद), '5xx', '504', नेटवर्क टाइमआउट/ब्रेक, '502' गेटवे पर, "रीसेट"।

प्रश्न बदले बिना वापस न लें: '400/ 401/403/404/422'।

विवादास्पद मामले: '409 संघर्ष' (आमतौर पर पुनर्विचार नहीं; पहले हम ऑपरेशन की स्थिति पढ़ ते हैं/इरादे को फिर से संगठित करते हैं)।

4) टाइमआउट, बैकऑफ और जिटर

4. 1 नियम

पहले टाइमआउट, फिर रेट्रो: प्रत्येक अनुरोध में "समय सीमा" होनी चाहिए।

घातीय बैकऑफ़: 'delel _ n = base 2 ^ n', सीमा 'max _ deleay'।

जिटर की आवश्यकता होती है: डिकूपल "सुस्त तुल्यकालिक तरंगों" में यादृच्छिकता जोड़ें।

4. 2 जिटर पैटर्न

फुल जिटर: 'स्लीप = रैंड (0, बेस2 ^ एन)' सबसे अच्छा समग्र विकल्प है।

सजाया गया जिटर: 'नींद = मिनट (max_delay, रैंड (आधार, sleep_prev3))' - लंबे संवादों के लिए।

समान जिटर: 'नींद = base2 ^ n/2 + रैंड (0, base2 ^ n/2)' - नरम भिन्नता।

4. 3 रीट्री-बजट

पुनरावृत्ति के अनुपात को सीमित करें:
  • 'retry _ budge _ per _ min = max (é,, flore)'; आमतौर पर 'ć = 0। 1–0. 2`.
  • यदि बजट समाप्त हो गया है, तो फेल-फास्ट/सर्किट ब्रेकर "ओपन" पर स्विच करें।

5) दर सीमित और सर्किट ब्रेकर के साथ बातचीत

'रीट्री-आफ्टर', 'रेटलिमिट-रीसेट' का सम्मान करें और इसे बैक-ऑफ में गिनें।

उच्च '5xx '/टाइमआउट पर - रिट्रे आवृत्ति और समग्र संगति को कम करें।

सर्किट ब्रेकर:
  • आधा खुला: सीमित नमूना की अनुमति देता है।
  • खोलें: तुरंत अस्वीकार करता है (संसाधन सहेजता है)।
  • बंद: साधारण काम।
  • लेखन संचालन पर, ट्विस्ट आक्रामक रिट्रे की तुलना में स्पष्ट संकेत के साथ 409/503 वापस करना बेहतर है।

6) लेखन कार्यों की निष्क्रियता

6. 1 सामान्य विचार

एक ही इरादे - एक परिणाम। आधार पहचान कुंजी और निष्पादन रिकॉर्ड का भंडारण है।

6. 2 HTTP अनुबंध

क्लाइंट हेडर भेजता है:

Idempotency-Key: 7a6b7f9e-2a46-4d0b-9c3a-2b30e1c3c9e3
Idempotency-Key-Expiry: 24h # optional
सर्वर:
  • पहली सफलता पर सहेजता है (कुंजी, परिणाम → स्थिति, शरीर हैश)
  • यदि दोहराया जाता है, तो पुरानी प्रतिक्रिया और हेडर 'Idempotency-repay: true' लौटाता है;
  • शरीर संघर्ष के मामले में (एक ही कुंजी, लेकिन एक अलग पेलोड) - '409 संघर्ष'।

6. 3 भंडारण और टीटीएल

तालिका/मान कुंजी: 'idempotency _ key', 'requess _ hash', 'result', 'state', 'expiry _ at'.

TTL = संभावित रिप्ले और लेट डिलीवरी की विंडो (आमतौर पर भुगतान के लिए 24-72 घंटे)।

'idempotency _ key' द्वारा सूचकांक; उच्च भार - हैश शार्टिंग के लिए।

6. 4 उदाहरण स्कीमा (SQL)

sql
CREATE TABLE idempo_store (
key UUID PRIMARY KEY,
req_hash BYTEA NOT NULL,
status INT NOT NULL,
response JSONB NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
expiry_at TIMESTAMPTZ NOT NULL
);

6. 5 हैंडलर स्यूडोकोड

pseudo handle_write(req):
k = req. headers["Idempotency-Key"]
h = hash(req. body)
rec = idempo_store. get(k)

if rec and rec. req_hash == h:
return rec. status, rec. response, {"Idempotency-Replay": "true"}

if rec and rec. req_hash!= h:
return 409, problem("IDEMPOTENT_CONFLICT")

begin tx result = apply_business_mutation (req) # change status upsert once (idempo_store, key = k, req_hash=h, status = 201, response = result, expiry = now () + 2d)
commit

return 201, result

7) "प्रभावी रूप से-एक बार" पैटर्न

लेन-देन आउटबॉक्स: एक व्यावसायिक घटना को रिकॉर्ड करना और पृष्ठभूमि रिले के माध्यम से एक ही डेटाबेस लेनदेन से एक संदेश भेजना; उपभोक्ता अज्ञात है।

इनबॉक्स/प्रोसेस्ड-टेबल उपभोक्ता पर: डुप्लिकेट को अनदेखा करने के लिए 'इवेंट _ आईडी' सहेजें।

वास्तव में एक बार काफ्का पर - बिल्कुल एक बार व्यवसाय में: यहां तक कि निर्माता/उपभोक्ता ईओएस के साथ, लागू तर्क अभी भी पहचाना जाना चाहिए।

क्षतिपूर्ति लेनदेन (सागा): यदि कदम पीछे हट जाते हैं और दुष्प्रभाव पैदा करते हैं, तो हम सिस्टम को अपरिवर्तनीय को वापस कर देते हैं।

8) विशेष मामले: भुगतान और वित्तीय लेनदेन

मजबूत पहचान: कुंजी ऑपरेशन तर्क के लिए बाध्य है (उदा। 'एक्सटाइल _ पेमेंट _ आईडी')।

पीएसपी - स्टोर 'मर्चेंट _ रेफरेंस' पर डीडुप्लीकेशन - यदि दोहराया जाता है, तो पीएसपी उसी परिणाम को वापस कर देगा।

रिट्रेज़ "क्लाइंट से": केवल तभी अनुमति दें जब 'आइडेम्पोटेंसी-की', अन्यथा डबल राइट-ऑफ का जोखिम।

प्रतियोगिता: निष्पादन की अवधि के लिए "खाते/उपकरण/अनुबंध पर ताला"; जब दोहराया जाता है, 409/423 वापस।

अवलोकन: metrics 'idempo _ repray _ total', 'idempo _ collection _ total'।

9) वेबहूक और बाहरी चुनौतियां

एचएमएसी हस्ताक्षर और समय विंडो; पहले सत्यापन, फिर प्रसंस्करण।

प्रेषक पुनर्विचार: घातीय बैकऑफ + जिटर, 'मैक्स _ प्रयास' और डीएलक्यू।

उपभोक्ता - पहचान: 'ईवेंट _ आईडी' → टेबल/इन-मेमोरी कैश; "सुव्यवस्थित" आदेश की गारंटी नहीं है।

कोड: 2xx = सफल, 4xx = दोहराएं नहीं, 5xx/timeout = दोहराएं।

10) कतारें और पृष्ठभूमि कार्य

डिफ़ॉल्ट रूप से कम से कम एक बार → डुप्लिकेट अपरिहार्य हैं।

'कार्य _ id '/' घटना _ id' और निष्पादन स्थिति भंडारित करें; डुप्लिकेट के साथ - लघु पथ "रीप्ले"।

DLQ और जहर-संदेश: प्रयास काउंटर, संगरोध, मैनुअल पार्सिंग।

प्रतिस्पर्धी सीमा (सेमाफोर्स) और मूर्तिकार श्रमिक।

11) वर्शनिंग और "प्राकृतिक" कुंजियाँ

प्राकृतिक कुंजी (खाता संख्या + तारीख + दस्तावेज़ संख्या) पुनरावृत्ति के लिए प्रति

स्कीमा/संस्करण को बदलते समय, क्वेरी हैश में 'Idempotency-Key' or में संस्करण कुंजी शामिल करें।

12) HTTP हेडर और ग्राहक को संकेत देता है

'Idempotency-Key', 'Idempotency-Repay', 'Retry-After', 'प्रतीक्षा = ' (लंबे ऑपरेशन पर), 'इफ-मैच '/' ETag' (आशावादी ताले)।

एक प्रमुख संघर्ष के लिए 409 - वैध 'रेट्री-आफ्टर' के साथ।

"लंबे" संचालन के लिए - अतुल्यकालिक स्थिति का स्वागत ('202 स्वीकृत' + 'स्थान' प्रति स्थिति संसाधन)।

13) परीक्षण और अराजकता परिदृश्य

नकारात्मक परीक्षण: डबल भेजना, दूसरे शरीर के साथ पुनरावृत्ति, घड़ी desynchronization।

क्रम से बाहर: 't2' 't1' से पहले आता है।

टाइमआउट/' आरएसटी '/' ईओएफ 'का इंजेक्शन, आधा अनुरोध (धीमी गति से पोस्ट)।

फॉलन आइडेम्पोटेंसी स्टोरेज - फेल-बंद व्यवहार (डबल राइट-ऑफ से बेहतर विफलता)।

14) मेट्रिक्स और अलर्ट

'retries _ total {court}', 'retry _ budge _ used {route}', 'backoff _ seexts _ bult'।

'idempo _ repay _ total', 'idempo _ collection _ total', 'डुप्लिकेट _ dited _ tomal'।

मार्गों द्वारा 409/425/429/5xx साझा करें; पीछे हटने के साथ p95/p99 "सफलता का समय"।

अलर्ट: बर्न-रेट रिट्रे बजट, आइडेम्पोटेंस संघर्षों में वृद्धि, डीएलक्यू विकास।

15) एंटीपैटर्न

एक पंक्ति में सभी गलतियों को वापस लें।

रिट्रेस की जिटर → सिंक्रोनस तरंगों की कमी।

टीटीएल और सफाई के बिना लंबे समय तक रहने वाली कुंजी।

साइड इफेक्ट कमिट (आउटबॉक्स उल्लंघन) के बाद परिणाम सहेजा जा रहा है।

'trace _ id '/' idempotency _ key' के बिना लॉग उत्पन्न करना असंभव है.

लेखन संचालन पर आक्रामक समानांतर रिट्रेज़।

16) प्रोड रेडीनेस चेकलिस्ट

  • एकीकृत नीति: क्या पुनर्विचार, क्या नहीं; कोड और ग्राहक संकेत।
  • एक्सपोनेंशियल बैकऑफ + फुल जिटर; 'retry _ बजट' निर्दिष्ट।
  • अनुबंध 'Idempotency-Key' + TTL के साथ भंडारण परिणाम।
  • घटनाओं के लिए आउटबॉक्स/इनबॉक्स; DLQ; प्रतिस्पर्धी सीमा
  • सर्किट ब्रेकर के साथ एकीकरण, 'रेट्री-आफ्टर' का सम्मान करें।
  • रिट्रे/डुप्लिकेट/संघर्ष द्वारा मेट्रिक्स/अलर्ट।
  • अराजकता परीक्षण और नेटवर्क विफलता अनुकरण का एक सेट।
  • ग्राहक प्रलेखन - बैक-अप और स्टेटस के उदाहरण।

17) टीएल; डीआर

रिट्रीट केवल पहचान के साथ उपयोगी होते हैं। 'Idempotency-Key' दर्ज करें और परिणाम भंडारण, एक्सपोनेंशियल बैकऑफ़को जिटर और रीट्री बजट के साथ लागू करें, 'रेट्री-आफ्टर' का सम्मान करें, सर्किट ब्रेकर के साथ एकीकृत करें। घटनाओं के लिए - आउटबॉक्स/इनबॉक्स; भुगतान, सख्त deduplication और ताले के लिए। रिट्रेज़और संघर्ष, परीक्षण डुप्लिकेट और टाइमआउट को मापते हैं।

Contact

हमसे संपर्क करें

किसी भी प्रश्न या सहायता के लिए हमसे संपर्क करें।हम हमेशा मदद के लिए तैयार हैं!

Telegram
@Gamble_GC
इंटीग्रेशन शुरू करें

Email — अनिवार्य है। Telegram या WhatsApp — वैकल्पिक हैं।

आपका नाम वैकल्पिक
Email वैकल्पिक
विषय वैकल्पिक
संदेश वैकल्पिक
Telegram वैकल्पिक
@
अगर आप Telegram डालते हैं — तो हम Email के साथ-साथ वहीं भी जवाब देंगे।
WhatsApp वैकल्पिक
फॉर्मैट: देश कोड और नंबर (उदा. +91XXXXXXXXXX)।

बटन दबाकर आप अपने डेटा की प्रोसेसिंग के लिए सहमति देते हैं।