गो में डिडिट एपीआई त्रुटि प्रबंधन और पुनः प्रयास में महारत हासिल करना (HI)
गो में डिडिट एपीआई के साथ मजबूत एकीकरण बनाने के लिए परिष्कृत त्रुटि प्रबंधन और पुनः प्रयास रणनीतियों की आवश्यकता होती है। यह मार्गदर्शिका डिडिट की दर सीमाओं और विशिष्ट त्रुटि कोड को समझने से लेकर सर्वोत्तम प्रथाओं की पड़ताल करती.

डिडिट की दर सीमाओं को समझें सेवा में रुकावट को रोकने के लिए 429 प्रतिक्रियाओं के लिए क्लाइंट-साइड थ्रॉटलिंग और घातीय बैकऑफ़ को लागू करें, जिसमें 'X-RateLimit-Limit', 'X-RateLimit-Remaining' और 'X-RateLimit-Reset' हेडर का उपयोग किया जाए।
त्रुटि प्रकारों को अलग करें उचित पुनः प्रयास तर्क लागू करने या तेजी से विफल होने के लिए क्षणिक (जैसे, नेटवर्क समस्याएँ, सेवा अनुपलब्धता) और स्थायी त्रुटियों (जैसे, अमान्य एपीआई कुंजी, गलत अनुरोध) के बीच अंतर करें।
मजबूत पुनः प्रयास तंत्र लागू करें सत्र निर्माण जैसे महत्वपूर्ण कार्यों की विश्वसनीयता में सुधार करते हुए, क्षणिक विफलताओं को शालीनता से संभालने के लिए घातीय बैकऑफ़, घबराहट और अधिकतम पुनः प्रयास प्रयासों के साथ संरचित पुनः प्रयास लूप का उपयोग करें।
डिडिट का डेवलपर-प्रथम दृष्टिकोण एकीकरण को सरल बनाता है डिडिट स्पष्ट एपीआई दस्तावेज़, विशिष्ट दर-सीमा हेडर और एक मॉड्यूलर आर्किटेक्चर प्रदान करता है, जिससे गो डेवलपर्स आसानी और आत्मविश्वास के साथ लचीले पहचान सत्यापन प्रवाह का निर्माण कर सकते हैं।
तीसरे पक्ष के एपीआई को एकीकृत करना आधुनिक एप्लिकेशन विकास का एक आधारशिला है, और पहचान सत्यापन कोई अपवाद नहीं है। डिडिट के पहचान प्लेटफ़ॉर्म जैसी महत्वपूर्ण सेवाओं के साथ काम करते समय, यह सुनिश्चित करना कि आपका एकीकरण नेटवर्क उतार-चढ़ाव, सेवा की समस्याओं और दर सीमाओं के प्रति लचीला हो, सर्वोपरि है। यह मार्गदर्शिका गो का उपयोग करके डिडिट एपीआई एकीकरण के लिए विशेष रूप से डिज़ाइन किए गए उन्नत त्रुटि प्रबंधन और पुनः प्रयास रणनीतियों पर प्रकाश डालती है, जिससे आपको मजबूत और विश्वसनीय सिस्टम बनाने में मदद मिलती है।
डिडिट के एपीआई त्रुटि परिदृश्य को समझना
किसी भी पुनः प्रयास तर्क को लागू करने से पहले, आपको जिन त्रुटियों का सामना करना पड़ सकता है, उन्हें समझना महत्वपूर्ण है। डिडिट का एपीआई, कई अच्छी तरह से डिज़ाइन की गई सेवाओं की तरह, एचटीटीपी स्थिति कोड के माध्यम से विभिन्न राज्यों को संचारित करता है। जबकि मानक 2xx कोड सफलता का संकेत देते हैं, आप मुख्य रूप से 4xx (क्लाइंट त्रुटियाँ) और 5xx (सर्वर त्रुटियाँ), और विशेष रूप से 429 (बहुत अधिक अनुरोध) पर ध्यान केंद्रित करेंगे।
डिडिट की दर सीमित करना और इसका आपके लिए क्या मतलब है
एपीआई स्थिरता बनाए रखने के लिए डिडिट दर सीमित करता है। यह आपके एकीकरण में प्रबंधित करने के लिए एक महत्वपूर्ण पहलू है। उदाहरण के लिए, GET एंडपॉइंट्स में आमतौर पर प्रति एप्लिकेशन प्रति मिनट 300 अनुरोधों की एक वैश्विक सीमा होती है, जिसमें session-decision (100 आरपीएम) या session-v2-create (600 आरपीएम) जैसे विशिष्ट एंडपॉइंट्स की अपनी, संभावित रूप से सख्त, सीमाएँ होती हैं। जब आप दर सीमा तक पहुँचते हैं, तो डिडिट 429 Too Many Requests स्थिति कोड के साथ प्रतिक्रिया देता है और इसमें सहायक हेडर शामिल होते हैं:
X-RateLimit-Limit: वर्तमान विंडो में अनुमत अनुरोधों की अधिकतम संख्या।X-RateLimit-Remaining: वर्तमान विंडो में शेष अनुरोधों की संख्या।X-RateLimit-Reset: वह समय (इपोच सेकंड में) जब वर्तमान दर सीमा विंडो रीसेट होती है।Retry-After: (अक्सर शामिल) कोई और अनुरोध करने से पहले प्रतीक्षा करने के लिए सेकंड की संख्या।
आपके गो क्लाइंट को इन हेडर की सक्रिय रूप से निगरानी करनी चाहिए। जब X-RateLimit-Remaining एक निश्चित सीमा (उदाहरण के लिए, X-RateLimit-Limit का 15%) से नीचे गिर जाता है, तो आपको अपने अनुरोधों को सक्रिय रूप से नियंत्रित करना चाहिए। इन्हें अनदेखा करने से लगातार 429 त्रुटियाँ हो सकती हैं, जिससे सत्यापन सत्र बनाने या डिडिट के आईडी सत्यापन या एएमएल स्क्रीनिंग जैसे उत्पादों से परिणाम प्राप्त करने की आपके एप्लिकेशन की क्षमता प्रभावित हो सकती है।
गो में घातीय बैकऑफ़ के साथ मजबूत पुनः प्रयास रणनीतियों को लागू करना
क्षणिक त्रुटियों (जैसे, नेटवर्क टाइमआउट, अस्थायी सेवा अनुपलब्धता, या 429s) के लिए, पुनः प्रयास आवश्यक हैं। हालांकि, भोले-भाले पुनः प्रयास समस्याओं को बढ़ा सकते हैं। स्वर्ण मानक घबराहट के साथ घातीय बैकऑफ़ है।
घबराहट के साथ घातीय बैकऑफ़
घातीय बैकऑफ़ का अर्थ है पुनः प्रयास के बीच प्रतीक्षा समय को घातीय रूप से बढ़ाना। घबराहट (एक छोटी यादृच्छिक देरी जोड़ना) एक 'थंडरिंग हर्ड' समस्या को रोकता है जहाँ कई क्लाइंट आउटेज के बाद एक साथ पुनः प्रयास करते हैं, जिससे सेवा फिर से अभिभूत हो जाती है। यहाँ एक वैचारिक गो उदाहरण दिया गया है:
package main
import (
"fmt"
"io/ioutil"
"net/http"
"time"
"math/rand"
)
func callDiditAPIWithRetry(url string, maxRetries int) ([]byte, error) {
client := &http.Client{Timeout: 10 * time.Second}
rand.Seed(time.Now().UnixNano())
for i := 0; i <= maxRetries; i++ {
resp, err := client.Get(url)
if err != nil {
// Handle network errors (e.g., connection refused, timeout)
fmt.Printf("Attempt %d: Network error: %v\n", i+1, err)
if i == maxRetries {
return nil, fmt.Errorf("failed after %d retries: %w", maxRetries, err)
}
sleepTime := time.Duration(1<<i)*time.Second + time.Duration(rand.Intn(1000))*time.Millisecond // Exponential backoff + jitter
fmt.Printf("Retrying in %v...\n", sleepTime)
time.Sleep(sleepTime)
continue
}
defer resp.Body.Close()
switch resp.StatusCode {
case http.StatusOK:
fmt.Printf("Attempt %d: Success!\n", i+1)
return ioutil.ReadAll(resp.Body)
case http.StatusTooManyRequests:
// Respect Retry-After header if present
retryAfter := resp.Header.Get("Retry-After")
if retryAfter != "" {
if sleepSeconds, err := time.ParseDuration(retryAfter + "s"); err == nil {
fmt.Printf("Attempt %d: Rate limited. Retrying after %v.\n", i+1, sleepSeconds)
time.Sleep(sleepSeconds)
continue
}
}
// Fallback to exponential backoff if Retry-After is missing or invalid
fmt.Printf("Attempt %d: Rate limited (429).\n", i+1)
if i == maxRetries {
return nil, fmt.Errorf("rate limited after %d retries", maxRetries)
}
sleepTime := time.Duration(1<<i)*time.Second + time.Duration(rand.Intn(1000))*time.Millisecond
fmt.Printf("Retrying in %v...\n", sleepTime)
time.Sleep(sleepTime)
continue
case http.StatusInternalServerError, http.StatusBadGateway, http.StatusServiceUnavailable, http.StatusGatewayTimeout:
// Server-side errors that might be transient
fmt.Printf("Attempt %d: Server error %d. Retrying.\n", i+1, resp.StatusCode)
if i == maxRetries {
return nil, fmt.Errorf("server error %d after %d retries", resp.StatusCode, maxRetries)
}
sleepTime := time.Duration(1<<i)*time.Second + time.Duration(rand.Intn(1000))*time.Millisecond
fmt.Printf("Retrying in %v...\n", sleepTime)
time.Sleep(sleepTime)
continue
default:
// Non-retryable errors (4xx client errors, etc.)
body, _ := ioutil.ReadAll(resp.Body)
return nil, fmt.Errorf("non-retryable API error: %d %s, response: %s", resp.StatusCode, resp.Status, string(body))
}
}
return nil, fmt.Errorf("unexpected control flow") // Should not be reached
}
func main() {
// Example usage: Replace with actual Didit API endpoint
// For a real integration, you'd be POSTing to /v3/session/ or similar
// and handling the verification_url.
apiURL := "https://verification.didit.me/health"
data, err := callDiditAPIWithRetry(apiURL, 5)
if err != nil {
fmt.Println("Failed to call API:", err)
} else {
fmt.Println("API Response:", string(data))
}
}
यह स्निपेट नेटवर्क त्रुटियों, 429s (Retry-After का सम्मान करते हुए), और घातीय बैकऑफ़ और घबराहट के साथ सामान्य 5xx त्रुटियों को कैसे संभालना है, इसका प्रदर्शन करता है। यह गैर-पुनः प्रयास योग्य 4xx त्रुटियों के लिए तेजी से विफल होने को भी दर्शाता है, जो आमतौर पर गलत इनपुट के कारण होती हैं और पुनः प्रयास पर हल नहीं होंगी। यह डिडिट के मॉड्यूलर आर्किटेक्चर का उपयोग करके सत्यापन सत्र बनाने जैसे संचालन के लिए महत्वपूर्ण है।
सर्किट ब्रेकर पैटर्न को लागू करना
जबकि पुनः प्रयास क्षणिक समस्याओं में मदद करते हैं, एक विफल सेवा को लगातार पुनः प्रयास करने से यह और अधिक अधिभारित हो सकता है या यदि सेवा वास्तव में डाउन है तो संसाधनों को बर्बाद कर सकता है। यहीं पर सर्किट ब्रेकर पैटर्न आता है। एक सर्किट ब्रेकर विफलताओं की निगरानी करता है और, यदि वे एक निश्चित सीमा तक पहुँचते हैं, तो सर्किट को "खोलता" है, जिससे एक निर्धारित अवधि के लिए आगे के अनुरोधों को रोका जा सके। अवधि के बाद, यह यह देखने के लिए कुछ परीक्षण अनुरोधों की अनुमति देता है कि क्या सेवा ठीक हो गई है।
गो में, आप इस पैटर्न को लागू करने के लिए sony/gobreaker जैसी लाइब्रेरी का उपयोग कर सकते हैं:
package main
import (
"errors"
"fmt"
"io/ioutil"
"net/http"
"time"
"github.com/sony/gobreaker"
)
var cb *gobreaker.CircuitBreaker
func init() {
st := gobreaker.Settings{
Name: "DiditAPICircuitBreaker",
MaxRequests: 3, // Allow 3 requests in half-open state
Interval: 5 * time.Second, // Period to collect data for trip decisions
Timeout: 10 * time.Second, // Open circuit for 10 seconds
ReadyToTrip: func(counts gobreaker.Counts) bool {
return counts.ConsecutiveFailures > 5 // Trip after 5 consecutive failures
},
OnStateChange: func(name string, from gobreaker.State, to gobreaker.State) {
fmt.Printf("Circuit Breaker '%s' changed from %s to %s\n", name, from, to)
},
}
cb = gobreaker.NewCircuitBreaker(st)
}
func callDiditAPIWithCircuitBreaker(url string) ([]byte, error) {
body, err := cb.Execute(func() (interface{}, error) {
resp, err := http.Get(url)
if err != nil {
return nil, err // Network error
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
// Only count 5xx and 429 as failures for circuit breaker
if resp.StatusCode == http.StatusTooManyRequests || resp.StatusCode >= http.StatusInternalServerError {
return nil, fmt.Errorf("API returned status %d", resp.StatusCode)
}
// For other 4xx errors, we might not want to trip the breaker, but still return an error
bodyBytes, _ := ioutil.ReadAll(resp.Body)
return nil, fmt.Errorf("non-retryable API error: %d %s, response: %s", resp.StatusCode, resp.Status, string(bodyBytes))
}
return ioutil.ReadAll(resp.Body)
})
if err != nil {
if errors.Is(err, gobreaker.ErrOpenState) {
return nil, fmt.Errorf("circuit breaker is open: %w", err)
}
return nil, err
}
return body.([]byte), nil
}
func main() {
// Example usage
apiURL := "https://verification.didit.me/health"
for i := 0; i < 10; i++ {
data, err := callDiditAPIWithCircuitBreaker(apiURL)
if err != nil {
fmt.Printf("Call %d failed: %v\n", i+1, err)
} else {
fmt.Printf("Call %d successful: %s\n", i+1, string(data))
}
time.Sleep(1 * time.Second)
}
}
सर्किट ब्रेकर को घातीय बैकऑफ़ के साथ संयोजित करने से यह सुनिश्चित होता है कि आपका एप्लिकेशन प्रतिक्रियाशील बना रहे और एक संघर्षरत बाहरी सेवा को अभिभूत न करे। यह उच्च-मात्रा पहचान सत्यापन अनुरोधों से निपटने के लिए विशेष रूप से महत्वपूर्ण है, जैसे कि डिडिट के आईडी सत्यापन या निष्क्रिय और सक्रिय जीवंतता जांच से जुड़े।
वेबहुक विफलताओं और अतुल्यकालिक परिणामों को संभालना
डिडिट का एपीआई अक्सर वेबहुक के माध्यम से अतुल्यकालिक रूप से परिणाम प्रदान करता है, उदाहरण के लिए, जब कोई उपयोगकर्ता आईडी सत्यापन प्रवाह पूरा करता है या जब एएमएल स्क्रीनिंग जांच पूरी हो जाती है। आपका वेबहुक एंडपॉइंट मजबूत होना चाहिए। यदि आपका एंडपॉइंट वेबहुक को संसाधित करने में विफल रहता है (उदाहरण के लिए, 5xx स्थिति कोड देता है), तो डिडिट वेबहुक को वितरित करने का पुनः प्रयास करेगा। यह महत्वपूर्ण है कि:
- तत्काल रसीद स्वीकार करें: सफल रसीद का संकेत देने के लिए जितनी जल्दी हो सके 2xx स्थिति कोड लौटाएँ, भले ही प्रसंस्करण में अधिक समय लगे।
- अतुल्यकालिक रूप से संसाधित करें: वेबहुक पेलोड को पृष्ठभूमि कार्यकर्ता या संदेश कतार (जैसे, काफका, रैबिटएमक्यू) को प्रसंस्करण के लिए सौंपें। यह आपके वेबहुक एंडपॉइंट को डिडिट के पुनः प्रयास को टाइम आउट करने से रोकता है।
- आईडेम्पोटेंसी: सुनिश्चित करें कि आपका वेबहुक प्रसंस्करण तर्क आईडेम्पोटेंट है। यदि डिडिट पुनः प्रयास करता है और एक ही वेबहुक को कई बार वितरित करता है, तो आपके सिस्टम को इसे केवल एक बार संसाधित करना चाहिए ताकि डुप्लिकेट क्रियाओं या डेटा विसंगतियों से बचा जा सके।
- हस्ताक्षरों को सत्यापित करें: यह सुनिश्चित करने के लिए कि अनुरोध वास्तव में डिडिट से उत्पन्न हुआ है और इसमें छेड़छाड़ नहीं की गई है, डिडिट कंसोल से अपनी
Webhook Secret Keyका उपयोग करके हमेशा वेबहुक हस्ताक्षर को सत्यापित करें।
डिडिट कैसे मदद करता है
डिडिट को डेवलपर अनुभव और विश्वसनीयता को ध्यान में रखकर डिज़ाइन किया गया है, जो आपके गो एकीकरण के लिए उन्नत त्रुटि प्रबंधन और पुनः प्रयास रणनीतियों को स्वाभाविक रूप से सरल बनाने वाली सुविधाएँ प्रदान करता है। हमारा डेवलपर-प्रथम दृष्टिकोण का अर्थ है स्पष्ट, व्यापक एपीआई दस्तावेज़, एक तत्काल सैंडबॉक्स, और स्वच्छ एपीआई जो एकीकरण को सीधा बनाते हैं।
- पूर्वानुमेय दर सीमित करना: डिडिट वैश्विक और एंडपॉइंट-विशिष्ट दर सीमाओं को स्पष्ट रूप से परिभाषित करता है, साथ ही आपके क्लाइंट-साइड थ्रॉटलिंग और बैकऑफ़ तर्क का मार्गदर्शन करने के लिए मानक एचटीटीपी हेडर (
X-RateLimit-Limit,X-RateLimit-Remaining,X-RateLimit-Reset,Retry-After) भी प्रदान करता है। यह पारदर्शिता आपको आईडी सत्यापन और एएमएल स्क्रीनिंग जैसी सेवाओं के लिए अनुकूलित पुनः प्रयास तंत्र बनाने का अधिकार देती है। - मॉड्यूलर आर्किटेक्चर: हमारे मॉड्यूलर पहचान आदिम का मतलब है कि आप ऐसे वर्कफ़्लो बना सकते हैं जो डिज़ाइन द्वारा लचीले हैं। यदि कोई विशिष्ट जांच (उदाहरण के लिए, पते का प्रमाण) एक क्षणिक समस्या का सामना करती है, तो आपके समग्र वर्कफ़्लो को असंबंधित सत्यापन चरणों को प्रभावित किए बिना विशिष्ट घटकों को अनुकूलित या पुनः प्रयास करने के लिए कॉन्फ़िगर किया जा सकता है।
- एआई-नेटिव विश्वसनीयता: डिडिट का एआई-नेटिव बैकएंड स्केल और लचीलेपन के लिए बनाया गया है, जिससे आपको सर्वर-साइड त्रुटियाँ कम से कम मिलेंगी। यह आपको निरंतर सेवा आउटेज के बजाय नेटवर्क और क्लाइंट-साइड मुद्दों पर अपने त्रुटि प्रबंधन पर ध्यान केंद्रित करने की अनुमति देता है।
- फ्री कोर केवाईसी और लचीली मूल्य निर्धारण: कोर केवाईसी के लिए डिडिट के फ्री टियर के साथ शुरुआत करें, जिससे आप बिना किसी अग्रिम लागत के उत्पादन-जैसे वातावरण में अपनी त्रुटि प्रबंधन और पुनः प्रयास रणनीतियों का पूरी तरह से परीक्षण कर सकें। हमारा प्रति-सफल-जांच मॉडल हमारी सफलता को आपकी सफलता के साथ और संरेखित करता है।
शुरू करने के लिए तैयार हैं?
डिडिट को कार्रवाई में देखने के लिए तैयार हैं? आज ही एक निःशुल्क डेमो प्राप्त करें।
डिडिट के फ्री टियर के साथ मुफ्त में पहचान सत्यापित करना शुरू करें।