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

क्यों चैटी APIs मोबाइल बैटरी घटाते हैं
एक “चैटी” API एक स्क्रीन बनाने के लिए कई छोटे‑छोटे अनुरोध चलवाता है। कागज़ पर हर अनुरोध सस्ता दिख सकता है, लेकिन फोन पर ये जल्दी से जोड़ जाते हैं।
सबसे बड़ा बैटरी प्रभाव अक्सर नेटवर्क रेडियो से आता है। सेलुलर और Wi‑Fi चिप्स डेटा भेजने और प्राप्त करने के लिए हाई‑पावर स्टेट में स्विच करते हैं। जब ऐप कई अनुरोध एक के बाद एक भेजता है, तो रेडियो बार‑बार जागता है और लंबा सक्रिय रहता है। भले ही हर रिस्पॉन्स छोटा हो, बार‑बार वेकअप असली ऊर्जा खर्च करते हैं।
CPU का भी काम होता है। हर अनुरोध का मतलब है हेडर बनाना, TLS काम करना, JSON पार्स करना, कैशेज अपडेट करना और परिणाम मर्ज करने के लिए ऐप कोड चलाना। अगर कनेक्शन्स गिरती हैं तो सेटअप काम दोहराता है।
चैटीनेस UI को भी धीमा बनाती है। एक अनुमानित लोड के बजाय स्क्रीन कई कॉल्स की चेन पर इंतज़ार करती है। स्पिनर लंबे होते हैं, आंशिक रेंडर जंप करते हैं, और कमजोर नेटवर्क पर टाइमआउट बढ़ते हैं। बैकग्राउंड रिफ्रेश भी इसी तरह खराब होता है: ज्यादा retries, ज्यादा वेकअप, ज्यादा बैटरी ड्रेन।
एक व्यावहारिक तरीका सोचना: समान UI कम राउंड‑ट्रिप्स, कम बाइट्स और कम बैकग्राउंड काम के साथ दिखाएँ।
आप सफलता को कुछ ठोस बदलावों से ट्रैक कर सकते हैं:
- प्रति स्क्रीन लोड कम API कॉल्स
- प्रति स्क्रीन कम डाउनलोडेड बाइट्स
- सेलुलर पर बेहतर मीडियन और worst‑case time to interactive
- एक ही रिज़ल्ट के लिए कम बैकग्राउंड फेच और retries
जब ये बेहतर होते हैं, प्रतिक्रिया‑क्षमता और बैटरी जीवन अक्सर साथ में सुधरते हैं।
बदलाव से पहले क्या मापें
बैचिंग या कैशिंग ट्वीक करने से पहले स्पष्ट तस्वीर लें कि ऐप आज क्या कर रहा है। तेज़ जीत अक्सर कुछ रिपीट अपराधियों को ठीक करने से आती है, लेकिन आप उन्हें तभी पाएँगे जब असली स्क्रीन और फ्लोज़ (सिर्फ एक हैप्पी‑पाथ टेस्ट नहीं) मापें।
कुछ हाई‑ट्रैफिक स्क्रीन के लिए बेसिक लॉग रखें: एक लोड पर कितने अनुरोध होते हैं, कौन‑से एंडपॉइंट्स कॉल होते हैं, भेजे और प्राप्त किए गए बाइट्स (हेडर्स और बॉडी सहित), retry और timeout दरें, और UI उपयोगयोग्य होने में कितना समय लेता है। अगर कर सकें तो error दरों को नेटवर्क प्रकार (Wi‑Fi बनाम सेलुलर) के हिसाब से अलग करें—ये विभाजन अक्सर स्थिर कनेक्शन पर छिपे मुद्दे दिखाते हैं।
फ़ोरग्राउंड ट्रैफ़िक को बैकग्राउंड से अलग रखें। एक स्क्रीन चुप लग सकती है, लेकिन फोन बैकग्राउंड रिफ्रेश, पुश‑ट्रिगरड सिंक, analytics अपलोड या “जस्ट इन केस” प्रीफेच कॉल्स से व्यस्त हो सकता है। उन्हें अलग ट्रैक करें ताकि आप गलत चीज़ ऑप्टिमाइज़ न करें।
हॉटस्पॉट्स आमतौर पर कुछ क्षणों के आसपास क्लस्टर करते हैं: ऐप लॉन्च, होम/फीड स्क्रीन, डिटेल स्क्रीन जो कई कॉल्स में फैलते हैं, और पुल‑टू‑रिफ्रेश। इनमें से एक चुनकर end‑to‑end मापें।
एक बेसलाइन बजट सेट करें ताकि टीम सहमत हो सके कि “अच्छा” कैसा लगता है। उदाहरण: “ऑर्डर ट्रैकिंग स्क्रीन का एक कोल्ड लोड 6 से ज्यादा अनुरोध न करे और स्टेट दिखाने से पहले 250 KB से ज्यादा डाउनलोड न करे।”
यदि एक सरल KPI पेयर चाहिए तो (1) प्रति स्क्रीन लोड अनुरोध और (2) retry दर से शुरू करें। retries काटना अक्सर अपेक्षा से ज़्यादा बैटरी बचाता है, क्योंकि बार‑बार retries रेडियो को लंबे समय तक सक्रिय रखते हैं।
कदम‑दर‑कदम: बैचिंग से अनुरोध घटाएँ
चैटी APIs अकस्मात बन जाते हैं। हर विजेट अपना डेटा लोड करता है और एक स्क्रीन दर्जनों छोटे कॉल्स ट्रिगर कर सकती है। सुधार आमतौर पर सरल होता है: जो चीज़ें हमेशा साथ लोड होती हैं उन्हें कम कॉल्स में लौटाएँ।
एक हाई‑ट्रैफिक स्क्रीन (होम, इनबॉक्स, ऑर्डर लिस्ट) मैप करें। ऊपर‑फोल्ड पर क्या दिखता है लिखें और हर UI एलिमेंट को उस अनुरोध तक ट्रेस करें जो उसे पावर करता है। अक्सर डुप्लिकेट मिलेंगे (उसी यूज़र प्रोफ़ाइल को दो बार फेच करना) और कॉल्स जो हमेशा साथ आती हैं (प्रोफ़ाइल + permissions + unread count)।
फिर उन कॉल्स को ग्रुप करें जो भरोसेमंद रूप से साथ होती हैं। सामान्यतः आपके पास दो विकल्प होते हैं:
- उस स्क्रीन के लिए एक उद्देश्य‑निर्मित एंडपॉइंट बनाएं (अक्सर सबसे स्थिर)
- एक बैच एंडपॉइंट जोड़ें जो संसाधनों की एक छोटी, predictable सूची स्वीकार करे
बैचेस को स्क्रीन‑आधारित और बाउंडेड रखें ताकि इन्हें कैश, मॉनिटर और डिबग करना आसान रहे।
कुछ नियम बैचिंग को गड़बड़ बनने से रोकते हैं। स्क्रीन को अभी जो चाहिए सिर्फ वही लौटाएँ, पूरी ऑब्जेक्ट्स “शायद बाद में चाहिए” के लिए न भेजें। अगर कुछ हिस्से वैकल्पिक हैं तो इसे स्पष्ट करें ताकि UI महत्वपूर्ण हिस्सों को जल्दी रेंडर कर सके। उत्तर को इस तरह डिज़ाइन करें कि आंशिक फेल्योर पूरे बैच को फुल‑रीट्राई पर मजबूर न करे। केवल फेल हुए हिस्सों को फिर से माँगना बहुत सस्ता पड़ता है बनाम पूरे बैच को दोहराना।
बैटरी बचाने वाले कैशिंग हेडर्स (सिर्फ बैंडविड्थ नहीं)
कैशिंग एक बैटरी फीचर है। हर अनुरोध रेडियो जगाता है, CPU को व्यस्त करता है और पार्सिंग व ऐप लॉजिक ट्रिगर करता है। अच्छे कैशिंग हेडर्स कई रिफ्रेश को हल्के‑फुल्के चेक में बदल देते हैं।
सबसे बड़ा लाभ कंडीशनल रिक्वेस्ट्स से मिलता है। बिना वही डेटा फिर से डाउनलोड किए, ऐप पूछता है “क्या यह बदल गया?” अगर नहीं, तो सर्वर छोटा 304 Not Modified जवाब देता है।
ऐसे रिस्पॉन्स पर ETag इस्तेमाल करें जो किसी संसाधन का वर्जन दर्शाते हैं, और क्लाइंट अगली फ़ेच पर If-None-Match भेजे। अगर ETag जनरेट करना मुश्किल है तो "updated at" संसाधनों के लिए Last-Modified और If-Modified-Since भी अच्छा काम करते हैं।
जो डेटा शायद ही बदलता है, उसके लिए कैश निर्णय स्पष्ट रखें। Cache-Control को वास्तविकता से मिलाएँ। यूज़र प्रोफाइल के लिए छोटा max-age ठीक हो सकता है, जबकि ऐप कॉन्फ़िग, रेफ़रेंस लिस्ट्स और फीचर फ्लैग्स अक्सर लंबे समय के लिए कैश किए जा सकते हैं।
ऐप साइड पर 304 को एक तेज़ पाथ मानें। JSON पार्स न करें (क्योंकि कोई नहीं है), मॉडल्स फिर से न बनाएं और UI को झटकें नहीं। स्क्रीन पर जो है उसे रखें और सिर्फ संकेतक अपडेट करें।
उदाहरण: एक ऑर्डर ट्रैकिंग स्क्रीन हर 15 सेकंड में ऑर्डर स्टेटस पोल करती है। अगर रिस्पॉन्स में ETag है तो ज्यादातर चेक 304 लौट सकते हैं। ऐप आखिरी स्टेटस रखता है और केवल तब असली काम करता है जब स्टेटस बदले (उदाहरण: “Packed” से “Shipped”)।
संवेदनशील डेटा के साथ इरादतन रहें। कैशिंग अपने आप में असुरक्षित नहीं है, लेकिन इसे साफ नियम चाहिए। पर्सनल डिटेल्स या टोकन वाले रिस्पॉन्स को कैश करने से बचें जब तक प्रोडक्ट आवश्यकताएँ अनुमति न दें। यूज़र‑विशेष डेटा के लिए छोटे लाइफटाइम रखें और सार्वजनिक कैशेज़ को प्राइवेट रिस्पॉन्स स्टोर करने से रोकें (Cache-Control: private) जब ज़रूरी हो।
स्मार्ट पेलोड्स: कम भेजें, कम पार्स करें
हर अतिरिक्त बाइट मोबाइल पर सिर्फ बैंडविड्थ से अधिक कीमत रखता है। यह रेडियो को लंबा जगाए रखता है और ऐप को JSON डिकोड और मॉडल अपडेट में CPU खर्च कराता है। यदि आप API चैटिनेस कम करना चाहते हैं तो पेलोड छोटा करना अक्सर सबसे तेज़ जीत है।
स्क्रीन‑वार पेलोड ऑडिट से शुरू करें। एक स्क्रीन चुनें (जैसे होम फीड), रिस्पॉन्स साइज़ लॉग करें और फ़ील्ड‑दर‑फ़ील्ड देखें: क्या क्लाइंट इसे रेंडर करता है, या सिर्फ निर्णय करने के लिए उपयोग करता है? अगर नहीं, तो उस एंडपॉइंट से हटा दें।
लिस्ट्स के लिए छोटा “समरी” शेप अक्सर पर्याप्त होता है। एक लिस्ट रो में अक्सर id, title, status और timestamp होता है। इसे पूरे डिस्क्रिप्शन या गहरे नेस्टेड ऑब्जेक्ट्स की ज़रूरत नहीं। जब यूज़र आइटम खोलें तब डिटेल्स फेच करें।
कुछ बदलाव जो अक्सर पेलोड तुरंत कम कर देते हैं:
- बार‑बार लंबे स्ट्रिंग्स के बदले ids या छोटे enum कोड पसंद करें
- क्लाइंट जो ऑब्जेक्ट्स के स्पष्ट डिफ़ॉल्ट मान मान सकता है उन्हें दुबारा न भेजें
- हर लिस्ट आइटम में एक ही नेस्टेड ऑब्जेक्ट बार‑बार न दोहराएँ
- फ़ील्ड नाम और टाइप स्थिर रखें ताकि क्लाइंट ज़्यादा ब्रांचिंग और फिर से पार्स न करे
कम्प्रेशन मदद कर सकता है, खासकर धीने नेटवर्क पर, लेकिन असली डिवाइसेज़ पर CPU ट्रेड‑ऑफ़ टेस्ट करें। Gzip या Brotli अक्सर ट्रांसफर साइज़ काफी घटाते हैं, पर पुराने फोन बहुत बड़े रिस्पॉन्स डीकम्प्रेस करने में समय खर्च कर सकते हैं। सबसे बड़ी जीत फिर भी यह है कि शुरुआत में ही कम डेटा भेजें।
रिस्पॉन्स शेप्स को एक कॉन्ट्रैक्ट की तरह ट्रीट करें। जब फ़ील्ड नाम और टाइप स्थिर रहते हैं तो ऐप को कम फॉलबैक और कम डिफेंसिव कोड चाहिए, जो UI को स्मूद और बैटरी उपयोग को कम रखने में मदद करता है।
ख़राब नेटवर्क और कम retries के लिए डिज़ाइन
मोबाइल ऐप केवल अनुरोध भेजने पर ही बैटरी नहीं जलाता; यह तब भी जलाता है जब अनुरोध फेल हो, retry करे, रेडियो फिर से वेक करे और काम दोहराए। अगर API केवल परफ़ेक्ट Wi‑Fi मानकर बना है तो असली यूज़र्स स्पॉटी 4G पर कीमत चुकाते हैं।
कम डेटा मांगने को आसान बनाएं। सर्वर‑साइड फ़िल्टर्स और पेजिनेशन को पसंद करें बजाय "सब कुछ डाउनलोड कर के फ़ोन पर फ़िल्टर करने" के। अगर स्क्रीन को किसी यूज़र के लिए आखरी 20 इवेंट्स चाहिए तो उस बिल्कुल क्वेरी को सपोर्ट करें ताकि ऐप सैकड़ों रो न फेच करे और ज़्यादातर फेंक दे।
डेल्टा सिंक सपोर्ट करें ताकि ऐप पूछ सके "मेरी आख़िरी चेक के बाद क्या बदला?" यह सादे टाइमस्टैम्प या बढ़ती वर्जन संख्या लौटाने जितना सरल हो सकता है, फिर क्लाइंट केवल उसी बिंदु के बाद के अपडेट्स और डिलीट्स मांगे।
Retries अनिवार्य हैं, इसलिए अपडेट्स idempotent रखें। एक retry से double‑charge, double‑submit या डुप्लिकेट न बनें। create ऑपरेशंस के लिए idempotency कीज़ और ऐसे update सेमांटिक्स जो स्टेट सेट करते हों (बदलाव जोड़ने की बजाय) काफी मदद करते हैं।
जब retries हों, retry storms से बचें। एक्सपोनेन्शियल बैकऑफ के साथ जिटर का उपयोग करें ताकि हजारों डिवाइस एक ही समय पर सर्वर न मारें और ताकि फोन हर सेकंड वेक न हो।
साफ़ एरर कोड वापस करें जो क्लाइंट को निर्णय लेने में मदद करें। 401 री‑ऑथ ट्रिगर करे, 404 आम तौर पर retry रोक दे, 409 स्टेट रिफ्रेश करवा सकता है, और 429 या 503 बैकऑफ ट्रिगर करें।
क्लाइंट व्यवहार जो API लागत बढ़ाता है
अच्छा API होने के बावजूद क्लाइंट खामोशी से नेटवर्क काम गुणा कर सकता है। मोबाइल पर ये अतिरिक्त वेकअप और रेडियो समय अक्सर बाइट्स से ज़्यादा बैटरी खर्च करते हैं।
कम बदलने वाले डेटा को कैश करें। प्रोफ़ाइल फोटो, फीचर फ्लैग्स और संदर्भ डेटा (देश, स्टेटस, कैटेगरी) हर स्क्रीन विज़िट पर फेच न करें। इन्हें डिस्क पर रखें, संवेदनशील लाइफटाइम दें और केवल ज़रूरत पर रिफ्रेश करें। अगर API validation (ETag या Last‑Modified) सपोर्ट करता है तो एक छोटी recheck अक्सर पूरा डाउनलोड से सस्ता होता है।
एक और सामान्य समस्या इन‑फ्लाइट डुप्लिकेट अनुरोध हैं। ऐप के दो हिस्से एक ही रिसोर्स के लिए एक ही समय पर माँग करते हैं (उदा., हेडर और सेटिंग्स स्क्रीन दोनों प्रोफ़ाइल माँगते हैं)। कोएलेसिंग न होने पर आप दो कॉल भेजते हैं, दो रिस्पॉन्स पार्स करते हैं और स्टेट दो बार अपडेट करते हैं। एक नेटवर्क कॉल को सिंगल सोर्स‑ऑफ़‑ट्रुथ मानें और कई कंज्यूमर्स को उसी पर वेट करने दें।
बैकग्राउंड रिफ्रेश नीयत से होना चाहिए। अगर यह जल्द ही यूज़र को कुछ नया नहीं दिखाएगा या नोटिफिकेशन ट्रिगर नहीं करेगा, तो यह अक्सर इंतज़ार कर सकता है। हर ऐप रिज़्यूम पर रिफ्रेश लॉजिक चलाने से बचें। एक छोटा कूलडाउन डालें और जांचें कि डेटा आख़िर कब अपडेट हुआ था।
यदि आप AppMaster के साथ बैकएंड बनाते हैं, तो क्लाइंट व्यवहार को सपोर्ट करना आसान होता है: स्क्रीन के इर्द‑गिर्द एंडपॉइंट बनाएं, रिस्पॉन्स स्कीमों को स्थिर रखें, और नियंत्रित तरीके से कैशिंग हेडर्स जोड़ें ताकि क्लाइंट्स अधिकतर समय चुप रह सकें।
बैचिंग, कैशिंग और पेलोड्स में सामान्य गलतियाँ
लक्ष्य है: कम रेडियो वेकअप, कम CPU काम, और कम retries। कुछ पैटर्न बचत को कैंसिल कर देते हैं और स्क्रीन को धीमा भी कर सकते हैं।
जब बैचिंग चीज़ों को खराब कर दे
बैचिंग तब मदद करती है जब तक बैच "सब कुछ दे दो" कॉल में न बदल जाए। अगर सर्वर को कई टेबल जोइन करनी पड़ें, भारी परमिशन चेक करने हों और बहुत बड़ा रिस्पॉन्स बनाना पड़े, तो वह एकल अनुरोध कई छोटे अनुरोधों से धीमा पड़ सकता है। मोबाइल पर एक धीमा अनुरोध ऐप को इंतज़ार कराता है, नेटवर्क सक्रिय रखता है और टाइमआउट जोखिम बढ़ाता है।
एक स्वस्थ बैच स्क्रीन‑आकार का है: केवल वही जो एक व्यू को चाहिए, स्पष्ट लिमिट्स के साथ। अगर आप रिस्पॉन्स एक वाक्य में नहीं बता सकते, तो एंडपॉइंट संभवतः बहुत व्यापक है।
स्टेल स्क्रीन बनाना वाला कैशिंग
स्पष्ट इनवैलिडेशन के बिना कैशिंग पुराने डेटा दिखाने का चक्र बना देती है: यूज़र पुराना डेटा देखता है, पुल‑टू‑रिफ्रेश करता है, और ऐप अतिरिक्त फुल रीलोड्स करता है। Cache-Control का इस्तेमाल एक योजना के साथ करें कि डेटा क्या अपडेट करता है (create/update actions, server events, या छोटे freshness विंडो) ताकि क्लाइंट cached responses पर भरोसा कर सके।
पोलिंग भी बैटरी का जाल है। एक तंग 5‑सेकंड टाइमर तब भी डिवाइस को व्यस्त रखता है जब कुछ नहीं बदलता। संभव हो तो सर्वर‑ड्रिवन अपडेट्स पसंद करें, या कड़ी बैकऑफ अपनाएँ (खाली पोल्स के बाद अधिक लंबा इंटरवल, बैकग्राउंड में पॉज़)।
ओवरसाइज़्ड पेलोड्स एक मूक लागत हैं। विशाल नेस्टेड ऑब्जेक्ट्स "सुविधा के लिए" लौटाना अधिक बाइट्स, अधिक JSON पार्सिंग और अधिक मेमोरी चर्न मतलब होता है। स्क्रीन को केवल जो चाहिए वही भेजें और डिटेल्स ऑन‑डिमांड लोड करें।
अंत में, बैच में आंशिक विफलताओं को नज़रअंदाज़ न करें। अगर एक सब‑रिज़ल्ट फेल हो और आप पूरे बैच को फिर से माँगें तो ट्रैफ़िक डुप्लिकेट होगा। रिस्पॉन्स इस तरह डिज़ाइन करें कि क्लाइंट केवल फेल हुए हिस्सों को फिर से माँग सके।
एक तेज़ मानसिक चेकलिस्ट: बैच bounded रखें, कैश फ्रेशनेस पहले से परिभाषित करें, तंग पोलिंग से बचें, पेलोड्स ट्रिम करें, और पार्टियल सक्सेस सपोर्ट करें।
प्री‑रिलीज़ के लिए त्वरित चेकलिस्ट
शिप करने से पहले केवल नेटवर्क व्यवहार पर एक पास करें। ज्यादातर बैटरी‑विन्स अनपेक्षित चीजों को हटाने से आते हैं: कम वेकअप, कम पार्सिंग, और बैकग्राउंड में कम retries।
अपने टॉप तीन स्क्रीन पर यह चलाएँ:
- कोल्ड लोड्स एक छोटे, अनुमानित अनुरोध संख्या में ख़त्म हों (छिपे फॉलो‑अप कॉल्स जैसे प्रति‑आइटम लुकअप पर ध्यान दें)
- रिस्पॉन्स स्पष्ट कैशिंग नियम शामिल करें (
ETagयाLast-Modifiedजहाँ फिट बैठता है) और जब कुछ न बदले तो304 Not Modifiedलौटाएँ - लिस्ट एंडपॉइंट्स बाउंडेड हों: स्थिर सॉर्टिंग, पेजिनेशन, और डिफ़ॉल्ट में कोई अनयूज्ड फ़ील्ड न
- retry लॉजिक जिटर के साथ बैकऑफ करे और उन एरर्स पर बंद हो जाएँ जो अपने आप ठीक नहीं होंगे; कुल retry समय कैप हो
- बैकग्राउंड अपडेट्स जायज़ हों; यदि यह स्पष्ट रूप से यूज़र को बदलता हुआ कुछ नहीं दिखाएगा तो लगातार पोलिंग से बचें
एक साधारण रियलिटी चेक: एक बार स्क्रीन लोड करें, एयरप्लेन मोड चालू करें, फिर उसे फिर से खोलें। अगर यह अभी भी कुछ उपयोगी दिखाता है (कैश्ड सामग्री, आखिरी ज्ञात स्टेट, मैत्रीपूर्ण प्लेसहोल्डर्स), तो आपने संभवतः अनावश्यक कॉल्स घटा दिए हैं और प्रत्याशित स्पीड भी बढ़ाई है।
उदाहरण: ऑर्डर ट्रैकिंग स्क्रीन को सस्ता बनाना
एक ग्राहक मोबाइल डेटा पर ऑर्डर ट्रैकिंग ऐप खोलता है और बैटरी 20% बची है। उन्हें एक चीज चाहिए: “मेरा पैकेज अभी कहाँ है?” स्क्रीन सरल दिख सकती है, लेकिन इसके पीछे API ट्रैफ़िक आश्चर्यजनक रूप से महंगा हो सकता है।
पहले, ऐप स्क्रीन को एक बर्स्ट ऑफ़ रिक्वेस्ट्स से लोड करता था। UI इंतज़ार करती है जबकि रेडियो बार‑बार जागता है, और कुछ कॉल्स कमजोर कनेक्शन पर टाइमआउट हो जाती हैं।
एक सामान्य “पहले” पैटर्न कुछ ऐसा दिखता है:
GET /orders/{id}ऑर्डर सार के लिएGET /orders/{id}/itemsलाइन आइटम्स के लिएGET /orders/{id}/historyस्टेटस इवेंट्स के लिएGET /meयूज़र प्रोफ़ाइल और प्रेफ़रेंसेस के लिएGET /settingsडिस्प्ले नियमों (करेंसी, तारीख़ फॉर्मैट) के लिए
अब तीन बदलाव लागू करें जो UI न बदलें।
पहला, एक सिंगल स्क्रीन एंडपॉइंट जोड़ें जो केवल वह लौटाए जो व्यू को एक राउंड‑ट्रिप में चाहिए: ऑर्डर समरी, नवीनतम स्टेटस, हालिया हिस्ट्री और आइटम टाइटल्स। दूसरा, प्रोफ़ाइल कैश करें: GET /me ETag और Cache-Control: private, max-age=86400 लौटाए ताकि ज़्यादातर ओपन तेज 304 बन जाएँ (या अगर कैश अभी भी ताजा है तो कोई अनुरोध ही न हो)। तीसरा, पेलोड स्लिम करें: आइटम्स लिस्ट केवल id, name, qty, और thumbnail_url भेजे, न कि पूरा प्रोडक्ट डिस्क्रिप्शन या अनयूज़्ड मेटाडेटा।
नतीजा: कम राउंड‑ट्रिप्स, कम बाइट्स और कमजोर नेटवर्क पर कम retries। फोन का रेडियो अधिक समय के लिए सोता रहे, और वही बैटरी बचत असल में यहीं से आती है।
यूज़र के लिए कुछ “नया” नहीं दिखेगा। स्क्रीन वही रहेगी, पर यह तेज़ लोड होगी, ज़्यादा प्रतिक्रियाशील लगेगी और कनेक्शन फ्लेकी होने पर भी काम करना जारी रखेगी।
अगले कदम: व्यवहारिक रोलआउट प्लान (और AppMaster कैसे मदद कर सकता है)
तेज़ जीत के लिए छोटे से शुरू करें और प्रभाव साबित करें। बैटरी बचत अक्सर बड़े रीराइट से नहीं बल्कि कम रेडियो वेकअप और कम पार्सिंग काम से आती है।
तीन बदलाव जो सुरक्षित, मापने योग्य और वापसी योग्य हैं:
- एक स्क्रीन end-to-end मापें (अनुरोध गणना, कुल बाइट्स, time to interactive, एरर और retry दर)
- उस स्क्रीन के अनुरोधों को एक या दो कॉल्स में बैच करें (संगतता के लिए पुराने एंडपॉइंट्स रखें)
- अपने हाई‑ट्रैफिक GET एंडपॉइंट्स पर
ETagसपोर्ट जोड़ें ताकि क्लाइंटIf-None-Matchका उपयोग कर सकें और304 Not Modifiedपा सकें
एक स्थिर उपयोग वाली फीचर चुनें, जैसे ऑर्डर लिस्ट या मैसेज इनबॉक्स। यदि संभव हो तो सर्वर‑साइड फ़्लैग के पीछे शिप करें, फिर कुछ दिनों में पुराने बनाम नए पाथ के KPIs की तुलना करें। कम अनुरोध प्रति सेशन, कम retries और प्रति सक्रिय यूज़र कम डाउनलोडेड बाइट्स देखें।
API और ऐप रिलीज़ को समन्वयित रखें ताकि पुराने क्लाइंट्स टूटें नहीं। एक व्यावहारिक नियम: नया व्यवहार पहले जोड़ें, क्लाइंट्स दूसरे स्थान पर माइग्रेट करें, और पुराना व्यवहार आख़िर में हटाएँ। अगर आप कैशिंग व्यवहार बदलते हैं तो व्यक्तिगत डेटा के साथ सावधान रहें और सुनिश्चित करें कि साझा कैशेज़ यूज़र्स को मिक्स न करें।
यदि आप बैकएंड परिवर्तन तेजी से प्रोटोटाइप और शिप करना चाहते हैं तो AppMaster (appmaster.io) आपकी मदद कर सकता है: आप विज़ुअल रूप से डेटा मॉडल कर सकते हैं, ड्रैग‑एंड‑ड्रॉप एडिटर से बिज़नेस लॉजिक बना सकते हैं, और बदलती आवश्यकताओं के साथ प्रोडक्शन‑रेडी सोर्स कोड री‑जनरेट कर सकते हैं।
पहला कदम: एक बैच्ड एंडपॉइंट और एक हाई‑ट्रैफिक स्क्रीन पर ETag लागू करें। यदि नंबर बेहतर होते हैं तो आप जान जाएंगे कि और कहां निवेश करना है।
सामान्य प्रश्न
एक अच्छा डिफ़ॉल्ट तरीका यह है कि स्क्रीन के लिए एक बजट तय करें और असली सेशन्स को मापें। कई टीमें ठंडी स्क्रीन लोड के लिए लगभग 4–8 अनुरोध को शुरुआती लक्ष्य रखेंती हैं, फिर सबसे बड़े दोषी ठीक करने के बाद इसे कड़ा करती हैं। सही संख्या वह है जो नियमित रूप से आपके time-to-interactive लक्ष्य को पूरा करे बिना retries या लंबे रेडियो‑एक्टिव पीरियड ट्रिगर किए।
जब कई कॉल हमेशा साथ होती हैं तब बैचिंग आम तौर पर मदद करती है, लेकिन बैच तब हानिकारक हो सकती है जब वह बहुत बड़ा या धीमा बन जाए। बैच के रिस्पॉन्स को “स्क्रीन‑आकार” और बाउंडेड रखें ताकि एक ही अनुरोध एकल असफल बिंदु न बन जाए। अगर बैच अक्सर टाइम‑आउट होता है या बहुत सारा अनयूज्ड डेटा लौटाता है तो उसे छोटे, ध्यानीकृत कॉल्स में वापस बाँटना बेहतर है।
सबसे बड़ा लाभ ETag और कंडीशनल रिक्वेस्ट्स (If-None-Match) से मिलता है, क्योंकि इससे कई रिफ्रेश छोटे 304 Not Modified जवाबों में बदल सकते हैं। साथ में Cache-Control ऐसे सेट करें जो डेटा के व्यवहार से मेल खाता हो, ताकि क्लाइंट अनावश्यक नेटवर्क वर्क से बच सके। अगर ETag मुश्किल हो तो Last-Modified और If-Modified-Since एक ठोस बैकअप हैं।
ETag तब उपयोग करें जब आप संसाधन का विश्वसनीय “वर्जन” चेक चाहते हैं, खासकर जब सामग्री के परिवर्तन टाइमस्टैम्प से अच्छी तरह मैप न हों। Last-Modified तब ठीक है जब सर्वर के पास साफ़ अपडेट टाइम हो और आप टाइमस्टैम्प‑स्तरीय ग्रैन्युलैरिटी स्वीकार करते हैं। यदि केवल एक ही लागू कर सकते हैं तो आम तौर पर ETag अनावश्यक डाउनलोड को टालने में अधिक सटीक रहता है।
स्क्रीन और सेशन के अनुसार इंस्ट्रूमेंट करें, केवल एंडपॉइंट के हिसाब से नहीं। अनुरोध‑काउंट, बाइट्स (हेडर्स और बाडी), retries, टाइमआउट और time-to-interactive लॉग करें, और foreground व background ट्रैफिक अलग रखें ताकि आप गलत चीज़ों को ऑप्टिमाइज़ न करें। अक्सर कुछ ही स्क्रीन या फ्लो ज़्यादा रिपीटेड वेकअप पैदा करते हैं।
बैच रिस्पॉन्स ऐसा डिज़ाइन करें कि हर सब‑रिज़ल्ट स्वतंत्र रूप से सफल या असफल हो सके, और इतनी एरर डिटेल दें कि क्लाइंट केवल वही पार्ट्स फिर से मांग सके जो फेल हुए। पूरे बैच को फिर से माँगने से बचें क्योंकि इससे फ्लेकी कनेक्टिविटी में ट्रैफ़िक डुप्लिकेट होगा।
स्क्रीन जो अभी रेंडर करती है केवल वही फ़ील्ड लौटाएँ, और सूचियों के लिए समरी शेप उपयोग करें। डिटेल फ़ील्ड्स को ऐसे एंडपॉइंट पर रखें जो तब ही लोड हों जब यूज़र आइटम खोले। इससे ओवर-द-एयर बाइट्स कटेंगे और JSON पार्सिंग तथा मॉडल अपडेट भी घटेंगे, जो फ़ोन पर CPU और बैटरी के लिए मायने रखते हैं।
एक्सपोनेन्शियल बैकऑफ के साथ जिटर इस्तेमाल करें और कुल retry विंडो को कैप करें ताकि फोन हर कुछ सेकंड में वेक न हो। write ऑपरेशंस idempotent रखें ताकि retry से डुप्लिकेट न बने। साथ ही स्पष्ट स्टेटस कोड रिटर्न करें ताकि क्लाइंट तब retry बंद कर दे जब एरर खुद से ठीक न होगा।
तंग पोलिंग इंटरवल्स रेडियो और CPU को तब भी व्यस्त रखते हैं जब कुछ बदलता नहीं। अगर पोल करना ही ज़रूरी है तो जब रिस्पॉन्स न बदले तो इंटरवल बढ़ाएँ और बैकग्राउंड में पोलिंग रोक दें। संभव हो तो इवेंट‑ड्रिवन अपडेट्स अपनाएँ ताकि ऐप तभी वेक हो जब दिखाने के लायक नया कुछ हो।
AppMaster में आप स्क्रीन‑ओरिएंटेड एंडपॉइंट बना सकते हैं और रिस्पॉन्स स्कीमाओं को स्थिर रख सकते हैं, जिससे बैचिंग और पेलोड शेपिंग आसान हो जाती है। आप वर्शनिंग लॉजिक जोड़कर और कंडीशनल रिक्वेस्ट‑सपोर्टिंग हेडर्स लौटाकर क्लाइंट्स को ‘नो‑चेंज’ तेज़ जवाब देने में मदद कर सकते हैं। व्यावहारिक तरीका: एक हाई‑ट्रैफिक स्क्रीन से शुरू करें, एक बैच्ड एंडपॉइंट शिप करें और उसके प्रमुख GETs पर ETag जोड़ें, फिर अनुरोधों और retries में गिरावट मापें।


