प्लेबुक
वेबहुक के अंतर्गत आशावादी समवर्तीता (Optimistic Concurrency Under Webhooks)
जब वेबहुक के साथ समकालिक प्रतिक्रिया एक ही समय में समान भुगतान को छूती है तो संस्करण टोकन और लीज़ दौड़ को कैसे हल करते हैं? टर्मिनल भुगतान में बासी पढ़ने वाला ग्राहक रहस्य...
वितरित भुगतान इंजन
भाग 17 का 22
वितरित भुगतान आर्किटेक्चर की एक श्रृंखला जो कैप्चर और पूर्ण के बीच के अंतर को पाटती है।
पिछले अनुभाग में हमने देखा कि अंततः स्थिरता अपरिहार्य क्यों है: पीएसपी आपके लेनदेन प्रोटोकॉल में भाग नहीं ले सकता है, गाथा और सुलह ही वास्तविक उत्तर हैं। यह अनुभाग उस विसंगति विंडो के चरम क्षण पर केंद्रित है - वह क्षण जब वेबहुक और सिंक्रोनस प्रतिक्रिया एक ही भुगतान रिकॉर्ड को एक साथ छूते हैं।
चेकआउट ऑर्केस्ट्रेटर चार्ज अनुरोध भेजता है; प्रदाता गेटवे को PSP से प्रतिक्रिया प्राप्त होती है। उसी समय - कभी मिलीसेकंड पहले, कभी बाद में - उसी भुगतान के लिए एक वेबहुक आता है। दोनों पथ सटीक जानकारी ले जा सकते हैं; यदि दोनों एक ही समय में लिखने का प्रयास करते हैं, तो परिणाम या तो खोया हुआ अपडेट या इससे भी बदतर, टर्मिनल भुगतान पर पुरानी जानकारी के आधार पर गलत ग्राहक प्रतिक्रिया है।```text Senkron yanıt ──► Payment #42 (version=3) ──► Captured Webhook ──► Payment #42 (version=3) ──► Captured (tekrar?) │ ▼ Version token + lease → tek kazanan yazar
## पहले उल्लेख पर अवधारणाएँ```text
📦 Version Token (Optimistic Lock)
Her güncellemede artan sayaç; yazma yalnızca beklenen sürüm eşleşirse başarılı olur.
📦 Lease
Bir worker'ın belirli bir ödeme kaydını işleme hakkını süre sınırlı olarak alması.
📦 Stale Read
İşlem sırasında okunan ama yazma anında artık geçerli olmayan eski sürüm.
📦 Terminal Payment
Captured, Failed veya Refunded gibi geri dönüşü olmayan nihai statü.
```पट्टा तब होता है जब कोई कर्मचारी कहता है 'मैं इस रिकॉर्ड को संसाधित कर रहा हूं'; संस्करण टोकन का अर्थ है 'मैं अभी भी यह संस्करण देखता हूं'। साथ में, वे वेबहुक और सिंक्रोनस पथ को एक-दूसरे को ओवरराइट करने से रोकते हैं।
## दो सड़कें, एक रिकॉर्ड: जहां से दौड़ शुरू होती है
रीडायरेक्ट-आधारित भुगतान में, सिंक्रोनस पथ आमतौर पर `Pending` लौटाता है; वास्तविक परिणाम वेबहुक के साथ आता है। कार्ड से भुगतान के लिए, दोनों मार्ग `Captured` या `Failed` ले जा सकते हैं - और दोनों लगभग एक ही समय पर पहुंच सकते हैं। चेकआउट ऑर्केस्ट्रेटर दोनों पथों से एक ही भुगतान लाइन पर जानकारी लिखने का प्रयास करता है।
क्लासिक त्रुटि: दोनों हैंडलर रिकॉर्ड पढ़ते हैं, स्थिति अपडेट करते हैं, सेव करते हैं। लिखने वाला अंतिम व्यक्ति जीतता है; बीच में अपडेट चुपचाप गायब हो जाता है. अधिक खतरनाक परिदृश्य: ऑर्केस्ट्रेटर टर्मिनल स्थिति पर स्विच करने से पहले एक पुराना संस्करण पढ़ता है और क्लाइंट को एक क्लाइंट गुप्त या रीडायरेक्ट यूआरएल लौटाता है जो अभी भी वैध प्रतीत होता है - भुगतान वास्तव में पहले ही पूरा हो चुका है या विफल हो चुका है।```text
T=0 Orchestrator: charge gönder
T=1 Webhook gelir → Captured yaz (version 2→3)
T=2 Senkron yanıt gelir → Pending okudu (version 1)
→ client'a redirectUrl döner (bayat!)
T=3 Müşteri redirect'e gider → ödeme zaten Captured
```## संस्करण टोकन: केवल तभी लिखें जब संस्करण मेल खाता हो
प्रत्येक भुगतान रिकॉर्ड में एक नीरस रूप से बढ़ती हुई `version` फ़ील्ड रखी जाती है। अद्यतन निम्नलिखित शर्त के साथ किया जाता है: `UPDATE ... WHERE id = ? AND version = ?`. यदि कोई मिलान नहीं है, तो अद्यतन शून्य पंक्तियों को प्रभावित करता है - यह एक संकेत है कि कोई अन्य पथ हस्तक्षेप कर रहा है।```text
Webhook handler
READ payment (version=2, status=Processing)
→ status=Captured, version=3
UPDATE WHERE version=2 ✓ (1 row)
Senkron handler (bayat okuma)
READ payment (version=2, status=Processing) ← webhook henüz commit olmadı
→ status=Captured, version=3
UPDATE WHERE version=2 ✗ (0 rows — webhook zaten yazdı)
→ yeniden oku, terminal statüyü gör, client secret döndürme
```अकेले संस्करण टोकन पर्याप्त नहीं है; यह परिभाषित करना भी आवश्यक है कि पुराने पढ़ने का पता चलने के बाद क्या करना है: दोबारा पढ़ें, टर्मिनल स्थिति की जांच करें, क्लाइंट को केवल वर्तमान स्थिति लौटाएं।
## पट्टा: सीमित समय के लिए वेबहुक प्रोसेसिंग का अधिकार प्राप्त करना
वेबहुक हैंडलर रिकॉर्ड को छूने से पहले एक छोटा पट्टा लेता है: 'मैं 30 सेकंड के लिए भुगतान #42 संसाधित कर रहा हूं।' लीज अवधि के दौरान, कोई अन्य कर्मचारी उसी रिकॉर्ड को वेबहुक या रिकवरी स्ट्रीम में संसाधित नहीं कर सकता है।```text
Webhook gelir
→ lease al (paymentId, ttl=30s)
→ lease alınamazsa → defer / retry
→ lease alındı → version token ile güncelle
→ lease bırak
```लीज़ एक ही वेबहुक को दो श्रमिकों द्वारा एक साथ संसाधित होने से रोकता है। संस्करण टोकन विभिन्न पथों (सिंक्रोनस बनाम वेबहुक) के बीच टकराव का समाधान करता है। दोनों अलग-अलग समस्याओं का उत्तर देते हैं; इनका उपयोग एक साथ किया जाना चाहिए।
## टर्मिनल भुगतान में ग्राहक का गुप्त रहस्य लीक होना
सबसे गंभीर पुराना पढ़ा गया परिदृश्य टर्मिनल स्थिति में क्लाइंट गुप्त या रीडायरेक्ट यूआरएल लौटा रहा है। भुगतान `Captured` होने के बाद भी ग्राहक को `Pending` + रीडायरेक्टयूआरएल लौटाने के परिणामस्वरूप अनावश्यक दूसरा शुल्क प्रयास या भ्रम होगा।
नियम सरल है: क्लाइंट सीक्रेट, रीडायरेक्ट यूआरएल या रीट्री टोकन कभी भी टर्मिनल स्थिति में गए भुगतान के लिए वापस नहीं किया जाता है। जब हैंडलर को संस्करण विरोध प्राप्त होता है या पुराना पढ़ने का संदेह होता है तो वह रिकॉर्ड को दोबारा पढ़ता है; यदि यह टर्मिनल स्थिति देखता है तो यह केवल अंतिम परिणाम लौटाता है।
| स्थिति | ग्राहक के पास लौटना |
| --- | --- |
| प्रसंस्करण, पुनर्निर्देशन आवश्यक | रीडायरेक्टयूआरएल (वैध) |
| कैप्चर किया गया (टर्मिनल) | सफलता का परिणाम, कोई रहस्य नहीं |
| विफल (टर्मिनल) | त्रुटि परिणाम, कोई रहस्य नहीं |
| संस्करण विरोध → पुनः पढ़ें → कैप्चर किया गया | सफलता का परिणाम, कोई रहस्य नहीं |
## अक्सर भ्रमित होने वाले भेद```text
❌ Pessimistic lock her zaman daha güvenlidir
✓ Ödeme akışında kısa süreli lease + version token, throughput'u korurken yarışı çözer
❌ Version conflict = hata, exception fırlat
✓ Version conflict = başka yol kazandı; yeniden oku ve güncel duruma uy
❌ Lease ve version token aynı şeyi yapar
✓ Lease aynı kaydın eşzamanlı işlenmesini engeller; version token eşzamanlı yazmayı
```## लीज़ बनाम संस्करण टोकन
| कसौटी | पट्टा | संस्करण टोकन |
| --- | --- | --- |
| अवरुद्ध | एक ही रिकॉर्ड का समानांतर प्रसंस्करण | अपडेट खो गया |
| अवधि | टीटीएल लिमिटेड | निरंतर, प्रत्येक लिखने के साथ बढ़ता है |
| संघर्षपूर्ण व्यवहार | रुको/स्थगित करो | पुनः पढ़ें/पुनः प्रयास करें |
## आशावादी समवर्ती चेकलिस्ट
1. क्या भुगतान अपडेट `WHERE version = ?` शर्त के साथ किए जाते हैं?
2. जब कोई संस्करण विरोध प्राप्त होता है, तो क्या हैंडलर टर्मिनल स्थिति को दोबारा पढ़ता है और जांचता है?
3. क्या टर्मिनल स्थिति में रिटर्निंग क्लाइंट सीक्रेट या रीडायरेक्ट यूआरएल कोड स्तर पर अवरुद्ध है?
4. क्या ऑपरेशन शुरू करने से पहले वेबहुक हैंडलर को पट्टे पर दिया गया है?
5. क्या लीज अवधि वेबहुक प्रसंस्करण समय के P99 से अधिक लंबी है?
6. क्या सिंक्रोनस रिस्पॉन्स हैंडलर और वेबहुक हैंडलर समान अंतिम तर्क साझा करते हैं?
## इस लेख से आपको क्या याद रखना चाहिए
1. वेबहुक के साथ सिंक्रोनस पथ एक ही रिकॉर्ड को एक साथ छूता है; आशावादी समवर्तीता इस दौड़ का मानक उत्तर है।
2. संस्करण टोकन हानि अद्यतन को रोकती है; पट्टा उसी रिकॉर्ड के समानांतर प्रसंस्करण को रोकता है।
3. संस्करण विरोध कोई त्रुटि नहीं है, बल्कि एक पुनः पढ़ा गया संकेत है।
4. टर्मिनल पेमेंट में बासी पढ़े बिना क्लाइंट सीक्रेट लौटाना एक मूक सुरक्षा और यूएक्स गलती है।
> दौड़ को हल करने के लिए आपको निराशावादी लॉक की आवश्यकता नहीं है; आपको संस्करण टोकन और लीज के एक अनुशासित संयोजन की आवश्यकता है जो पुरानी सामग्री को ग्राहक तक पहुंचने से रोकता है।
अगले भाग में, हम इन दौड़ों को देखने और चरणों को अंतिम रूप देने के लिए अवलोकन की ओर बढ़ते हैं: भुगतान आईडी के साथ सहसंबंध, चरण दर चरण ईवेंट लॉग और स्थगित अंतिम मेट्रिक्स।
FAQ
Frequently asked questions
संस्करण टोकन (आशावादी लॉक) क्या है?
प्रत्येक अद्यतन के साथ काउंटर बढ़ता जा रहा है; लेखन तभी सफल होता है जब अपेक्षित संस्करण मेल खाता हो।
पट्टा क्या है?
किसी कर्मचारी का किसी विशेष भुगतान रिकॉर्ड को संसाधित करने का समय-सीमित अधिकार।
क्या यह सच है कि "निराशावादी ताला हमेशा सुरक्षित होता है"?
भुगतान प्रवाह में लघु पट्टा + संस्करण टोकन थ्रूपुट को संरक्षित करते हुए दौड़ को हल करता है
यह अनुभाग क्या ठीक करता है?
आशावादी संगामिति यहां प्रदर्शन अनुकूलन नहीं है; यह टर्मिनल स्थिति में गलत डेटा न लौटाने का तंत्र है। वेबहुक के साथ, सिंक्रोनस पथ एक ही रिकॉर्ड को एक साथ छूता है; आशावादी समवर्तीता इस दौड़ का मानक उत्तर है। पिछले अनुभाग में हमने देखा कि अंततः स्थिरता अपरिहार्य क्यों है: पीएसपी आपके लेनदेन प्रोटोकॉल में भाग नहीं ले सकता है, गाथा और सुलह ही वास्तविक उत्तर हैं। यह अनुभाग उस विसंगति विंडो के चरम क्षण पर केंद्रित है - वह क्षण जब वेबहुक और सिंक्रोनस प्रतिक्रिया एक ही भुगतान रिकॉर्ड को एक साथ छूते हैं।
इंजीनियरिंग सिद्धांत सीखे गए
- संस्करण टोकन हानि अद्यतन को रोकती है; संघर्ष पुनः पढ़ा जाने वाला संकेत है।
- लीज़ और संस्करण टोकन विभिन्न दौड़ का समाधान करते हैं; दोनों का एक साथ उपयोग किया जाना चाहिए।
- टर्मिनल पेमेंट में क्लाइंट सीक्रेट को पुराना समझकर बिना पढ़े वापस नहीं किया जाना चाहिए।
जारी रखें पढ़ रहे हैं
जारी रखें पढ़ रहे हैं
श्रृंखला में अगला
भुगतान अवलोकन और सहसंबंध
भुगतान आईडी के साथ प्रत्येक लॉग, मीट्रिक और ट्रेस को कैसे सहसंबंधित करें? चरण दर चरण ईवेंट लॉग और स्थगित अंतिम मेट्रिक्स ऑपरेशन को कैसे बचाते हैं?
श्रृंखला में अगला
अंततः वितरित लेन-देन से बेहतर संगति क्यों है?
पीएसपी, ऑर्डर और वित्त के बीच 2पीसी स्थापित करना एक जाल है। सागा और सुलह वितरित भुगतान स्थिरता का वास्तविक उत्तर हैं।
वही सिलसिला
भुगतान पुनर्प्राप्ति पाइपलाइन और रनबुक
स्वचालन से पहले: सुलह कार्यकर्ता और पुनर्प्राप्ति पाइपलाइन। साक्ष्य-आधारित मानव रनबुक तब चलन में आती है जब विशिष्टता की दीवारें दोबारा चलाने से रोकती हैं।