17 सित॰ 2025·8 मिनट पढ़ने में

मोबाइल ऐप्स के लिए API वर्जनिंग: एंडपॉइंट्स को सुरक्षित रूप से विकसित करना

मोबाइल ऐप्स के लिए API वर्जनिंग — एक साधारण रोलआउट प्लान, बैकवर्ड-कम्पैटिबल बदलाव और डिप्रिकेशन स्टेप्स ताकि पुराने ऐप वर्जन्स काम करते रहें।

मोबाइल ऐप्स के लिए API वर्जनिंग: एंडपॉइंट्स को सुरक्षित रूप से विकसित करना

क्यों API परिवर्तन मोबाइल यूज़र्स को तोड़ते हैं

मोबाइल ऐप्स एक साथ अपडेट नहीं होते। भले ही आप आज एक फिक्स भेज दें, बहुत सारे लोग पुराने वर्जन को दिनों या हफ्तों तक इस्तेमाल करते रहते हैं। कुछ लोग ऑटो-अपडेट बंद कर देते हैं। कुछ के पास स्टोरेज कम होता है। कुछ ऐप अक्सर नहीं खोलते। ऐप स्टोर की समीक्षा समय और स्टेज्ड रिलीज़ और देरी जोड़ते हैं।

यह गैप मायने रखता है क्योंकि आपका बैकएंड आमतौर पर मोबाइल क्लाइंट्स से तेज़ी से बदलता है। अगर सर्वर किसी एंडपॉइंट को बदल देता है और पुराना ऐप अभी भी उसे कॉल करता है, तो ऐप टूट सकता है भले ही यूज़र के फोन पर कुछ भी बदला न गया हो।

ब्रेकेज़ शायद साफ़-सा एरर में नहीं दिखते। यह आमतौर पर रोज़मर्रा की प्रोडक्ट समस्याओं जैसा दिखता है:

  • बैकएंड रिलीज़ के बाद लॉगिन या साइन-अप फेल होना
  • किसी फ़ील्ड के रेनाम या मूव होने पर लिस्ट्स खाली दिखना
  • ऐप उस समय क्रैश होना जब वह किसी गायब वैल्यू को पढ़ता है
  • वैलिडेशन कड़ा होने से पेमेंट फेल होना
  • रिस्पॉन्स शेप बदलने पर फ़ीचर चुपचाप गायब हो जाना

वर्जनिंग का मकसद सरल है: सर्वर सुधारों को शिप करते रहें बिना हर किसी को तुरंत अपडेट करने के लिए मजबूर किए। अपने API को एक दीर्घकालिक कॉन्ट्रैक्ट की तरह ट्रीट करें। नए ऐप वर्जन्स नए सर्वर बिहेवियर के साथ काम करने चाहिए, और पुराने वर्जन्स रियल-वर्ल्ड अपडेट साइकिल के लिए पर्याप्त समय तक काम करते रहने चाहिए।

अधिकांश कंज्यूमर ऐप्स के लिए, एक समय में कई ऐप वर्जन्स का समर्थन करने की उम्मीद रखें। आंतरिक ऐप्स कभी-कभी तेज़ी से बढ़ सकते हैं, पर यह अभी भी शायद ही पल भर में सभी क्लाइंट्स अपडेट कर दे। ओवरलैप की योजना बनाने से फेज्ड रोलआउट सपोर्ट स्पाइक की जगह शांत रहता है।

API कॉन्ट्रैक्ट के लिए “कम्पैटिबल” का क्या मतलब है

API कॉन्ट्रैक्ट आपके मोबाइल ऐप और सर्वर के बीच का वादा है: कौन सा URL कॉल करना है, कौन से इनपुट स्वीकार्य हैं, रिस्पॉन्स कैसा दिखेगा, और हर फ़ील्ड का क्या अर्थ है। जब ऐप उस वादे पर निर्भर करता है और सर्वर उसे बदल देता है, तो यूज़र को क्रैश, गायब डेटा, या काम करना बंद हुए फ़ीचर के रूप में महसूस होता है।

एक बदलाव कम्पैटिबल तब होता है जब पुराने ऐप वर्जन्स बिना कोड बदलने के API का उपयोग करते रह सकें। व्यावहारिक रूप से इसका मतलब है कि सर्वर अभी भी पुराने ऐप द्वारा भेजी गई चीज़ों को समझे और ऐसे रिस्पॉन्स लौटाए जो पुराने ऐप पार्स कर सके।

सुरक्षित और जोखिम भरे बदलावों को अलग करने का एक त्वरित तरीका:

  • ब्रेकिंग बदलाव: किसी फ़ील्ड को हटाना या रेनाम करना, टाइप बदलना (नंबर से स्ट्रिंग), किसी ऑप्शनल फ़ील्ड को अनिवार्य बनाना, एरर फॉर्मैट बदलना, वैलिडेशन इतना कड़ा कर देना कि पुराने ऐप उससे मेल न खाएँ।
  • अक्सर सुरक्षित बदलाव: नया ऑप्शनल फ़ील्ड जोड़ना, नया एंडपॉइंट जोड़ना, पुराने और नए रिक्वेस्ट फॉर्मैट दोनों स्वीकार करना, नए enum वैल्यू जोड़ना (सिर्फ तब जब ऐप अनजान वैल्यूज़ को “other” की तरह हैंडल करे)।

कम्पैटिबिलिटी को एक एंड-ऑफ-लाइफ़ प्लान भी चाहिए। पुराने बिहेवियर को रिटायर करना ठीक है, पर उसे शेड्यूल किया जाना चाहिए (उदाहरण: “v2 शिप होने के 90 दिनों तक v1 रखें”) ताकि आप बिना यूज़र्स को आश्चर्यचकित किए विकसित हो सकें।

सामान्य वर्जनिंग तरीके और उनके ट्रेड़ऑफ़

वर्जनिंग का मतलब है पुराने बिल्ड्स को एक स्थिर कॉन्ट्रैक्ट देना जबकि आप आगे बढ़ते हैं। कुछ सामान्य तरीके हैं, और हर एक जटिलता को अलग जगह पर रखता है।

URL वर्जनिंग

पाथ में वर्जन डालना (जैसे '/v1/' और '/v2/') देखने और डिबग करने में सबसे आसान होता है। यह कैशिंग, लॉगिंग और राउटिंग के साथ भी अच्छा काम करता है क्योंकि वर्जन URL का हिस्सा होता है। नुकसान यह है कि टीमें अपेक्षा से अधिक समय तक पैरेलल हैंडलर्स में लगे रह सकती हैं, भले ही फर्क छोटा हो।

हेडर-आधारित वर्जनिंग

हैडर वर्जनिंग में, क्लाइंट एक हैडर में वर्जन भेजता है (उदाहरण के लिए Accept हैडर या एक कस्टम हैडर)। URL साफ़ रहते हैं, और आप हर पाथ बदलने के बिना API विकसित कर सकते हैं। नुकसान यह है कि दृश्यता कम होती है: प्रॉक्सी, लॉग्स और इंसान अक्सर वर्जन मिस कर लेते हैं जब तक आप सावधान न हों, और मोबाइल क्लाइंट्स को हर रिक्वेस्ट पर हैडर सही ढंग से सेट करना होगा।

क्वेरी पैरामीटर वर्जनिंग

क्वेरी वर्जनिंग (जैसे ?v=2) सरल दिखती है, पर यह गड़बड़ हो जाती है। पैरामीटर बुकमार्क्स, एनालिटिक्स टूल्स, और स्क्रिप्ट्स में कॉपी हो जाते हैं, और आपके पास कई “वर्जन्स” तैरते हुए रह सकते हैं बिना स्पष्ट ओनरशिप के।

अगर एक साधारण तुलना चाहिए:

  • URL वर्जनिंग: निरीक्षण के लिए सबसे आसान, पर लंबे समय तक पैरेलल APIs बना सकती है
  • हेडर वर्जनिंग: क्लीन URLs, पर ट्रबलशूट करना मुश्किल
  • क्वेरी वर्जनिंग: शुरू करने में तेज़, पर गलत उपयोग के लिए खुला

फीचर फ्लैग्स एक अलग टूल हैं। वे आपको एक ही कॉन्ट्रैक्ट के पीछे बिहेवियर बदलने देते हैं (उदाहरण: नया रैंकिंग एल्गोरिदम) बिना नया API वर्जन बनाने के। जब रिक्वेस्ट या रिस्पॉन्स शेप बदलना आवश्यक हो तो वे वर्जनिंग की जगह नहीं लेते।

एक तरीका चुनें और उसपर टिके रहें। एकसारता “परफेक्ट” चुनाव से ज्यादा मायने रखती है।

बैकवर्ड कम्पैटिबल बदलावों के लिए नियम

सबसे सुरक्षित मानसिकता यह है: पुराने क्लाइंट्स को तब भी काम करना चाहिए जब वे आपकी नई फीचर के बारे में कभी न जानें। इसका मतलब अक्सर चीज़ें जोड़ना है, मौजूदा चीज़ें बदलना नहीं।

ऐडिटिव बदलावों को प्राथमिकता दें: नए फ़ील्ड, नए एंडपॉइंट, नए ऑप्शनल पैरामीटर। जब आप कुछ जोड़ते हैं, तो इसे सर्वर की नज़र में सचमुच ऑप्शनल रखें। अगर एक पुराना ऐप इसे नहीं भेजता, तो सर्वर को पहले जैसा ही व्यवहार करना चाहिए।

कुछ आदतें अधिकांश ब्रेकेज़ रोक देती हैं:

  • फ़ील्ड जोड़ें, पर मौजूदा फ़ील्ड का टाइप या अर्थ न बदलें।
  • गायब इनपुट को सामान्य समझें और समझदार डिफ़ॉल्ट्स का उपयोग करें।
  • अनजान रिक्वेस्ट फ़ील्ड्स को इग्नोर करें ताकि पुराने और नए क्लाइंट साथ रह सकें।
  • एरर फॉर्मैट स्थिर रखें। अगर बदलना ज़रूरी है तो एरर पेलोड को वर्जन करें।
  • अगर बिहेवियर बदलना ज़रूरी है, तो नया एंडपॉइंट या वर्जन लाएँ बजाय किसी “साइलेंट” ट्वीक के।

मौजूदा फ़ील्ड के अर्थ को वर्जन बम्प के बिना बदलने से बचें। उदाहरण के लिए, अगर status=1 पहले “paid” मतलब होता था और आप उसे “authorized” के लिए री-पर्पज़ कर देते हैं, तो पुराने ऐप्स गलत निर्णय लेंगे और शायद तब तक आपको पता भी न चले जब तक यूज़र्स शिकायत न करें।

रिनेम्स और रिमूवल्स के लिए एक योजना चाहिए। सबसे सुरक्षित पैटर्न है पुराने फ़ील्ड को रखें और नया साथ में जोड़ दें। रिस्पॉन्स दोनों को भरें, दोनों को रिक्वेस्ट में स्वीकार करें, और लोग कौन सा इस्तेमाल कर रहे हैं यह लॉग करें। डिप्रिकेशन विंडो के बाद ही पुराना फ़ील्ड हटाएँ।

एक छोटा पर शक्तिशाली नियम: जब आप नया आवश्यक बिजनेस रूल जोड़ते हैं, तो पहले क्लाइंट को उसी दिन जिम्मेदार न बनाएं। पहले सर्वर पर रूल डालें और डिफ़ॉल्ट व्यवहार दें, फिर बाद में क्लाइंट को नया वैल्यू भेजना अनिवार्य करें जब अधिकांश यूज़र्स अपडेट हो चुके हों।

एक सरल वर्जनिंग और डिप्रिकेशन पॉलिसी सेट करें

नो-कोड से तेज़ी से आगे बढ़ें
नो-कोड के साथ आंतरिक टूल और कस्टमर पोर्टल तेज़ी से बनाएं, ऐसे API के साथ जो सुरक्षित रूप से विकसित हो सकें।
AppMaster आज़माएँ

वर्जनिंग सबसे अच्छा तब काम करती है जब नियम उबाऊ और लिखित हों। पॉलिसी इतनी छोटी रखें कि प्रोडक्ट, मोबाइल और बैकएंड टीमें वास्तव में उसे फॉलो करें।

सपोर्ट विंडोज़ से शुरू करें। तय करें कि नया वर्जन शिप होने के बाद आप पुराने API वर्जन्स कितने समय तक चलाएंगे (उदाहरण: 6–12 महीने), साथ में अपवाद (सिक्योरिटी इश्यू, कानूनी बदलाव)।

फिर तय करें कि आप क्लाइंट्स को ब्रेक करने से पहले कैसे चेतावनी देंगे। एक डिप्रिकेशन सिग्नल चुनें और हर जगह उसका उपयोग करें। सामान्य विकल्पों में हैंडर जैसा Deprecation: true हेडर या कुछ रिस्पॉन्स में JSON फ़ील्ड जैसे "deprecation": {"will_stop_working_on": "2026-04-01"}। जो मायने रखता है वह है एकसारता: क्लाइंट उसे डिटेक्ट कर सके, डैशबोर्ड रिपोर्ट कर सके, और सपोर्ट टीमें समझा सकें।

एक न्यूनतम सपोर्टेड ऐप वर्जन सेट करें, और प्रवर्तन के बारे में स्पष्ट रहें। सरप्राइज़ हार्ड-ब्लॉक्स से बचें। एक व्यावहारिक तरीका यह है:

  1. सॉफ्ट चेतावनी लौटाएँ (उदा., एक फ़ील्ड जो इन-ऐप अपडेट प्रॉम्प्ट ट्रिगर करे)।
  2. केवल संप्रेषित डेडलाइन के बाद लागू करें।

अगर आप रिक्वेस्ट ब्लॉक करते हैं, तो एक स्पष्ट एरर पेलोड लौटाएँ जिसमें एक मानव-पठनीय संदेश और मशीन-रीडेबल कोड हो।

आख़िर में, तय करें कि ब्रेकिंग चेंज किसको अप्रूव करने होंगे और किस डॉक्यूमेंटेशन की ज़रूरत है। इसे सरल रखें:

  • एक मालिक ब्रेकिंग चेंज अप्रूव करे।
  • एक छोटा चेंज नोट बताये क्या बदला, कौन प्रभावित है, और माइग्रेशन पाथ क्या है।
  • टेस्ट प्लान में कम से कम एक पुराना ऐप वर्जन शामिल हो।
  • डिप्रिकेशन शुरू होते ही एक रिटायरमेंट डेट सेट की जाए।

चरण-दर-चरण रोलआउट प्लान जो पुराने ऐप्स को काम पर रखे

बदलाव बिना ब्रेक के शिप करें
नया फ़ील्ड और एंडपॉइंट जोड़ें जबकि आपका कॉन्ट्रैक्ट स्थिर रहे।
अब बनाएं

मोबाइल यूज़र्स एक ही दिन में सभी अपडेट नहीं करते, इसलिए सबसे सुरक्षित तरीका है नया API शिप करना जबकि पुराना बिना छेड़े रहे, फिर ट्रैफ़िक धीरे-धीरे मूव करना।

सबसे पहले तय करें कि v2 क्या बदलता है और v1 के व्यवहार को लॉक करें। v1 को एक वादा की तरह ट्रीट करें: वही फ़ील्ड, वही अर्थ, वही एरर कोड। अगर v2 को अलग रिस्पॉन्स शेप चाहिए, तो v1 को उसके अनुरूप न ट्वीक करें।

फिर v2 को पैरेलल में चलाएँ। इसका अर्थ अलग रूट्स (जैसे /v1/... और /v2/...) हो सकता है या एक ही गेटवे के पीछे अलग हैंडलर्स। साझा लॉजिक एक जगह रखें, पर कॉन्ट्रैक्ट अलग रखें ताकि v2 रिफैक्टर गलती से v1 न बदल दे।

फिर मोबाइल ऐप को v2 प्राथमिकता देने के लिए अपडेट करें। एक साधारण फॉलबैक बनाएं: अगर v2 not supported (या कोई और जाने-पहचाने एरर) लौटाए, तो v1 पर रीट्राई करें। यह स्टेज्ड रिलीज़ और असली नेटवर्क शरारतों के दौरान मदद करता है।

ऐप जारी करने के बाद एडेप्शन और एरर्स पर निगरानी रखें। उपयोगी चेक्स में हैं:

  • ऐप वर्जन द्वारा v1 बनाम v2 अनुरोध मात्रा
  • v2 के लिए एरर रेट और लेटेंसी
  • रिस्पॉन्स पार्सिंग फ़ेल्यर्स
  • नेटवर्किंग स्क्रीन से जुड़े क्रैशेस

जब v2 स्थिर हो, v1 के लिए स्पष्ट डिप्रिकेशन चेतावनियाँ जोड़ें और टाइमलाइन कम्यूनिकेट करें। केवल तब v1 रिटायर करें जब उपयोग उस थ्रेशोल्ड से नीचे गिर जाए जिसे आप सहन कर सकते हैं (उदाहरण: कई हफ्तों तक 1–2% से कम)।

उदाहरण: आप GET /orders में फ़िल्टरिंग और नए स्टेटस जोड़ते हैं। v2 status_details जोड़ता है जबकि v1 वही रहता है। नया ऐप v2 को कॉल करे, पर अगर कोई एज केस आए तो वह v1 पर फॉलबैक कर सके और ऑर्डर लिस्ट अभी भी दिखे।

सर्वर साइड पर कार्यान्वयन सुझाव

ज्यादातर रोलआउट ब्रेकेज़ इसलिए होते हैं क्योंकि वर्जन हैंडलिंग कंट्रोलर्स, हेल्पर्स और DB कोड में बिखरी होती है। यह निर्णय कि “यह रिक्वेस्ट किस वर्जन की है?” एक जगह रखें, और बाकी लॉजिक पूर्वानुमेय रखें।

वर्जन राउटिंग को एक गेट के पीछे रखें

एक सिग्नल चुनें (URL सेगमेंट, हैडर, या ऐप बिल्ड नंबर) और उसे जल्दी सामान्यीकृत करें। एक मॉड्यूल या मिडलवेयर में सही हैंडलर पर राउट करें ताकि हर रिक्वेस्ट एक जैसा पाथ फॉलो करे।

एक व्यावहारिक पैटर्न:

  • वर्जन को एक बार पार्स करें (और लॉग करें)।
  • वर्जन को हैंडलर (v1, v2, ...) में मैप करें एक रजिस्ट्री में।
  • साझा यूटिलिटीज़ वर्जन-एग्नॉस्टिक रखें (डेट पार्सिंग, ऑथ चेक), न कि रिस्पॉन्स-शेप लॉजिक।

वर्जन के बीच कोड साझा करते समय सावधान रहें। "शेयर्ड" कोड में v2 बग फिक्स करना गलती से v1 के व्यवहार को बदल सकता है। अगर लॉजिक आउटपुट फ़ील्ड्स या वैलिडेशन नियमों को प्रभावित करता है, तो उसे वर्जन्ड रखें या वर्जन-विशिष्ट टेस्ट कवर करें।

रोलआउट के दौरान डेटा परिवर्तन कम्पैटिबल रखें

डेटाबेस माइग्रेशन्स को दोनों वर्जन्स के लिए काम करना चाहिए। पहले कॉलम जोड़ें, ज़रूरत पड़ने पर बैकफिल करें, और बाद में ही कन्ष्ट्रेन्ट हटाएँ या कड़ा करें। रोलआउट के बीच में नाम बदलने या अर्थ बदलने से बचें। अगर फॉर्मैट स्विच करना है, तो दोनों फॉर्मैट कुछ समय के लिए लिखने पर विचार करें जब तक अधिकांश मोबाइल क्लाइंट मूव न कर लें।

एरर्स को पूर्वानुमेय बनाएं। पुराने ऐप अक्सर अनजान एरर्स को "कुछ गड़बड़ है" समझते हैं। स्थिर स्टेटस कोड्स, स्थिर एरर आइडेंटिफ़ायर्स, और छोटे संदेश क्लाइंट को निर्णय लेने में मदद करते हैं (रीट्राई, री-ऑथ, अपडेट प्रॉम्प्ट दिखाना)।

अंत में, उन मिसिंग फ़ील्ड्स से सावधान रहें जो पुराने ऐप भेजते नहीं हैं। सुरक्षित डिफ़ॉल्ट्स उपयोग करें और क्लियर, स्टेबल एरर डिटेल्स के साथ वैलिडेट करें।

मोबाइल ऐप विचार जो वर्जनिंग को प्रभावित करते हैं

वर्जन लॉजिक को पूर्वानुमेय बनाएं
विजुअल बिजनेस प्रोसेस के साथ वर्जन राउटिंग और लॉजिक केंद्रीकृत करें।
अभी आज़माएँ

चूँकि उपयोगकर्ता कई सप्ताह पुराने बिल्ड पर रह सकते हैं, वर्जनिंग को मानना होगा कि कई क्लाइंट वर्जन्स एक साथ आपके सर्वर्स को आ रहे हैं।

एक बड़ा लाभ क्लाइंट-साइड टॉलरेंस है। अगर ऐप सर्वर नया फ़ील्ड जोड़ने पर क्रैश या पार्सिंग फेल करता है, तो आप इसे “रैंडम” रोलआउट बग्स के रूप में महसूस करेंगे।

  • अनजान JSON फ़ील्ड्स को इग्नोर करें।
  • मिसिंग फ़ील्ड्स को सामान्य मान मानें और डिफ़ॉल्ट्स का उपयोग करें।
  • nulls को सुरक्षित रूप से हैंडल करें (फ़ील्ड्स माइग्रेशन के दौरान nullable बन सकती हैं)।
  • तब तक एरे ऑर्डरिंग पर निर्भर न रहें जब तक कॉन्ट्रैक्ट उसे गारंटी न दे।
  • यूज़र-फ्रेंडली एरर हैंडलिंग रखें (रिट्राई स्टेट एक खाली स्क्रीन से बेहतर है)।

नेटवर्क व्यवहार भी मायने रखता है। रोलआउट के दौरान आप अस्थायी रूप से लोड बैलेंसर या कैश के पीछे मिश्रित सर्वर वर्जन्स रख सकते हैं, और मोबाइल नेटवर्क छोटे मुद्दों को बढ़ा देते हैं।

स्पष्ट टाइमआउट और रिट्राई नियम चुनें: रीड कॉल्स के लिए छोटे टाइमआउट, अपलोड्स के लिए थोड़े लंबे, और सीमित रिट्राईज़ के साथ बैकऑफ। क्रिएट या पेमेंट जैसे कॉल्स के लिए idempotency स्टैंडर्ड बनाएं ताकि रिट्राई दोहरी सबमिशन न कर दे।

ऑथ बदलना पुराने ऐप्स को लॉक आउट करने का सबसे तेज़ तरीका है। अगर आप टोकन फॉर्मैट, आवश्यक स्कोप्स, या सेशन नियम बदलते हैं, तो दोनों पुराने और नए टोकन काम करने वाली ओवरलैप विंडो रखें। अगर कीज़ या क्लेम्स घुमानी हों तो स्टेज्ड माइग्रेशन प्लान रखें, एक ही दिन का कटओवर नहीं।

हर रिक्वेस्ट के साथ ऐप मेटाडेटा भेजें (उदाहरण: ऐप वर्जन और प्लैटफॉर्म)। इससे लक्षित चेतावनियाँ लौटाना आसान होता है बिना पूरे API को फोर्क किए।

मॉनिटरिंग और फेज्ड रोलआउट बिना आश्चर्य के

एक फेज्ड रोलआउट तभी काम करता है जब आप देख पाते हैं कि अलग-अलग ऐप वर्जन्स क्या कर रहे हैं। लक्ष्य सरल है: कौन पुराने एंडपॉइंट्स पर है यह जानें, और समस्याओं को सब पर पहुँचने से पहले पकड़ें।

शुरूआत API वर्जन द्वारा उपयोग को रोज़ ट्रैक करने से करें। केवल कुल रिक्वेस्ट न गिनें। सक्रिय डिवाइसेज़ ट्रैक करें, और लॉगिन, प्रोफ़ाइल, और पेमेंट जैसे प्रमुख एंडपॉइंट्स को ब्रेकडाउन करें। इससे आपको पता चलता है कि कोई पुराना वर्जन "अभी भी जिंदा" है या नहीं भले ही कुल ट्रैफिक छोटा दिखे।

फिर वर्जन और प्रकार के हिसाब से एरर्स देखें। 4xx में उछाल अक्सर कॉन्ट्रैक्ट मिसमैच का मतलब होता है (किसी फ़ील्ड को अनिवार्य कर दिया गया, enum वैल्यू शिफ्ट हुए, ऑथ नियम कड़े हुए)। 5xx का उछाल अक्सर सर्वर रिग्रेशन की ओर इशारा करता है (खराब डिप्लॉय, धीमे क्वेरी, डिपेंडेन्सी फेल)। दोनों को वर्जन के हिसाब से देखना तेज़ी से सही फ़िक्स चुनने में मदद करता है।

ऐप स्टोर्स में स्टेज्ड रोलआउट्स का उपयोग ब्लास्ट रेडियस सीमित करने के लिए करें। एक्सपोजर को चरणबद्ध तरीके से बढ़ाएँ और हर चरण के बाद वही डैशबोर्ड देखें (उदा., 5%, 25%, 50%)। अगर नया वर्जन समस्याएँ दिखाए, तो रोलआउट रोक दें।

रोलबैक ट्रिगर्स पहले से लिखे हुए रखें, घटना के दौरान फैसला न करें। सामान्य ट्रिगर्स में शामिल हैं:

  • 15–30 मिनट के लिए तय सीमा से ऊपर एरर रेट
  • लॉगिन सक्सेस रेट गिरना (या टोकन रिफ्रेश फेल्यर्स बढ़ना)
  • पेमेंट फेल्यर्स का बढ़ना (या चेकआउट टाइमआउट बढ़ना)
  • किसी विशेष वर्जन से जुड़े सपोर्ट टिकट्स में स्पाइक
  • किसी महत्वपूर्ण एंडपॉइंट पर लेटेंसी का बढ़ना

वर्जन-संबंधी आउटेज के लिए एक छोटा इन्सिडेंट प्लेबुक रखें: किसे पेज करना है, जोखिम भरे फ्लैग को कैसे डिसेबल करें, कौन सा सर्वर रिलीज़ रोल बैक करना है, और अगर पुराने क्लाइंट अभी भी सक्रिय हैं तो डिप्रिकेशन विंडो कैसे बढ़ाएं।

उदाहरण: एक वास्तविक रिलीज़ के दौरान एंडपॉइंट को विकसित करना

रिलीज़ को स्टैंडर्डाइज़ करें
अपना डिप्रिकेशन चेकलिस्ट एक दोहराने योग्य रिलीज वर्कफ्लो में बदलें।
प्रोजेक्ट शुरू करें

चेकआउट एक क्लासिक रीयल-वर्ल्ड चेंज है। आप सरल फ्लो से शुरू करते हैं, फिर एक नया पेमेंट स्टेप जोड़ते हैं (जैसे स्ट्रॉंगर ऑथेंटिकेशन) और फ़ील्ड के नाम बिज़नेस शब्दावली के अनुसार रीनेम करते हैं।

मान लीजिए आपका मोबाइल ऐप POST /checkout कॉल करता है।

v1 में क्या रहता है बनाम v2 में क्या बदलता है

v1 में मौजूदा रिक्वेस्ट और व्यवहार रखें ताकि पुराने ऐप वर्जन्स बिना आश्चर्य के पेमेंट्स कम्प्लीट कर सकें। v2 में नया फ्लो और साफ़ नाम पेश करें।

  • v1 रखता है: amount, currency, card_token, और एक सिंगल रिस्पॉन्स जैसे status=paid|failed
  • v2 जोड़ता है: payment_method_id (जो card_token की जगह लेता है) और एक next_action फ़ील्ड ताकि ऐप अतिरिक्त स्टेप (verify, retry, redirect) हैंडल कर सके।
  • v2 रिनेम करता है: amount को total_amount और currency को billing_currency

पुराने ऐप्स इसीलिए काम करते रहते हैं क्योंकि सर्वर सुरक्षित डिफ़ॉल्ट लागू करता है। अगर एक v1 रिक्वेस्ट next_action के बारे में नहीं जानती, तो सर्वर जहां संभव पेमेंट कम्प्लीट कर देता है और वही v1-स्टाइल परिणाम लौटाता है। अगर नया स्टेप आवश्यक है, तो v1 को एक स्पष्ट, स्थिर एरर कोड जैसे requires_update दें न कि भ्रमित करने वाला जनरिक फेलियर।

एडेप्शन, रिटायरमेंट, और रोलबैक

वर्जन द्वारा एडेप्शन ट्रैक करें: कितना हिस्सा चेकआउट कॉल्स v2 पर जाते हैं, एरर रेट्स, और कितने उपयोगकर्ता ऐसे बिल्ड्स चला रहे हैं जो केवल v1 सपोर्ट करते हैं। जब v2 उपयोग लगातार ऊँचा हो (उदाहरण: कई हफ्तों तक 95%+), और v1 उपयोग कम हो, तो v1 रिटायरमेंट डेट चुनें और उसे कम्यूनिकेट करें (रिलीज नोट्स, इन-ऐप मैसेजिंग)।

अगर लॉन्च के बाद कुछ गलत होता है, रोलबैक को साधारण रखें:

  • अधिक ट्रैफ़िक फिर से v1 व्यवहार की ओर रूट करें।
  • सर्वर-साइड फ्लैग के साथ नया पेमेंट स्टेप डिसेबल करें।
  • दोनों फ़ील्ड सेट्स को स्वीकार करते रहें, और जो आप ऑटो-कन्वर्ट कर रहे थे उसे लॉग करें।

चुप्पी से ब्रेक होने वाले सामान्य गलतियाँ

पूरा फ्लो प्रोटोटाइप करें
एक ही प्रोजेक्ट से काम करने वाला API और क्लाइंट ऐप्स के साथ अपना रोलआउट प्लान टेस्ट करें।
प्रोटोटाइप बनाएं

अधिकांश मोबाइल API फेल्यर्स जोर से नहीं आते। रिक्वेस्ट सफल हो जाती है, ऐप चलता रहता है, पर यूज़र्स को गायब डेटा, गलत टोटल या न काम करने वाले बटन दिखते हैं। ये समस्याएँ पकड़ना मुश्किल होती हैं क्योंकि वे अक्सर फेज्ड रोलआउट के दौरान पुराने ऐप वर्जन्स को प्रभावित करती हैं।

सामान्य कारण:

  • फ़ील्ड्स बदलना या हटाना (या उनका टाइप बदलना) बिना स्पष्ट वर्जन योजना के।
  • नया रिक्वेस्ट फ़ील्ड तुरंत आवश्यक बना देना, जिससे पुराने ऐप्स रिजेक्ट होने लगते हैं।
  • ऐसा डेटाबेस माइग्रेशन शिप करना जो केवल नए ऐप के होने का अनुमान लगाए।
  • इंस्टॉल्स के आधार पर v1 रिटायर कर देना, न कि सक्रिय उपयोग के आधार पर।
  • बैकग्राउंड जॉब्स और वेबहुक्स भूल जाना जो अभी भी पुराने पेलोड कॉल कर रहे हों।

एक ठोस उदाहरण: आपका रिस्पॉन्स फ़ील्ड total पहले स्ट्रिंग था ("12.50") और आप उसे नंबर (12.5) में बदल देते हैं। नए ऐप्स ठीक दिखते हैं। पुराने ऐप्स उसे ज़ीरो मान सकते हैं, छिपा सकते हैं, या कुछ स्क्रीन पर क्रैश कर सकते हैं। जब तक आप ऐप वर्जन के हिसाब से क्लाइंट एरर्स नहीं देखते, यह फिसल सकता है।

त्वरित चेकलिस्ट और अगले कदम

वर्जनिंग स्मार्ट एंडपॉइंट नेमिंग से ज़्यादा हर रिलीज़ पर वही सुरक्षा जाँच दोहराने के बारे में है।

रिलीज़ से पहले त्वरित चेक्स

  • बदलाव जोड़ने वाले रखें। पुराने ऐप्स जो फ़ील्ड पढ़ते हैं उन्हें न हटाएँ या रीनेम न करें।
  • सुरक्षित डिफ़ॉल्ट दे ताकि नए फ़ील्ड्स के बिना भी व्यवहार पुराना जैसा रहे।
  • एरर रिस्पॉन्स स्थिर रखें (स्टेटस + शेप + अर्थ)।
  • enums को सावधानी से संभालें और किसी मौजूदा वैल्यू का अर्थ न बदलें।
  • कुछ पुराने ऐप वर्जन्स से कुछ वास्तविक रिक्वेस्ट्स रप्ले करें और पुष्टि करें कि रिस्पॉन्स अभी भी पार्स होते हैं।

रोलआउट के दौरान और रिटायरमेंट से पहले त्वरित चेक्स

  • ऐप वर्जन द्वारा एडेप्शन ट्रैक करें। आप चाहते हैं कि v1 से v2 की एक स्पष्ट कर्ब हो, फ्लैट लाइन नहीं।
  • वर्जन द्वारा एरर रेट देखें। स्पाइक अक्सर पार्सिंग या वैलिडेशन का संकेत होता है जिसने पुराने क्लाइंट्स तोड़ दिया।
  • पहले सबसे अधिक फेल होने वाले एंडपॉइंट को ठीक करें, फिर रोलआउट बढ़ाएँ।
  • केवल तभी रिटायर करें जब सक्रिय उपयोग वाकई कम हो, और रिटायरमेंट तारीख कम्यूनिकेट करें।
  • फॉलबैक को बाद में हटाएँ, रिटायरमेंट विंडो के बाद।

अपनी वर्जनिंग और डिप्रिकेशन पॉलिसी एक पेज पर लिखें, फिर चेकलिस्ट को हर रिलीज़ के लिए एक रिलीज गेट में बदल दें जिसे आपकी टीम हर बार फॉलो करे।

अगर आप आंतरिक टूल्स या कस्टमर-फेसिंग ऐप्स नो-कोड प्लेटफ़ॉर्म के साथ बना रहे हैं, तब भी API को एक कॉन्ट्रैक्ट और स्पष्ट डिप्रिकेशन विंडो के रूप में ट्रीट करना मददगार रहता है। AppMaster (appmaster.io) जैसी टीमों के लिए, v1 और v2 को साथ रखना अक्सर आसान होता है क्योंकि आप बैकएंड और क्लाइंट ऐप्स को रीजनरेट कर सकते हैं जबकि रोलआउट के दौरान पुराने कॉन्ट्रैक्ट चालू रखें।

सामान्य प्रश्न

बैकएंड API परिवर्तन तब भी मोबाइल ऐप्स को क्यों तोड़ देते हैं जब यूज़र्स ने कुछ भी अपडेट नहीं किया?

मोबाइल उपयोगकर्ता एक साथ सभी अपडेट नहीं करते, इसलिए पुराने ऐप बिल्ड आपके बैकएंड को तब भी कॉल करते हैं जब आप परिवर्तन डिप्लॉय कर चुके होते हैं। अगर आप किसी एंडपॉइंट, वैलिडेशन या रिस्पॉन्स शेप को बदलते हैं, तो वे पुराने बिल्ड एडैप्ट नहीं कर पाते और खाली स्क्रीन, क्रैश या पेमेंट फेल जैसे लक्षण दिखते हैं।

मोबाइल API के लिए “बैकवर्ड कम्पैटिबल” का वास्तविक मतलब क्या है?

“कम्पैटिबल” का मतलब है कि एक पुराना ऐप वही रिक्वेस्ट कर सकता है और ऐसे रिस्पॉन्स पा सकता है जिन्हें वह बिना किसी कोड परिवर्तन के सही तरह से पार्स करके उपयोग कर सके। सबसे सुरक्षित मानसिक मॉडल यह है कि आपका API एक अनुबंध है: आप नई क्षमताएँ जोड़ सकते हैं, लेकिन मौजूदा फ़ील्ड और व्यवहारों का अर्थ बदलना नहीं चाहिए जब तक क्लाइंट अपडेट न हो।

मोबाइल API में सबसे आम ब्रेकिंग परिवर्तन कौन से हैं?

ब्रेकिंग चेंज्स वे होते हैं जो किसी मौजूदा ऐप की निर्भरता को बदल दें—जैसे फ़ील्ड हटाना/रिनेम करना, फ़ील्ड का टाइप बदलना, वैलिडेशन कड़ा करना जिससे पुराने रिक्वेस्ट फेल हों, या एरर पेलोड का फॉर्मेट बदलना। अगर पुराना ऐप रिस्पॉन्स पार्स नहीं कर सकता या रिक्वेस्ट नियम पूरा नहीं कर सकता तो वह ब्रेकिंग है, चाहे सर्वर ‘सही’ काम कर रहा हो।

मोबाइल API के लिए क्या मुझे URL वर्जनिंग या हेडर-आधारित वर्जनिंग का उपयोग करना चाहिए?

URL वर्जनिंग सामान्यतः डिफ़ॉल्ट के रूप में आसान होती है क्योंकि वर्जन लॉग्स, डिबगिंग टूल्स और राउटिंग में दिखाई देता है और इसे भूलना मुश्किल होता है। हेडर-बेस्ड वर्जनिंग भी काम कर सकती है, पर यह ट्रबलशूटिंग में मिस हो सकती है और हर क्लाइंट रिक्वेस्ट को हेडर सेट करना ज़रूरी होता है।

हमें पुराने API संस्करण कितने समय तक चलाना चाहिए?

एक साफ़ सपोर्ट विंडो चुनें जो वास्तविक मोबाइल अपडेट व्यवहार से मेल खाती हो, और उसे बनाए रखें; कई टीमें महीनों का समय चुनती हैं, न कि दिनों का। अहम बात है एक प्रकाशित रिटायरमेंट तिथि और एक्टिव उपयोग को मापना ताकि आप अनुमान न लगाएँ कि कब पुराना वर्जन बंद कर दिया जाए।

API वर्जन रिटायर होने की चेतावनी देने का व्यावहारिक तरीका क्या है?

एक सुसंगत डिप्रिकेशन सिग्नल चुनें ताकि क्लाइंट और डैशबोर्ड उसे विश्वसनीय तरीके से पहचान सकें—उदाहरण के लिए एक स्थिर रिस्पॉन्स हेडर जैसे Deprecation: true या छोटे JSON फ़ील्ड में रिटायरमेंट तारीख "deprecation": {"will_stop_working_on": "2026-04-01"}। इसे सरल और अनुमान्य रखें ताकि सपोर्ट और प्रोडक्ट टीमें इसे बिना गहराई से देखे समझा सकें।

कैसे हम रिस्पॉन्स को बदल सकते हैं बिना पुराने ऐप वर्जन्स को तोड़े?

ऐडिटिव परिवर्तन करें: नए ऑप्शनल फ़ील्ड या नए एंडपॉइंट जोड़ें और पुराने फ़ील्ड को वैसा ही रखें। जब नाम बदलना ज़रूरी हो, तो दोनों फ़ील्ड कुछ समय के लिए साथ चलाएँ और दोनों को रिस्पॉन्स में भरें ताकि पुराने ऐप्स डेटा न खोएँ जबकि नए ऐप्स नए फ़ील्ड पर जाएँ।

जब v1 और v2 दोनों लाइव हों तो डेटाबेस परिवर्तन कैसे हैंडल करें?

माइग्रेशन इस तरह डिज़ाइन करें कि दोनों API वर्जन एक साथ काम कर सकें: पहले कॉलम जोड़ें, ज़रूरत पड़े तो बैकफिल करें, और बाद में ही कन्ष्ट्रेन्ट कड़ा करें या पुराने फ़ील्ड हटाएँ। रोलआउट के बीच में नाम बदलने या अर्थ बदलने से बचें, वरना एक ऐप वर्जन ऐसा डेटा लिखेगा जिसे दूसरा पढ़ ना सके।

मोबाइल ऐप्स API परिवर्तन के लिए अधिक सहनशील कैसे बनें?

ऐप को सहनशील बनाएं: अनजाने JSON फ़ील्ड्स को इग्नोर करें, मिसिंग फ़ील्ड्स को सामान्य मान समझकर सुरक्षित डिफ़ॉल्ट्स का उपयोग करें, और nulls को बिना क्रैश किए हैंडल करें। इससे सर्वर नए फ़ील्ड जोड़ते समय या स्टेज्ड डिप्लॉयस के दौरान होने वाले वैरिएशन पर ‘रैंडम’ बग्स कम होंगे।

स्टेज्ड रोलआउट के दौरान हमें क्या मॉनिटर करना चाहिए, और v1 कब सुरक्षित रूप से रिटायर किया जा सकता है?

API वर्जन और ऐप वर्जन के हिसाब से उपयोग और एरर्स को ट्रैक करें, खासकर लॉगिन और पेमेंट के लिए, और स्टेज्ड रोलआउट तभी बढ़ाएँ जब डेटा स्थिर दिखे। एक सुरक्षित रोलआउट प्लान v1 व्यवहार को लॉक रखता है, v2 को पैरेलल में चलाता है, और क्लाइंट्स को ग्रेजुएली मूव करता है साथ में क्लियर फॉलबैक रणनीति रखता है—जब तक एडेप्शन काफी ऊँचा न हो और आप कंफर्टेबल तरीके से v1 रिटायर कर सकें।

शुरू करना आसान
कुछ बनाएं अद्भुत

फ्री प्लान के साथ ऐपमास्टर के साथ प्रयोग करें।
जब आप तैयार होंगे तब आप उचित सदस्यता चुन सकते हैं।

शुरू हो जाओ