इस परिदृश्य की कल्पना करें: आप एक रेल्स डेवलपर हैं और पिछले कुछ दिनों से उस शानदार सुविधा को विकसित करने में बिताए हैं जिसका हर कोई इंतजार कर रहा है। यह बड़ी और जटिल है, लेकिन यह कठोर परीक्षण से गुजरी है, इसलिए आप आश्वस्त हैं कि सब कुछ काम करता है। समय सीमाएं पूरी करनी हैं, इसलिए आप तैनात करते हैं। तुरंत, सब कुछ बिगड़ जाता है।
आपकी सुविधा आपके कुछ यूजर्स के लिए पूरे ऐप को पूरी तरह से तोड़ देती है। यह कहना मुश्किल है कि क्यों। परीक्षण के दौरान कोई बग नहीं दिखा। आप अपना परिवर्तन वापस लेते हैं, लेकिन नुकसान हो चुका है। आपके ग्राहक खुश नहीं हैं, और आप निकट भविष्य में क्षति नियंत्रण और जांच करने में बिताएंगे कि क्या गलत हुआ।
समस्या यह है कि जटिल परिवर्तनों को जारी करना स्वाभाविक रूप से जोखिम भरा है, चाहे आप कितना भी परीक्षण करें। अगर आप इस सुविधा को धीरे-धीरे रोल आउट कर सकते तो अच्छा होता, शायद पहले केवल कुछ यूजर्स के लिए। यह और भी बेहतर होता अगर आप पहली समस्या दिखते ही सुविधा को बंद कर सकते।
यही वह जगह है जहां फीचर फ्लैग्स आते हैं। इस पोस्ट में, हम रेल्स में फीचर फ्लैग्स के अंदर और बाहर गोता लगाएंगे, जिसमें फ्लिपर जेम का उपयोग करके उन्हें कैसे सेट अप करें, शामिल है। लेकिन पहले: वे क्या हैं?
रूबी ऑन रेल्स में फीचर फ्लैग्स क्या हैं?
फीचर फ्लैग्स आपके एप्लिकेशन में चलते समय एक सुविधा को सक्षम या अक्षम करने का एक तरीका है। यदि एक फ्लैग सक्षम है, तो सुविधा का उपयोग किया जाता है। अन्यथा, नहीं। इस तरह के छद्म कोड की कल्पना करें।
'फीचर फ्लैग' नाम कुछ हद तक भ्रामक है। रनटाइम पर एप्लिकेशन व्यवहार को नियंत्रित करना सुविधाओं तक सीमित नहीं है, बल्कि आपके प्रोग्राम के भीतर किसी भी फ़ंक्शन पर लागू होता है। आप प्रदर्शन ट्विक्स को आज़माने और A/B टेस्ट चलाने के लिए फीचर फ्लैग्स का उपयोग कर सकते हैं, उदाहरण के लिए। एक फीचर फ्लैग और किसी अन्य पुराने सशर्त के बीच एक महत्वपूर्ण अंतर यह है कि आप फीचर फ्लैग्स को रनटाइम पर संशोधित कर सकते हैं।
चित्रण उद्देश्यों के लिए, आइए पर्यावरण चर का उपयोग करके एक साधारण फीचर फ्लैगिंग तंत्र की कल्पना करें।
पर्यावरण चर के मान को संशोधित करके, हम अपनी इच्छानुसार अपने एप्लिकेशन के भागों को चालू या बंद कर सकते हैं। एप्लिकेशन का कौन सा भाग? कुछ भी जो आप चाहते हैं!
यदि कोई सुविधा अक्षम है तो आप UI के भागों को छिपा सकते हैं। आप अपने कोड के भागों को स्विच आउट कर सकते हैं, जो बहुत उपयोगी है यदि आप अपने नवीनतम रिफैक्टर में आश्वस्त नहीं हैं। फीचर फ्लैग्स के मेरे पसंदीदा उपयोगों में से एक रूटिंग कंस्ट्रेंट्स का उपयोग करके पूरे रूट्स को छिपाना है:
हम पहले से ही देख सकते हैं कि फीचर फ्लैग्स के लिए बहुत सारे अनुप्रयोग हैं। हालाँकि, हमारे भोले इम्प्लीमेंटेशन में एक महत्वपूर्ण कमजोरी है। एक सुविधा या तो हर यूजर के लिए चालू है या बंद।
क्या होगा यदि हम केवल विशिष्ट यूजर्स या यूजर्स के समूहों के लिए, या केवल कुछ समय के लिए सुविधाओं को सक्षम करने की क्षमता चाहते हैं? आइए फ्लिपर पर एक नज़र डालें।
फीचर फ्लैग्स के लिए फ्लिपर जेम का उपयोग करना
फ्लिपर एक जेम है जो रेल्स में फीचर फ्लैग्स और उन्हें टॉगल करने के विभिन्न तरीकों को उपलब्ध कराता है। यह अत्यधिक मॉड्यूलर है। मुख्य जेम के अलावा, आपको एक स्टोरेज एडाप्टर भी चुनना होगा - लेकिन उस पर बाद में। अभी के लिए ActiveRecord एडाप्टर का उपयोग करते हैं।
अपने Gemfile में निम्नलिखित लाइनें जोड़ें और bundle install चलाएं:
जब हम ActiveRecord एडाप्टर का उपयोग करते हैं, तो फ्लिपर आपके फीचर फ्लैग को डेटाबेस में स्टोर करेगा और इस प्रकार नई डेटाबेस टेबल्स सेट अप करने की आवश्यकता होती है। फ्लिपर एक आसान जनरेटर के साथ आता है जो आवश्यक माइग्रेशन बनाएगा।
आप फ्लिपर का उपयोग उसी तरह कर सकते हैं जैसे हमने पहले भोले इम्प्लीमेंटेशन में किया था।
बड़ा अंतर यह है कि पर्यावरण चर को संशोधित करने के बजाय, अब आप फ्लिपर के यूजर इंटरफेस का उपयोग करके सुविधाओं को टॉगल कर सकते हैं। फ्लिपर UI जेम जोड़ें और इसे इंस्टॉल करें।
फ्लिपर UI को माउंट करने के लिए अपने रूट्स फाइल को संशोधित करें।
यदि आप अपना एप्लिकेशन शुरू करते हैं और फ्लिपर UI पर नेविगेट करते हैं, तो आप सभी उपलब्ध सुविधाओं और उनकी स्थिति का अवलोकन देखेंगे। आगे बढ़ें और एक my_awesome_feature सुविधा बनाएं।

फ्लिपर में फीचर टॉगल्स
आपने शायद देखा होगा कि आप फ्लिपर UI में केवल किसी सुविधा को सक्षम या अक्षम करने से कहीं अधिक कर सकते हैं। फ्लिपर हमें सुविधाओं को यूजर्स के एक सबसेट के लिए या यहां तक कि समय के एक प्रतिशत के लिए सक्षम करने की अनुमति देता है। आप अपने फीचर फ्लैग्स को पांच अलग-अलग तंत्रों में से एक का उपयोग करके कॉन्फ़िगर कर सकते हैं।
उनमें से एक बूलियन टॉगल है, एक ग्लोबल ऑन-ऑफ स्विच। अन्य चार उससे कहीं अधिक दिलचस्प हैं: ग्रुप्स, एक्टर्स, एक्टर्स का प्रतिशत, और समय का प्रतिशत।
ग्रुप्स
किसी सुविधा को केवल यूजर्स के एक विशेष समूह के लिए सक्षम करने के लिए, ग्रुप टॉगल का उपयोग करें। यदि यह मौजूद नहीं है, तो config/initializers/flipper.rb फाइल बनाएं और उदाहरण के लिए, पेड यूजर्स जैसे एक नए समूह को रजिस्टर करने के लिए निम्न कोड जोड़ें।
इस नए टॉगल का उपयोग करने के लिए, यूजर - या एक्टर, जैसा कि डॉक्यूमेंटेशन उन्हें कॉल करना पसंद करता है - और सुविधा का नाम पास करने के लिए फ्लिपर इनवोकेशन को संशोधित करें।
फ्लिपर इनिशियलाइज़र में आपके द्वारा परिभाषित ब्लॉक का उपयोग करके तय करेगा कि इस यूजर के लिए सुविधा सक्षम है या नहीं। इस मामले में, यह paid? मेथड को इनवोक करेगा। अब आप इस समूह को फ्लिपर UI में उपयोग कर सकते हैं। 'एक समूह जोड़ें' बटन पर क्लिक करें और अपना समूह चुनें।

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

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

अगर चीजें गलत हो जाती हैं, तो आप प्रतिशत को हमेशा शून्य पर रीसेट कर सकते हैं।
समय का प्रतिशत
अंतिम लेकिन कम नहीं, आप किसी सुविधा को रिक्वेस्ट के एक प्रतिशत के लिए सक्षम कर सकते हैं। इस टॉगल का उपयोग करते समय आपको एक एक्टर प्रदान करने की आवश्यकता नहीं है।
मैं दो अलग-अलग इम्प्लीमेंटेशन के प्रदर्शन की तुलना करने के लिए इसका उपयोग करना पसंद करता हूं। ध्यान दें कि यह फीचर टॉगल रैंडम है। वही यूजर प्रत्येक रिक्वेस्ट पर अलग व्यवहार का अनुभव करेगा।
फ्लिपर में एडवांस्ड कॉन्फ़िगरेशन
हम पहले ही देख चुके हैं कि हम फीचर फ्लैग जानकारी को अपने डेटाबेस में स्टोर करने के लिए ActiveRecord एडाप्टर का उपयोग कर सकते हैं। लेकिन आपकी विशिष्ट आवश्यकताओं के आधार पर, आप एक अलग एडाप्टर का उपयोग करना चाह सकते हैं।
अधिकांश भाग के लिए, स्टोरेज एडाप्टर्स को स्वैप करते समय आपको बस संबंधित जेम इंस्टॉल करना होगा और फ्लिपर को तदनुसार कॉन्फ़िगर करना होगा। उदाहरण के लिए, यदि आप रेडिस एडाप्टर का उपयोग करना चाहते हैं, तो आप अपने Gemfile में flipper-redis जेम जोड़ें और फ्लिपर इनिशियलाइज़र को अपडेट करें।
स्टोरेज एडाप्टर्स को कॉन्फ़िगर करने के अलावा, फ्लिपर के कई अन्य पहलू हैं जिन्हें आप ट्वीक कर सकते हैं।
फीचर फ्लैग्स जोड़ने से थोड़ा प्रदर्शन जुर्माना लगता है, इसलिए आप आमतौर पर मेमोइज़ेशन और कैशिंग जोड़ना चाहेंगे। आप शायद फ्लिपर UI तक पहुंच को अधिकृत यूजर्स तक सीमित करना चाहेंगे। ये विषय इस पोस्ट के दायरे से बाहर हैं, लेकिन यदि आप गहराई से जाना चाहते हैं तो फ्लिपर डॉक्यूमेंटेशन देखने की सलाह देता हूं।
रेल्स में फीचर फ्लैग्स की चेतावनियाँ
फीचर फ्लैग्स बहुत अच्छे हैं। लेकिन कई चीजों की तरह, विचार करने के लिए ट्रेडऑफ्स हैं।
फीचर फ्लैग्स जोड़ना और उन्हें बनाए रखना संगठनात्मक ओवरहेड जोड़ता है। फ्लैग्स का उपयोग करके छिपी हुई सुविधाओं को जारी करना और रोल आउट करना 'नियमित' कोड को तैनात करने जितना सरल नहीं है - आपको इसे चालू करना याद रखना होगा, निश्चित रूप से! यह आमतौर पर बहुत कठिन नहीं है, लेकिन जिन फीचर फ्लैग्स की अब आवश्यकता नहीं है उन्हें साफ करना हो सकता है।
हर बार जब आप अपने कोड में एक फीचर फ्लैग जोड़ते हैं, तो आप एक सशर्त जोड़ते हैं, और यदि आप ध्यान नहीं देते, तो आपका कोड जल्दी से उनसे भर जाता है। कब और क्यों आपने कुछ फीचर फ्लैग्स बनाए, इसका ट्रैक रखना चुनौतीपूर्ण हो सकता है। अफसोस की बात है कि फ्लिपर UI स्वयं फीचर फ्लैग्स को प्रबंधित करने के लिए बहुत कुछ प्रदान नहीं करता है।
आपको यह भी पता होना चाहिए कि फीचर फ्लैग्स का उपयोग करने से एक मामूली प्रदर्शन जुर्माना लगेगा। इसे कम करने के तरीके हैं, लेकिन अगर आप फ्लिपर को गलत कॉन्फ़िगर या दुरुपयोग करते हैं तो इसका ध्यान देने योग्य प्रभाव पड़ सकता है।
समापन: रूबी ऑन रेल्स में फीचर फ्लैग्स के साथ शुरुआत करें
हमने देखा कि फीचर फ्लैग्स आपको अधिक आत्मविश्वास के साथ रिलीज़ करने में कैसे मदद कर सकते हैं, सिद्धांत रूप में वे कैसे कार्य करते हैं, और फ्लिपर जेम का उपयोग करके फीचर फ्लैग्स के साथ कैसे शुरुआत करें।
ऐसी कई स्थितियां हैं जहां फीचर फ्लैग्स आसान होते हैं। आपके यूज केस के आधार पर, आप पांच अलग-अलग टॉगल्स में से एक तक पहुंच सकते हैं - बूलियन, ग्रुप, एक्टर, एक्टर्स का प्रतिशत, या रिक्वेस्ट का प्रतिशत।
हालांकि फीचर फ्लैग्स के साथ काम करने की अपनी चेतावनियां हैं और इसकी आदत डालने में कुछ समय लग सकता है, वे फिर भी आपके निपटान में एक बेहतरीन टूल हैं।
अगली बार तक, हैप्पी कोडिंग!
P.S. यदि आप रूबी मैजिक पोस्ट्स को प्रेस से निकलते ही पढ़ना चाहते हैं, तो हमारे रूबी मैजिक न्यूजलेटर को सब्सक्राइब करें और कभी भी एक भी पोस्ट मिस न करें!