Feature Flag एक डेवलपमेंट तकनीक है जिसमें एप्लिकेशन की कार्यक्षमता को रनटाइम पर सशर्त स्विच के माध्यम से सक्षम या अक्षम किया जाता है, बिना नया कोड डिप्लॉय किए। पारंपरिक दृष्टिकोण “commit — deploy” के बजाय, feature flags डिप्लॉयमेंट के क्षण को कार्यक्षमता सक्षम करने के क्षण से अलग करने की अनुमति देते हैं। LaunchDarkly (2024) के अनुसार, feature flags का उपयोग करने वाली टीमें नई सुविधाओं के रोलआउट समय को 40% तक कम करती हैं। Feature flags आधुनिक मोबाइल और वेब एप्लिकेशन के लिए CI/CD का एक अनिवार्य तत्व बन गए हैं।
मुख्य बातें
Feature Flag (फ़ीचर टॉगल) एक तंत्र है जो कोड को संशोधित किए बिना एप्लिकेशन व्यवहार को बदलने की अनुमति देता है। अपने सरलतम रूप में, यह एक सशर्त निर्माण है जो नई कार्यक्षमता निष्पादित करने से पहले फ़्लैग मान की जांच करता है। फ़्लैग को कॉन्फ़िगरेशन फ़ाइल, डेटाबेस या बाहरी सेवा में संग्रहीत किया जा सकता है और वास्तविक समय में बदला जा सकता है। यह दृष्टिकोण टीमों को मुख्य शाखा में अधूरा कोड कमिट करने की क्षमता देता है, बिना इस डर के कि यह विकास पूरा होने से पहले उपयोगकर्ताओं तक पहुंच जाएगा।
Feature flags का मुख्य उद्देश्य डिप्लॉयमेंट को रिलीज़ से अलग करना है। डिप्लॉयमेंट सर्वर या ऐप स्टोर पर कोड रखने की प्रक्रिया है। रिलीज़ वह क्षण है जब कार्यक्षमता उपयोगकर्ता के लिए उपलब्ध हो जाती है। Feature flags के बिना, ये घटनाएँ संपाती होती हैं: कोड प्रोडक्शन में जाता है — उपयोगकर्ता इसे देखते हैं। Feature flags के साथ, कोड रिलीज़ से हफ्तों पहले प्रोडक्शन में डिप्लॉय किया जा सकता है, आंतरिक परीक्षण के लिए सक्षम किया जा सकता है, या धीरे-धीरे दर्शकों तक पहुंचाया जा सकता है। यह trunk-based development और सतत वितरण के लिए महत्वपूर्ण है।
एक मोबाइल Kotlin एप्लिकेशन में बुनियादी feature flag कार्यान्वयन पर विचार करें। फ़्लैग Firebase Remote Config में संग्रहीत होता है और ऐप शुरू होने पर लोड होता है। फ़्लैग मान के आधार पर, पुराना या नया प्रोफ़ाइल स्क्रीन दिखाया जाता है। यह कार्यान्वयन App Store में अपडेट प्रकाशित किए बिना प्रोफ़ाइल का नया संस्करण जारी करने की अनुमति देता है — बस Firebase कंसोल में मान बदलें।
class ProfileFeature {
private val flags = FeatureFlagProvider()
private val profileFlag = FlagKey("new_profile_enabled")
fun getProfileScreen(): Screen {
return if (flags.isEnabled(profileFlag)) {
NewProfileScreen()
} else {
LegacyProfileScreen()
}
}
}
class FeatureFlagProvider {
fun isEnabled(key: FlagKey): Boolean {
val raw = Firebase.remoteConfig.getString(key.name)
return raw.toBoolean()
}
}
सभी feature flags एक जैसे नहीं होते। मार्टिन फाउलर का वर्गीकरण चार प्रकार के फ़्लैग की पहचान करता है, जो उपयोग उद्देश्य, जीवनकाल और प्रबंधन आवश्यकताओं में भिन्न होते हैं। सही फ़्लैग वर्गीकरण उपयुक्त बुनियादी ढाँचा चुनने और सामान्य समस्याओं से बचने में मदद करता है।
Release toggles सबसे सामान्य प्रकार के फ़्लैग हैं। इनका उपयोग प्रोडक्शन में अधूरी कार्यक्षमता को छिपाने के लिए किया जाता है। डेवलपर एक फ़्लैग में लिपटे कोड को मुख्य शाखा में कमिट करता है और धीरे-धीरे कार्यक्षमता पूरी करता है। पूर्णता और परीक्षण के बाद, फ़्लैग सभी उपयोगकर्ताओं के लिए सक्षम किया जाता है। ऐसे फ़्लैग का जीवनचक्र कुछ दिनों से दो सप्ताह तक होता है। पूर्ण रोलआउट के बाद, फ़्लैग को कोड से हटा दिया जाता है। Release toggles trunk-based development की नींव हैं।
Experiment toggles A/B परीक्षण के साथ मिलकर काम करते हैं। वे केवल कार्यक्षमता को चालू/बंद नहीं करते, बल्कि उपयोगकर्ता को प्रयोगात्मक समूहों में से एक में निर्देशित करते हैं। ऐसे फ़्लैग अक्सर जटिल लक्ष्यीकरण नियमों (क्षेत्र, OS संस्करण, सदस्यता के अनुसार) और विश्लेषण प्रणालियों के साथ एकीकरण का समर्थन करते हैं। Ops toggles का उपयोग परिचालन नियंत्रण के लिए किया जाता है — उदाहरण के लिए, उच्च लोड के तहत किसी भारी सुविधा को अक्षम करना या तत्काल डिप्लॉयमेंट के बिना किसी समस्याग्रस्त मॉड्यूल को अस्थायी रूप से बंद करना। Ops toggles को यथासंभव तेज़ और विश्वसनीय होना चाहिए, क्योंकि सेवा की स्थिरता उन पर निर्भर करती है।
| प्रकार | अवधि | गतिशीलता | उद्देश्य |
|---|---|---|---|
| Release | दिन-सप्ताह | स्थिर | अधूरा कोड छिपाना |
| Experiment | दिन-महीने | गतिशील | A/B परीक्षण और रोलआउट |
| Ops | घंटे-दिन | गतिशील | परिचालन नियंत्रण |
| Permission | महीने+ | स्थिर | पहुँच नियंत्रण |
Feature flags प्रबंधन एक अलग अनुशासन है जिसमें फ़्लैग का भंडारण, कॉन्फ़िगरेशन, निगरानी और ऑडिट शामिल है। प्रबंधन प्रणाली के बिना, फ़्लैग अनियंत्रित तकनीकी ऋण में बदल जाते हैं जो विकास को धीमा कर देता है। आइए एक प्रोडक्शन सिस्टम के उदाहरण का उपयोग करके प्रबंधन के प्रमुख पहलुओं को देखें।
प्रत्येक feature flag चार चरणों से गुजरता है: निर्माण, उपयोग, स्थिरीकरण और हटाना। निर्माण चरण में, फ़्लैग कुंजी, प्रकार और डिफ़ॉल्ट मान परिभाषित किए जाते हैं। उपयोग के दौरान, टीम निगरानी करती है कि किसने फ़्लैग सक्षम किया, किस दर्शक के लिए और किस उद्देश्य से। स्थिरीकरण के बाद (कार्यक्षमता पूरी तरह से तैयार और परीक्षित), फ़्लैग को कोड से हटाया जाना चाहिए। हटाने की प्रक्रिया कोड समीक्षा के माध्यम से स्वचालित होती है: CI जाँच करता है कि 100% उपयोगकर्ताओं के लिए सक्षम सभी फ़्लैग में हटाने का कार्य हो।
Feature flags को केंद्रीय रूप से संग्रहीत किया जाना चाहिए, न कि प्रत्येक सेवा की कॉन्फ़िगरेशन फ़ाइलों में बिखरा हुआ। आदर्श रूप से — UI के साथ एक समर्पित सेवा (LaunchDarkly, Unleash)। न्यूनतम स्वीकार्य विकल्प रिपॉजिटरी में एक JSON कॉन्फ़िग है जिसमें परिवर्तनों के लिए कोड समीक्षा हो। फ़्लैग संग्रहीत करने के लिए डेटाबेस कम पसंदीदा है क्योंकि इसके लिए एक अलग प्रबंधन इंटरफ़ेस की आवश्यकता होती है। प्रत्येक फ़्लैग का एक स्वामी (टीम या विशिष्ट डेवलपर), विवरण और जीवनकाल (TTL) होना चाहिए। पुराने फ़्लैग का नियमित ऑडिट एक अनिवार्य अभ्यास है, जो CI कार्य के माध्यम से स्वचालित होता है जो N दिनों से अधिक समय से अपरिवर्तित फ़्लैग की जाँच करता है।
Feature flags प्रबंधन उपकरणों के बाज़ार में पूर्ण प्रबंधन चक्र वाले वाणिज्यिक प्लेटफ़ॉर्म और स्व-डिप्लॉयमेंट के लिए ओपन-सोर्स समाधान दोनों शामिल हैं। उपकरण का चुनाव टीम के आकार, विलंबता आवश्यकताओं और अनुपालन पर निर्भर करता है।
LaunchDarkly सभी लोकप्रिय भाषाओं और प्लेटफ़ॉर्म (iOS, Android, Web, Backend) के लिए SDK के साथ बाज़ार का नेता है। यह मल्टी-एनवायरनमेंट, नियम-आधारित लक्ष्यीकरण, A/B प्रयोग और स्वचालित फ़्लैग हटाने का समर्थन करता है। Split एंटरप्राइज़ सुविधाओं पर केंद्रित एक विकल्प है: भूमिका-आधारित पहुँच, ऑडिट लॉग और अनुपालन (SOC2, HIPAA)। ConfigCat एक हल्का और अधिक किफ़ायती समाधान है जो छोटी टीमों के लिए उपयुक्त है। सभी प्लेटफ़ॉर्म मान कैशिंग और एप्लिकेशन विलंबता पर न्यूनतम प्रभाव के साथ SDK प्रदान करते हैं।
Unleash UI, API और सभी प्रमुख प्लेटफ़ॉर्म के लिए SDK के साथ सबसे लोकप्रिय ओपन-सोर्स समाधान है। यह सक्रियण रणनीतियों, कस्टम संदर्भों और निगरानी के लिए Prometheus के साथ एकीकरण का समर्थन करता है। Flagsmith अंतर्निहित A/B परीक्षण और पर्यावरण प्रबंधन के साथ एक विकल्प है। ओपन-सोर्स समाधानों के लिए बुनियादी ढाँचा डिप्लॉयमेंट और रखरखाव की आवश्यकता होती है, लेकिन डेटा पर पूर्ण नियंत्रण देते हैं और उनके पास कोई लाइसेंसिंग प्रतिबंध नहीं है। मोबाइल एप्लिकेशन के लिए, दोनों समाधान ऑफ़लाइन फ़्लैग मान कैशिंग के साथ मूल SDK प्रदान करते हैं।
Feature flags एक शक्तिशाली उपकरण है, लेकिन अनुशासन के बिना वे तकनीकी ऋण बनाते हैं और कोड को जटिल बनाते हैं। मार्टिन फाउलर और LaunchDarkly इंजीनियरों ने अभ्यासों का एक सेट तैयार किया है जो नकारात्मक परिणामों के बिना feature flags से अधिकतम लाभ प्राप्त करने में मदद करता है। आइए प्रोडक्शन सिस्टम के लिए प्रमुख सिफ़ारिशों की समीक्षा करें।
प्रत्येक feature flag जो रोलआउट पूरा होने के बाद नहीं हटाया गया, तकनीकी ऋण बन जाता है। LaunchDarkly (2024) के एक अध्ययन से पता चला कि औसतन 30–40% फ़्लैग आवश्यकता न होने के बाद भी कोड में बने रहते हैं। समाधान: “एक फ़्लैग — एक कार्य” नियम लागू करें। फ़्लैग बनाते समय, टास्क ट्रैकर में एक समय सीमा के साथ हटाने का कार्य बनाया जाता है। CI जाँच करता है कि 30 दिनों से अधिक समय तक 100% सक्षम कोई फ़्लैग न हो। कोड समीक्षा को न केवल फ़्लैग जोड़ने बल्कि हटाने की भी जाँच करनी चाहिए।
Feature flags परीक्षण के लिए संयोजनात्मक जटिलता बनाते हैं: प्रत्येक फ़्लैग एप्लिकेशन की संभावित स्थितियों की संख्या को दोगुना कर देता है। इस जटिलता को प्रबंधित करने के लिए, मैट्रिक्स परीक्षण जो सभी फ़्लैग संयोजनों की जाँच करते हैं और फ़्लैग टॉगलिंग एकीकरण परीक्षण का उपयोग किया जाता है। CI पाइपलाइन में एक चरण जोड़ा जाता है जो विभिन्न फ़्लैग मान संयोजनों के साथ परीक्षण चलाता है। महत्वपूर्ण फ़्लैग (ops toggles) के लिए, लोड परीक्षण अनिवार्य हैं ताकि यह सत्यापित हो सके कि फ़्लैग स्विच करने से विलंबता स्पाइक या त्रुटियाँ न हों।
class FeatureFlagService:
def __init__(self, storage):
self.storage = storage
def is_enabled(self, flag_key, user_context):
flag = self.storage.get(flag_key)
if not flag:
return False
for rule in flag["rules"]:
if self._match_rule(rule, user_context):
return rule["value"]
return flag["default"]
def _match_rule(self, rule, context):
return (
rule["percentage"] > self._hash(context.user_id)
)
अक्सर पूछे जाने वाले प्रश्न
शब्दों का अक्सर एक दूसरे के स्थान पर उपयोग किया जाता है, लेकिन एक बारीकियाँ है: feature flag आमतौर पर केंद्रीकृत प्रबंधन, UI और SDK के साथ एक अधिक परिपक्व प्रणाली को संदर्भित करता है, जबकि feature toggle कोड में एक सरल बाइनरी स्विच है। मार्टिन फाउलर feature toggle को सामान्य शब्द के रूप में उपयोग करते हैं, लेकिन उद्योग में feature flag अक्सर वाणिज्यिक प्लेटफ़ॉर्म (LaunchDarkly, Split) से जुड़ा होता है।
उचित कार्यान्वयन के साथ प्रदर्शन पर प्रभाव न्यूनतम होता है। सर्वोत्तम अभ्यास: फ़्लैग मानों को 30–60 सेकंड के TTL के साथ मेमोरी में कैश करें, फ़्लैग की जाँच करते समय सिंक्रोनस HTTP कॉल से बचें, स्थानीय कैश और पृष्ठभूमि सिंक्रोनाइज़ेशन वाले SDK का उपयोग करें। LaunchDarkly के अनुसार, उनके SDK की p99 विलंबता 5 ms से कम है, जो अधिकांश एप्लिकेशन के लिए नगण्य है।
Feature flags का उपयोग महत्वपूर्ण वित्तीय संचालनों में व्यावसायिक तर्क बदलने के लिए अनुशंसित नहीं है, जहाँ यह जानना महत्वपूर्ण है कि कौन सा कोड चल रहा है। सुरक्षा कार्यों (प्राधिकरण, एन्क्रिप्शन) के लिए भी फ़्लैग से बचें — ऐसे फ़्लैग को अक्षम करने से कमज़ोरी पैदा होती है। बुनियादी ढाँचे में बदलाव (डेटाबेस माइग्रेशन, नई आर्किटेक्चर में माइग्रेशन) के लिए, feature flags उपयोगी हैं लेकिन विशेष रूप से गहन परीक्षण की आवश्यकता होती है।
मुख्य दृष्टिकोण मैट्रिक्स परीक्षण है: सभी फ़्लैग संयोजनों के साथ परीक्षण चलाना। CI/CD के लिए यह बहुत महँगा हो सकता है (2^n संयोजन), इसलिए व्यवहार में सभी फ़्लैग का अलग-अलग दोनों स्थितियों (चालू/बंद) में परीक्षण किया जाता है, और केवल महत्वपूर्ण संयोजनों का परीक्षण किया जाता है। यूनिट परीक्षणों को फ़्लैग मान का मॉक करना चाहिए। एकीकरण परीक्षण ज्ञात फ़्लैग मानों के साथ विशिष्ट परिदृश्यों की जाँच करते हैं। E2E परीक्षण सबसे संभावित संयोजनों को कवर करते हैं।
हटाने की प्रक्रिया: 1) सुनिश्चित करें कि फ़्लैग सभी उपयोगकर्ताओं के लिए 100% सक्षम है और प्रयोग मोड में उपयोग नहीं किया जा रहा है; 2) कोड से फ़्लैग की सभी सशर्त जाँच हटाएँ, केवल “नई” शाखा रखें; 3) प्रबंधन प्रणाली से फ़्लैग परिभाषा हटाएँ; 4) हटाए गए फ़्लैग के मॉक हटाकर परीक्षण अपडेट करें। इस प्रक्रिया को CI के माध्यम से स्वचालित करने की अनुशंसा की जाती है: N दिनों से अधिक समय से अपरिवर्तित फ़्लैग को पुराने के रूप में चिह्नित किया जाता है और हटाने की पुष्टि की आवश्यकता होती है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें