Webhooks बनाम Polling: सही इंटीग्रेशन तरीका चुनना
Webhooks बनाम पोलिंग: जानिए कैसे ये लेटेंसी, फेल्यर, रेट‑लिमिट और रिट्राई/रीप्ले पैटर्न को प्रभावित करते हैं जो डेटा को सिंक में रखते हैं।

हम सिंक करते समय कौन सी समस्या हल कर रहे हैं?
सिंक सुनने में ऐसा लगता है जैसे “अपडेट्स जल्दी दिखें,” लेकिन असल काम इससे कठिन है: दो सिस्टम्स के बीच सत्य पर सहमति बनाना, भले ही मेसेज देर से आएं, डुप्लिकेट हों, या गायब हों।
Webhooks और पोलिंग में फर्क यह है कि आप कैसे जानते हैं कि कुछ बदला।
Webhook पुश है। सिस्टम A किसी इवेंट (उदाहरण के लिए, “invoice paid”) पर आपका एंडपॉइंट कॉल करता है। पोलिंग पुल है। आपका सिस्टम शेड्यूल पर सिस्टम A से पूछता है, “पिछली बार से कुछ नया है?”
सिस्टम्स को सिंक में रखना आमतौर पर इवेंट्स और स्टेट दोनों को ट्रैक करने का काम होता है। इवेंट्स बताते हैं क्या हुआ। स्टेट बताता है रिकॉर्ड अभी कैसा दिखता है। टाइमिंग मायने रखती है क्योंकि इंटीग्रेशन शायद ही कभी परफेक्ट ऑर्डर में चलते हैं। एक “updated” इवेंट पहले आ सकता है, “created” से पहले, या दो बार आ सकता है, या कभी न भी आना।
लक्ष्य ताज़ा डेटाएक नहीं, बल्कि सही डेटा है। “सही” का मतलब है कि आप बदलाव मिस न करें, एक ही बदलाव दो बार लागू न करें, डाउनटाइम के बाद बिना मैनुअल क्लीनअप के रिकवर कर सकें, और यह साबित कर सकें कि आपने क्या और कब प्रोसेस किया।
एक व्यावहारिक उदाहरण: आपका पेमेंट प्रोवाइडर “payment_succeeded” जैसा webhook भेजता है। आपकी ऐप ऑर्डर बनाती है और उसे पेयड मार्क करती है। अगर आपका webhook एंडपॉइंट थोड़ी देर के लिए डाउन रहा, तो आप वह इवेंट कभी नहीं देख पाएंगे। एक पोलिंग जॉब जो “since yesterday” से अपडेट्स पूछता है, गैप रीकन्साइल कर सकता है और ऑर्डर स्टेट को ठीक कर सकता है।
ज्यादातर असली इंटीग्रेशन दोनों का उपयोग करते हैं: स्पीड के लिए webhooks, बैकफिल और वेरिफिकेशन के लिए polling। तरीका उतना महत्वपूर्ण नहीं है जितना कि उसके चारों ओर सुरक्षा‑बैरीयर्स।
लेटेंसी और फ्रेशनस: असल में अपडेट्स कितनी जल्दी आते हैं
जब लोग webhooks बनाम polling की तुलना करते हैं, तो वे अक्सर एक ही बात पूछते हैं: आपकी ऐप किसी बदलाव को कितनी जल्दी नोटिस करती है। यह फ्रेशनस सिर्फ अच्छा‑होने वाली बात नहीं है। यह सपोर्ट टिकट, डुप्लिकेट काम, और उपयोगकर्ताओं के भरोसे को प्रभावित करता है।
पोलिंग में अंतर्निहित देरी होती है क्योंकि आप केवल शेड्यूल पर पूछते हैं। अगर आप हर 5 मिनट में पोल करते हैं, तो अपडेट कुछ सेकंड से लेकर लगभग 5 मिनट तक देरी से आ सकता है, ऊपर से API रिस्पॉन्स टाइम। ज़्यादा बार पोल करने से फ्रेशनस बेहतर होता है, लेकिन API कॉल्स, खर्च और रेट‑लिमिट से टकराने की संभावना बढ़ती है।
Webhooks कभी‑कभी लगभग रीयल‑टाइम महसूस होते हैं क्योंकि प्रदाता घटना होते ही पुश कर देता है। पर वे तात्कालिक या गारंटीड नहीं होते। प्रदाता इवेंट्स बैच कर सकते हैं, बाद में रिट्राई कर सकते हैं, या डिलीवरी रोक सकते हैं। आपकी सिस्टम भी देरी जोड़ती है (क्यू बैकलॉग, डेटाबेस लॉक, डिप्लॉय)। एक सटीक अपेक्षा यह है: जब सब कुछ स्वस्थ हों तो तेज़, जब नहीं हों तो आखिरकार संगत (eventually consistent)।
ट्रैफ़िक का स्वरूप मायने रखता है। पोलिंग स्थिर, अनुमाननीय लोड देता है। Webhooks बर्स्टी होते हैं: एक व्यस्त घंटा सैकड़ों इवेंट्स एक मिनट में भेज सकता है, फिर कुछ नहीं। अगर आप webhooks स्वीकार करते हैं, स्पाइक्स की उम्मीद रखें और इवेंट्स को कतारबद्ध करने की योजना बनाएं ताकि आप उन्हें नियंत्रित गति से प्रोसेस कर सकें।
डिज़ाइन शुरू करने से पहले एक टार्गेट फ्रेशनस विंडो चुनें:
- सेकंड: उपयोगकर्ता‑सामने सूचनाएँ, चैट, पेमेंट स्टेटस
- मिनट: सपोर्ट टूलिंग, एडमिन व्यूज़, हल्के रिपोर्टिंग
- घंटे: नाइटली रिकंसिलीएशन, लो‑प्रायोरिटी एनालिटिक्स
अगर सेल्स टीम को नए लीड्स 1 मिनट के अंदर चाहिए, तो webhooks आपको वहां पहुंचाते हैं। कुछ घंटे में एक “सुरक्षा पोल” फिर भी मिस हुए इवेंट्स पकड़ सकता है और फाइनल स्टेट की पुष्टि कर सकता है।
प्रोडक्शन में जो फेल्यर मोड्स आप वास्तव में देखेंगे
अधिकांश इंटीग्रेशन उबाऊ, दोहराने योग्य तरीकों से फेल होते हैं। आश्चर्य यह नहीं कि कुछ टूटता है, बल्कि यह कि यह चुपचाप टूटता है। स्पीड पर बहस आसान है। विश्वसनीयता में असली काम छिपा होता है।
पोलिंग फेल्यर अक्सर ऐसे दिखते हैं: “हमने अपडेट नहीं देखा,” भले ही कोड सही लगे। टाइमआउट एक रिक्वेस्ट को बीच में काट सकते हैं। पार्टियल रिस्पॉन्स तब निकल सकते हैं जब आप सिर्फ HTTP 200 चेक करते हैं और बॉडी को वेलिडेट नहीं करते। पेजिनेशन बदलना भी आम है: एक API सॉर्ट ऑर्डर बदल देता है, पेज नियम बदलते हैं, या पेज‑नंबर से कर्सर पर चला जाता है, और आप आइटम्स को स्किप या री‑रीड कर देते हैं। एक क्लासिक गलती यह है कि updated_since को अपने लोकल क्लॉक से फिल्टर करना और क्लॉक्स के ड्रिफ्ट होने पर अपडेट्स मिस करना।
Webhooks अलग तरह से फेल होते हैं। डिलीवरी आमतौर पर “at least once” होती है, इसलिए प्रदाता नेटवर्क त्रुटियों पर रिट्राय करते हैं और आप डुप्लीकेट देखेंगे। अगर आपका एंडपॉइंट 10 मिनट के लिए डाउन रहा, तो बाद में पुराने इवेंट्स का बर्स्ट मिल सकता है। सिग्नेचर वेलिडेशन मुद्दे भी सामान्य हैं: कोई सीक्रेट रोटेट हो गया, आप गलत रॉ पेलोड वेरिफाई कर रहे हैं, या कोई प्रॉक्सी हेडर बदल देता है, और अचानक वैध इवेंट्स असमान्य दिखते हैं।
दोनों तरीके में साझा फेल्यर मोड डुप्लिकेट्स और आउट‑ऑफ‑ऑर्डर डिलीवरी है। मान लीजिए कि आपको वही इवेंट एक से अधिक बार मिलेगा, इवेंट्स देर से आएँगे, गलत क्रम में आएँगे, और पेलोड्स में वह फ़ील्ड मिस हो सकती है जिसकी आप उम्मीद कर रहे थे।
आप शायद कभी‑भी “एक बार बिल्कुल” नहीं पाते। “एट‑लीस्ट‑वन” के लिए डिज़ाइन करें, और हैंडलिंग को सेफ बनाएं। एक idempotency की रखिए (इवेंट ID या प्रोवाइडर ऑब्जेक्ट वर्ज़न), रिपीट्स को इग्नोर करें, और अपडेट तभी लागू करें जब वे आपके पास जो स्टोर है उससे नए हों। क्या मिला और आपने क्या किया इसको लॉग भी करें, ताकि आप कन्फिडेंटली रीप्ले कर सकें बजाय अनुमान लगाने के।
रेट‑लिमिट और लागत: API उपयोग को नियंत्रण में रखना
रेट‑लिमिट वही जगह है जहाँ webhooks बनाम polling थ्योरी से बजट और विश्वसनीयता की समस्या बन जाता है। हर अतिरिक्त रिक्वेस्ट समय और पैसा खर्च करती है, और यह आपके प्रोवाइडर के साथ रिश्ते को नुकसान पहुँचा सकती है।
पोलिंग कोटा जलाकर खत्म कर देती है क्योंकि आप हर बार चेक करने के लिए भुगतान करते हैं, भले ही कुछ बदला न हो। यह और खराब होता है जब लिमिट्स प्रति उपयोगकर्ता या प्रति टोकन हों: 1,000 कस्टमर्स हर मिनट पोल कर रहे हों तो यह मानो हमला लग रहा हो, भले ही हर ग्राहक “ठीक” व्यवहार कर रहा हो। पोलिंग कॉल्स को आसानी से गुणा कर देती है (लिस्ट एंडपॉइंट, फिर हर आइटम का डिटेल फेच), और इसी से आप अनपेक्षित रूप से छत तक पहुँच जाते हैं।
Webhooks ज़्यादातर API कॉल्स कम कर देते हैं, पर वे बर्स्ट‑प्रेशर पैदा करते हैं। अकेला प्रदाता आउटेज, बल्क इम्पोर्ट, या प्रोडक्ट लॉन्च के बाद हजारों इवेंट्स एक साथ भेज सकता है। कुछ आपको 429 से थ्रॉटल करेंगे, कुछ आक्रामक रूप से रिट्राई करेंगे, और कुछ इवेंट्स ड्रॉप कर देंगे अगर आपका एंडपॉइंट धीमा है। आपकी तरफ़ बैक‑प्रेशर चाहिए: जल्दी स्वीकार करें, वर्क को कतारबद्ध करें, और सुरक्षित गति से प्रोसेस करें।
कॉल्स घटाने के लिए बिना सटीकता खोए कुछ व्यवहारिक पैटर्नों पर ध्यान दें:
updated_sinceटाइमस्टैम्प या चेंज‑टोकन का इस्तेमाल कर इनक्रिमेंटल सिंक- सर्वर‑साइड फ़िल्टरिंग (सिर्फ उन इवेंट टाइप्स को सब्स्क्राइब करें जो चाहिए)
- रीड्स और राइट्स को बैच करना (डिटेल्स चंक्स में फेच करना, बैच में लिखना)
- स्थिर रेफरेंस डेटा को कैश करना (plans, status lists, user profiles)
- “रीयल‑टाइम” और “रिपोर्टिंग” जरूरतों को अलग करना (फास्ट पाथ बनाम नाइटली जॉब्स)
पीक्स की पहले से योजना बनाएं। एक समर्पित बैकफिल मोड रखें जो धीमा चले, कोटा का सम्मान करे, और पॉज़/रीस्यूम किया जा सके।
सही तरीका चुनना: एक सरल निर्णय गाइड
webhooks बनाम polling का चुनाव आमतौर पर इस पर आता है: क्या आपको स्पीड चाहिए, या क्या आपको एक सरल, अनुमाननीय तरीका चाहिए जो वेंडर अनरेलबेल होने पर भी अपडेट दे सके?
पोलिंग अक्सर बेहतर डिफ़ॉल्ट होता है जब तीसरे पक्ष के पास webhooks नहीं हैं, या जब आपका वर्कफ़्लो देरी सहन कर सकता है। यह तब भी सोचना आसान होता है जब आपको केवल दैनिक या घंटा‑आधारित सिंक चाहिए और API में स्पष्ट updated since फ़िल्टर हो।
Webhooks बेहतर डिफ़ॉल्ट होते हैं जब समय मायने रखता है: “नया ऑर्डर आ गया,” “पेमेंट फेल हुआ,” “टिकट असाइन हुआ।” वे बेकार API कॉल्स घटाते हैं और तुरंत काम ट्रिगर कर सकते हैं।
एक व्यावहारिक नियम यह है कि सहीता मायने रखे तो दोनों का उपयोग करें। Webhooks आपको स्पीड दें, और पोलिंग जो मिस हुआ उसे साफ़ करे। उदाहरण के लिए, webhooks को तेजी से प्रोसेस करें, फिर हर 15 मिनट (या कुछ घंटों) पर एक शेड्यूल्ड पोल रन करें ताकि ड्रॉप हुए इवेंट्स या अस्थायी आउटेज से हुए गैप भर सके।
एक त्वरित गाइड:
- अगर मिनट्स की देरी ठीक है, तो पोलिंग से शुरू करें।
- अगर सेकंड्स में अपडेट्स दिखना जरूरी है, तो webhooks से शुरू करें।
- अगर वेंडर फ्लेकी है या इवेंट महत्वपूर्ण हैं, तो webhook + polling की योजना बनाएं।
- अगर API पर भारी रेट‑लिमिट है, तो webhooks पसंद करें और हल्की पोलिंग रखें।
- अगर डेटा वॉल्यूम ज़्यादा है, तो बार‑बार फुल पोल्स से बचें।
कमिट करने से पहले वेंडर से कुछ सवाल पूछें और साफ़ जवाब लें:
- कौन‑कौन से इवेंट टाइप्स मौजूद हैं, और क्या वे पूर्ण हैं (create, update, delete)?
- क्या वे webhooks को रिट्राई करते हैं, और कितनी देर तक?
- क्या आप इवेंट्स को रीप्ले कर सकते हैं या टाइम‑रेंज से इवेंट हिस्ट्री फेच कर सकते हैं?
- क्या वे webhook रिक्वेस्ट्स को साइन करते हैं ताकि आप ऑथेंटिसिटी वेरिफाई कर सकें?
- क्या वे कुशल पोलिंग के लिए
updated sinceक्वेरी सपोर्ट करते हैं?
स्टेप‑बाय‑स्टेप: ऐसा सिंक डिज़ाइन करना जो सही बना रहे
“सही” सिंक सिर्फ़ यह नहीं है कि “डेटा दिखे।” इसका मतलब है कि सही रिकॉर्ड मेल खाते हैं, नवीनतम बदलाव जीतता है, और जब कुछ गलत हो तो आप साबित कर सकें कि क्या हुआ।
एक प्लान के साथ शुरू करें जिसे आप टेस्ट और मॉनिटर कर सकें:
- स्रोत‑सत्य और नियम निर्धारित करें। तय करें कौन सा सिस्टम हर फ़ील्ड का मालिक है। उदाहरण के लिए, CRM ग्राहक का नाम कंट्रोल करता है, लेकिन आपका बिलिंग टूल सब्सक्रिप्शन स्टेटस कंट्रोल करता है। यह तय करें कि “पर्याप्त ताज़ा” क्या है (जैसे “5 मिनट के अंदर”) और कौन सी गलतियाँ स्वीकार्य हैं।
- स्थिर पहचानकर्ता चुनें। तीसरे पक्ष की यूनिक ID को अपने इंटरनल ID के साथ स्टोर करें। ईमेल या नाम को की के रूप में उपयोग करने से बचें (वे बदलते हैं)। अगर उपलब्ध हो तो वर्ज़न या
updated_atटाइमस्टैम्प भी सेव करें ताकि नया डेटा पहचाना जा सके। - प्रारंभिक इंपोर्ट की योजना बनाएं, फिर इनक्रिमेंटल अपडेट्स। पहली इंपोर्ट को अलग जॉब की तरह ट्रीट करें जिसमें चेकपॉइंट हों ताकि आप रेज़्यूम कर सकें। उसके बाद केवल बदलाव प्रोसेस करें (इवेंट्स,
sinceक्वेरीज, या दोनों) और एक करसर रिकॉर्ड करें जैसे “last successful sync time।” - डिलीट्स और मर्जेस का इरादतन हैंडल करें। तय करें कि डिलीट्स रिकॉर्ड को हटा देंगी, आर्काइव करेंगी, या इनएक्टिव मार्क करेंगी। मर्ज के लिए तय करें कौन सी ID बचती है और एक ऑडिट ट्रेल रखें।
- मॉनिटरिंग सिग्नल सेट करें। सिंक लैग, फेल्ड कॉल्स, और अटके हुए क्यू को ट्रैक करें। लैग आपके थ्रेसहोल्ड के पार जाने पर अलर्ट करें, सिर्फ़ क्रैश होने पर नहीं।
इम्प्लीमेंट करते समय ये चुनाव अपने डेटा मॉडल में स्पष्ट रखें: external IDs, timestamps, status फ़ील्ड्स, और एक जगह सिंक चेकपॉइंट्स रखने की। यही स्ट्रक्चर सिंक को सही रखेगा जब असली दुनिया गड़बड़ हो जाएगी।
इडेम्पोटेंसी और ऑर्डरिंग: भरोसेमंद इंटीग्रेशन का मूल
अगर आप लंबे समय तक webhooks और polling इंटीग्रेशन बनाते हैं, तो एक नियम बार‑बार आता है: आप डुप्लिकेट्स, रिट्राईज़, और आउट‑ऑफ‑ऑर्डर अपडेट्स देखेंगे। अगर आपका सिंक एक ही संदेश को सुरक्षित री‑प्रोसेस नहीं कर सकता, तो समय के साथ वह ड्रिफ्ट कर जाएगा।
इडेम्पोटेंसी का मतलब है “एक जैसा इनपुट, एक जैसा रिज़ल्ट,” भले ही वह दो बार आए। हर इनकमिंग इवेंट को “शायद दोहराया गया” मानें, और हैंडलर को सेफ बनाएं। एक सामान्य पैटर्न है: एक डेडुप की बनाएं, चेक करें क्या आपने इसे पहले प्रोसेस किया, फिर बदलाव लागू करें।
डेडुप की के ट्रेड‑ऑफ़ होते हैं। जब प्रदाता इवेंट ID देता है तो यह सबसे अच्छा होता है। अगर नहीं, तो आप ऑब्जेक्ट वर्ज़न (जैसे इन्क्रीमेंटिंग रिविज़न) का उपयोग कर सकते हैं। टाइमस्टैम्प विंडोज़ जैसे “10 मिनट के लिए रिपीट्स इग्नोर करें” नाजुक होते हैं क्योंकि देर से आगमन हो सकता है।
ऑर्डरिंग दूसरी तरफ़ है। ग्लोबल ऑर्डरिंग दुर्लभ है, इसलिए प्रति‑ऑब्जेक्ट ऑर्डरिंग का लक्ष्य रखें। किसी टिकट, इनवॉइस, या कस्टमर पर अपडेट तभी लागू करें जब वर्ज़न आपके स्टोर किए हुए से नया हो। अगर आपके पास कोई वर्ज़न नहीं है, तो स्पष्ट नियम के साथ last‑write‑wins का उपयोग करें (उदाहरण के लिए, नया updated_at विजयी), और स्वीकार करें कि क्लॉक स्क्यू एज मामलों को पैदा कर सकता है।
रिकवर और रीप्ले करने के लिए पर्याप्त चीजें स्टोर करें ताकि अनुमान न करना पड़े:
- प्रति‑ऑब्जेक्ट “last seen” वर्ज़न या
updated_at - पोलिंग जॉब्स के लिए एक आखिरी प्रोसेस्ड करसर/चेकपॉइंट
- प्रोसेस्ड इवेंट IDs की एक तालिका (अगर यह तेज़ी से बढ़े तो रिटेंशन नियम के साथ)
- एक छोटे समय के लिए रॉ पेलोड, ताकि आप फिक्स चला सकें
उदाहरण: एक Stripe पेमेंट webhook दो बार आता है, फिर “paid” अपडेट “created” इवेंट से पहले आ जाता है। अगर आप इनवॉइस की नवीनतम स्टेट वर्ज़न स्टोर करते हैं और पुराने अपडेट्स को इग्नोर करते हैं, तो आप सही परिणाम पर पहुँचेंगे।
रिट्राई और रीप्ले पैटर्न्स जो चुप्पी में डेटा ड्रिफ्ट रोकते हैं
अधिकांश इंटीग्रेशन चुपचाप फ़ेल होते हैं। एक webhook देर से आता है, एक पोलिंग जॉब लिमिट पर पहुँचता है, या आपकी ऐप सेव करते समय टाइमआउट हो जाता है। बिना रिट्राई और रीप्ले के, सिस्टम धीरे‑धीरे असमान हो जाते हैं जब तक कोई ग्राहक शिकायत नहीं करता।
Webhook रिट्राईज़: जल्दी स्वीकार करें, सुरक्षित रूप से प्रोसेस करें
प्रदाता आमतौर पर तब रिट्राई करते हैं जब आप सफल HTTP कोड जल्दी लौटाते नहीं हैं। webhook रिक्वेस्ट को भारी काम करने की जगह एक डिलीवरी नोटिफिकेशन की तरह ट्रीट करें।
एक व्यवहारिक webhook पैटर्न:
- बेसिक वेलिडेशन (सिग्नेचर, स्कीमा, टाइमस्टैम्प) के बाद तेज़ी से
2xxसे उत्तर दें। - इवेंट को यूनिक ID के साथ स्टोर करें और उसे pending मार्क करें।
- वर्कर के साथ असिंक्रोनसली प्रोसेस करें और प्रयासों को ट्रैक करें।
- अस्थायी त्रुटियों पर बाद में रिट्राई करें। स्थायी त्रुटियों पर रोकें और अलर्ट करें।
- खराब डेटा के लिए
4xxऔर सिर्फ़ असली सर्वर समस्या के लिए5xxका उपयोग करें।
यह आम जाल में पड़ने से बचाता है: यह सोचना कि “webhook मिला” मतलब “डेटा सिंक हो गया।”
Polling रिट्राईज़: API के प्रति विनम्र रहें
पोलिंग अलग तरह से फेल होती है। जोखिम है कि छोटे आउटेज के बाद एक थंडरिंग हर्ड ऑफ़ रिट्राईज़ हो जाएँ, जो रेट‑लिमिट को और खराब करता है। एक्सपोनेंशियल बैकऑफ प्लस जिटर का उपयोग करें, और एक since करसर रखें ताकि आप सब कुछ फिर से स्कैन न करें।
जब आप अब किसी चीज़ को प्रोसेस नहीं कर सकते, उसे डेड‑लेटर क्यू (या टेबल) में डालें और कारण रिकॉर्ड करें। इससे आप सुरक्षित तरीके से निरीक्षण, मैपिंग नियम ठीक करने, और बिना अनुमान के फिर से चलाने का स्थान पाते हैं।
रीप्ले वही तरीका है जिससे आप मिस हुए इवेंट्स के बाद इलाज करते हैं। एक सरल रीप्ले रणनीति:
- एक समय‑विंडो चुनें (उदाहरण: पिछले 24 घंटे) या प्रभावित रिकॉर्ड्स का सेट।
- प्रोवाइडर से करंट स्टेट फिर से फेच करें।
- इडेम्पोटेंट तरीके से अपडेट्स को फिर से लागू करें और मिसमैच ठीक करें।
- क्या बदला और क्यों बदला उसका रिकॉर्ड रखें।
उदाहरण: आपका बिलिंग प्रोवाइडर “invoice.paid” भेजता है, पर आपका डेटाबेस 30 सेकंड के लिए लॉक था। आप इवेंट को डेड‑लेट्टर करते हैं, फिर रीप्ले करके इनवॉइस और पेमेंट स्टेटस फिर से फेच करते हैं और अपने रिकॉर्ड्स को मिलाते हैं।
आम गलतियाँ और उनसे कैसे बचें
अधिकांश सिंक बग बड़े आर्किटेक्चर की समस्याएँ नहीं होते। वे छोटी‑छोटी मान्यताओं होते हैं जो चुपचाप ड्रिफ्ट, डुप्लिकेट रिकॉर्ड, या मिस किए गए अपडेट में बदल जाती हैं।
बार‑बार दिखने वाली कुछ गलतियाँ:
- इन्क्रिमेंटल फ़िल्टर के बिना बहुत बार पोलिंग। एक करसर (updated_at, इवेंट ID, पेज टोकन) ट्रैक करें और केवल पिछले सफल रन के बाद से बदलाव पूछें।
- webhooks को गारंटीड डिलीवरी मानना। एक बैकफिल जॉब रखें जो हाल की इतिहास (उदा., पिछले 24-72 घंटे) फिर से चेक करे और जो कुछ भी मिस हुआ उसे मेल कराए।
- डुप्लिकेट्स की अनदेखी। हर राइट को इडेम्पोटेंट बनाएं। प्रदाता इवेंट ID (या स्थिर बाहरी ID) स्टोर करें और वही चेंज दोबारा लागू न करें।
- वेरिफिकेशन के बिना webhook कॉल्स स्वीकार करना। प्रदाता द्वारा दिए गए सिग्नेचर टोकन या वेरिफिकेशन मेथड को वेलिडेट करें।
- सिंक हेल्थ के बारे में अंधापन। लैग, बैकलॉग साइज, आखिरी सफल रन का समय, और एरर रेट ट्रैक करें। लैग के क्रॉस करने पर अलर्ट सेट करें।
कई “webhooks बनाम polling” बहस इस पॉइंट को मिस कर देती हैं: विश्वसनीयता किसी भी तरीके के चारों ओर की सुरक्षा‑रैलबेर से आती है। एक पेमेंट webhook दो बार आ सकता है या देर से आ सकता है। अगर आपकी सिस्टम सीधे webhook पर रिकॉर्ड बनाती है बिना इडेम्पोटेंसी के, तो आप ग्राहक को दो बार मैसेज या चार्ज कर सकते हैं।
स्वस्थ इंटीग्रेशन के लिए त्वरित चेकलिस्ट
दैनिक‑दिन के स्वास्थ्य चेक्स webhooks हों, polling हों या दोनों, लगभग समान दिखते हैं। आप यह जानना चाहेंगे कि डेटा ताज़ा है या नहीं, त्रुटियाँ जमा हो रही हैं या नहीं, और क्या आप साफ़ तरीके से रिकवर कर सकते हैं।
एक त्वरित चेकलिस्ट जिसे आप कुछ मिनटों में चला सकते हैं:
- फ्रेशनस: “last event received” या “last poll completed” को अपनी अपेक्षित लैग के साथ तुलना करें।
- फेल्यर: उन रिट्राईज़ की तलाश करें जो बढ़ रहे हों, या जॉब्स जो एक जगह अटके हों। एरर काउंट्स को “last success” टाइमस्टैम्प के साथ पेयर करें।
- कोटा: देखें कि आपने कितनी API कॉल्स का उपयोग किया और क्या बचा है। अगर आप लिमिट के नज़दीक हैं, तो पोलिंग धीमा करें और रीक्वेस्ट्स को बैच करें।
- सहीपन: सिस्टम्स के बीच टोटल्स का स्पॉट‑चेक करें (उदाहरण: “आज के ऑर्डर”) और हाल के कुछ रिकॉर्ड्स का सैंपल लें।
- रिकवरी रेडीनेस: पुष्टि करें कि आप हाल की विंडो को सुरक्षित रूप से फिर से प्रोसेस कर सकते हैं बिना डुप्लिकेट्स या मिस्ड अपडेट के।
एक उपयोगी आदत यह है कि समय‑समय पर किसी व्यस्त अवधि को नियंत्रित तरीके से रीप्ले करें और पुष्टि करें कि परिणाम प्रोडक्शन से मेल खाते हैं।
उदाहरण: वास्तविक‑दुनिया वर्कफ़्लो के लिए webhooks और polling मिलाना
कल्पना करें एक छोटी SaaS टीम को तीन सिस्टम्स को सिंक में रखना है: एक CRM (कॉन्टैक्ट्स और डील्स), Stripe पेमेंट्स (चार्जेज और रिफंड्स), और एक सपोर्ट टूल (टिकट स्टेटस)।
वे जो कुछ भी तेजी से प्रतिक्रिया चाहता है उसके लिए webhook‑फर्स्ट सेटअप इस्तेमाल करते हैं। CRM इवेंट्स कस्टमर रिकॉर्ड अपडेट करते हैं और आंतरिक टास्क ट्रिगर करते हैं। Stripe webhooks इनवॉइस बनाते हैं, पेमेंट के बाद फीचर्स अनलॉक करते हैं, और फेल चार्ज पर अकाउंट्स को पेस्ट‑ड्यू मार्क करते हैं। सपोर्ट टूल के लिए, वे अगर उपलब्ध हो तो webhooks का उपयोग करते हैं, पर वे एक शेड्यूल्ड पोल भी रखते हैं क्योंकि टिकट स्टेट्स बड़े पैमाने पर बदल सकते हैं।
वे पोलिंग को मुख्य इंजन के बजाय एक सुरक्षा‑नेट मानते हैं। हर रात, एक रिकंसिलीएशन जॉब आखली 24 घंटे के बदलावों को खींचता है और उन्हें ऐप में जो कुछ स्टोर है उससे तुलना करता है।
फिर एक वास्तविक आउटेज होता है: उनका webhook एंडपॉइंट एक डिप्लॉयमेंट के दौरान 20 मिनट के लिए डाउन रहता है।
- CRM और Stripe कुछ समय के लिए रिट्राय करते हैं।
- कुछ इवेंट्स देर से आते हैं, कुछ गलत क्रम में, और कुछ एक्सपायर भी हो सकते हैं।
- रिकंसिलीएशन पोल गैप का पता लगाता है (मिसिंग इवेंट IDs या मैच न करने वाले टोटल्स) और मिसिंग चेंजेस को बैकफिल करता है।
वे क्या लॉग करते हैं: इनकमिंग इवेंट ID, प्रोवाइडर टाइमस्टैम्प, इंटरनल रिकॉर्ड ID, और अंतिम रिज़ल्ट (created, updated, ignored)। क्या अलर्ट ट्रिगर करता है: बार‑बार webhook फेल्यर्स, रिट्राईज़ में स्पाइक, या रिकंसिलीएशन का बहुत बड़ा प्रतिशत मिसिंग अपडेट्स ढूँढना।
अगले कदम: इम्प्लीमेंट करें, मॉनिटर करें, और इटेरेट करें
अधिकांश टीमों के लिए एक व्यावहारिक डिफ़ॉल्ट सरल है: तात्कालिकता के लिए webhooks का उपयोग करें, और रिकंसिलिएशन के लिए एक छोटा पोलिंग जॉब रखें। Webhooks परिवर्तन आपको जल्दी देते हैं। पोलिंग उन चीज़ों को पकड़ता है जो आउटेज, गलत सब्स्क्रिप्शन कॉन्फ़िगरेशन, या कभी‑कभी इवेंट ड्रॉप होने की वजह से मिस हो जाती हैं।
पहले सिंक को सही बनाएं, फिर उसे तेज़ करें। हर इनकमिंग बदलाव को ऐसे ट्रीट करें कि आप उसे दोबारा लागू कर सकें बिना समस्या किए।
पहले तीन कार्रवाईयाँ:
- प्रोवाइडर के इवेंट्स और फील्ड्स को अपने इंटरनल मॉडल से मैप करें, शामिल करते हुए कि आपके लिए “delete,” “refund,” या “status change” का क्या मतलब है।
- शुरू से ही इडेम्पोटेंसी डिज़ाइन करें: एक बाहरी इवेंट ID या वर्ज़न स्टोर करें, और हर अपडेट को सुरक्षित रूप से रीप्ले करने योग्य बनाएं।
- जानबूझकर रीप्ले जोड़ें: एक “since last seen” करसर या टाइम‑विंडो पोल रखें, और जब कुछ गड़बड़ दिखे तो एक एडमिन तरीका बनाएं किसी रेंज को फिर से चलाने का।
एक बार यह चलने लगे, मॉनिटरिंग ही इसे चलाती रखती है। webhook डिलीवरी रेट, कारण के अनुसार फेल्यर्स (timeouts, 4xx, 5xx), और आपकी रिकंसिलीएशन पोल कितनी पीछे है, इन सबको ट्रैक करें। "कोई इवेंट प्राप्त नहीं हुआ" के साथ‑साथ "बहुत सारे इवेंट प्राप्त हुए" पर भी अलर्ट करें।
यदि आप यह सब बिना पूरा बैकएंड हाथ से लिखे बनाना पसंद करते हैं, तो AppMaster एक नो‑कोड विकल्प है जो आपको डेटा मॉडल करने, webhook एंडपॉइंट बनाने और विज़ुअल टूल्स से रिट्राई/रीप्ले फ्लोज़ डिज़ाइन करने देता है, जबकि डिप्लॉयमेंट के लिए असली सोर्स कोड भी जेनरेट करता है।


