কম্পিউটার টিউটোরিয়াল

ফ্লিপার (Flipper) ফিচার ফ্ল্যাগস দিয়ে রেইলসে নতুন ফিচার নিরাপদে ডিপ্লয় করুন

একটি পরিস্থিতি কল্পনা করুন: আপনি একজন রেইলস ডেভেলপার এবং গত কয়েক দিন ধরে আপনি সবার প্রতীক্ষিত वो অসাধারণ ফিচারটি ডেভেলপ করেছেন। এটি বড় এবং জটিল, কিন্তু কঠোর টেস্টিং এর মধ্য দিয়ে গিয়েছে, তাই আপনি নিশ্চিত যে সব কিছু ঠিকমতো কাজ করছে। ডেডলাইন মেটাতে হলে, আপনি ডিপ্লয় করেন। মুহূর্তেই সব কিছু পিন্ডিত হয়ে যায়।

আপনার ফিচারটি কিছু ব্যবহারকারীদের জন্য পুরো অ্যাপ্লিকেশনটিকে ভাঙিয়ে ফেলে। কেন তা বলা কঠিন। টেস্টিং এর সময় কোনো বাগ দেখা যায়নি। আপনি আপনার পরিবর্তনটি রিভার্ট করেন, কিন্তু ক্ষতিটি হয়ে গেছে। আপনার কাস্টমাররা খুশি নয়, এবং আপনি निकট ভবিষ্যতে ড্যামেজ কন্ট্রোল এবং সমস্যাটি খুঁজে বের করার পেছনে ব্যস্ত থাকবেন।

সমস্যাটি হল জটিল পরিবর্তন রিলিজ करना স্বাভাবিকভাবে রিস্কি, আপনি चाहे যতটুকু টেস্টিং করুন। কতটা ভালো হত যদি আপনি এই ফিচারটি ধীরে ধীরে রোল আউট করতেন, হয়তো শুধু কিছু ব্যবহারকারীর জন্য প্রথমে। আরো ভালো হত যদি আপনি প্রথম সমস্যা দেখা দিলেই ফিচারটি অফ করে দিতে পারতেন।

এখানেই ফিচার ফ্ল্যাগস (Feature Flags) এর প্রয়োজন পড়ে। এই পোস্টে, আমরা রুবি অন রেইলসে ফিচার ফ্ল্যাগসের ইনস আউটস নিয়ে গভীরে যাব, Flipper জেম ব্যবহার করে সেটআপ করার পদ্ধতি সহ। কিন্তু প্রথমে: এগুলো কী?

রুবি অন রেইলসে ফিচার ফ্ল্যাগস কী?

ফিচার ফ্ল্যাগস আপনার অ্যাপ্লিকেশনে একটি ফিচার চালু বা বন্ধ রাখার একটি পদ্ধতি, যখন অ্যাপ্লিকেশনটি চলছে। যদি ফ্ল্যাগটি ইনাবেল করা থাকে, ফিচারটি ব্যবহার করা হয়। অন্যথায়, নয়। নিচের কুডাকোডের মতো কিছু কল্পনা করুন।


'ফিচার ফ্ল্যাগ' নামটি কিছুটা ভ্রামক। রানটাইমে অ্যাপ্লিকেশন আচরণ নিয়ন্ত্রণ করা শুধু ফিচারের জন্য সীমাবদ্ধ নয়, বরং আপনার প্রোগ্রামের যেকোনো ফাংশনের জন্য প্রযোজ্য। আপনি ফিচার ফ্ল্যাগস ব্যবহার করে পারফরম্যান্স টিউনিং চেষ্টা করতে পারেন এবং A/B টেস্ট চালাতে পারেন, উদাহরণস্বরূপ। একটি ফিচার ফ্ল্যাগ এবং যেকোনো অন্য পুরনো কন্ডিশনালের মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য হল আপনি রানটাইমে ফিচার ফ্ল্যাগস মডিফাই করতে পারেন।

ইলাস্ট্রেশন উদ্দেশ্যে, এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে একটি সহজ ফিচার ফ্ল্যাগিং মেকানিজম কল্পনা করুন।


এনভায়রনমেন্ট ভেরিয়েবলের মান পরিবর্তন করে, আমরা আপনার অ্যাপ্লিকেশনের অংশগুলিকে ইচ্ছামতো অন/অফ করতে পারি। অ্যাপ্লিকেশনের কোন অংশ? যা আপনি চান!

আপনি UI-এর অংশগুলো লুকাতে পারেন যদি ফিচারটি ডিজেবল থাকে। আপনি আপনার কোডের অংশগুলো বদলাতে পারেন, যা খুবই উপকারী যদি আপনি আপনার সাম্প্রতিক রিফ্যাক্টরিং-এ আত্মবিশ্বাসী না হন। ফিচার ফ্ল্যাগসের আমার একটি প্রিয় ব্যবহার হল রাউটিং কনস্ট্রেইন্টস ব্যবহার করে পুরো রুট লুকানো:



আমরা ইতিমধ্যে দেখতে পাচ্ছি যে ফিচার ফ্ল্যাগসের অনেক অ্যাপ্লিকেশন আছে। কিন্তু আমাদের নাইভ ইমপ্লিমেন্টেশনের একটি বড় দুর্বলতা আছে। একটি ফিচার বা তো সবার জন্য অন থাকে, বা সবার জন্য অফ।

কি হবে যদি আমরা নির্দিষ্ট ব্যবহারকারী বা ব্যবহারকারী গোষ্ঠীর জন্য ফিচার ইনাবেল করতে চাই, বা কিছু সময়ের জন্য? Flipper-এ একটি নজর দেই।

ফিচার ফ্ল্যাগসের জন্য Flipper জেম ব্যবহার

Flipper একটি জেম যা রেইলসে ফিচার ফ্ল্যাগস এবং সেগুলো টগল করার বিভিন্ন পদ্ধতি উপলব্ধ করায়। এটি অত্যন্ত মডুলার। মূল জেম ছাড়াও, আপনাকে একটি স্টোরেজ অ্যাডাপ্টার বেছে নিতে হবে — পরে আরো আলোচনা করব। ফিলহাল ActiveRecord অ্যাডাপ্টার ব্যবহার করি।

নিচের লাইনগুলো আপনার Gemfile-এ যোগ করুন এবং bundle install চালান:


যখন আমরা ActiveRecord অ্যাডাপ্টার ব্যবহার করি, Flipper আপনার ফিচার ফ্ল্যাগ ডাটাবেসে সংরক্ষণ করে এবং এই জন্য নতুন ডাটাবেস টেবিল সেটআপ করতে হয়। Flipper একটি হ্যান্ডি জেনারেটারের সাথে আসে যা প্রয়োজনীয় মাইগ্রেশন তৈরি করে।


আপনি Flipper কে আগের নাইভ ইমপ্লিমেন্টেশনের মতোই ব্যবহার করতে পারেন।


বড় পার্থক্য হল এনভায়রনমেন্ট ভেরিয়েবল মডিফাই করার বদলে, এখন আপনি Flipper-এর ইউজার ইন্টারফেস ব্যবহার করে ফিচার টগল করতে পারেন। Flipper UI জেম যোগ করুন এবং ইনস্টল করুন।


আপনার routes ফাইল মডিফাই করুন Flipper UI মাউন্ট করার জন্য।


আপনি আপনার অ্যাপ্লিকেশন চালু করলে এবং Flipper UI-তে নেভিগেট করলে, আপনি সকল উপলব্ধ ফিচার এবং তাদের স্টেটাসের ওভারভিউ দেখবেন। এগিয়ে যান এবং my_awesome_feature নামে একটি ফিচার তৈরি করুন।

ফ্লিপার (Flipper) ফিচার ফ্ল্যাগস দিয়ে রেইলসে নতুন ফিচার নিরাপদে ডিপ্লয় করুন

Flipper-এ ফিচার টগলস

আপনি সম্ভবত লক্ষ্য করেছেন যে Flipper UI-তে আপনি শুধু ফিচার অন/অফ করার চেয়ে অনেক বেশি করতে পারেন। Flipper আমাদের ফিচার ফ্ল্যাগস পাঁচটি ভিন্ন মেকানিজম ব্যবহার করে কনফিগার করতে দেয়।

একটি হল বুলিয়ান টগল, একটি গ্লোবাল অন-অফ সুইচ। অন্য চারটি অনেক বেশি আকর্ষণীয়: গ্রুপস (Groups), এক্টরস (Actors), এক্টরসের শতাংশ (Percentage of Actors), এবং টাইমের শতাংশ (Percentage of Time)।

গ্রুপস (Groups)

একটি নির্দিষ্ট ব্যবহারকারী গোষ্ঠীর জন্য ফিচার ইনাবেল করতে, গ্রুপ টগল ব্যবহার করুন। যদি এটি না থাকে, config/initializers/flipper.rb ফাইলটি তৈরি করুন এবং একটি নতুন গ্রুপ রেজিস্টার করার জন্য নিচের কোড যোগ করুন — উদাহরণস্বরূপ, পেইড ইউজারস (Paid Users)।


এই নতুন টগল ব্যবহার করতে, Flipper ইনভোকেশন মডিফাই করুন ইউজার — অথবা ডকুমেন্টেশন যা একটর (Actor) বলতে পছন্দ করে — এবং ফিচার নাম পাস করে।


Flipper ইনিশিয়ালাইজারে আপনার ডিফাইন করা ব্লকটি ব্যবহার করবে এই ব্যবহারকারীর জন্য ফিচারটি ইনাবেলড কিনা তা নির্ধারণ করতে। এই কেসে, এটি paid? মেথডটি ইনভোক করবে। আপনি এখন এই গ্রুপটি Flipper UI-তে ব্যবহার করতে পারেন। 'Add a Group' বাটনে ক্লিক করুন এবং আপনার গ্রুপটি সিলেক্ট করুন।

ফ্লিপার (Flipper) ফিচার ফ্ল্যাগস দিয়ে রেইলসে নতুন ফিচার নিরাপদে ডিপ্লয় করুন

আপনার গ্রুপ পেইড ইউজার হয়ে থাকতে পারে না। এটা আপনার টিমের সদস্যদের হতে পারে বা যারা বেটা প্রোগ্রামে সাইন আপ করেছেন। গ্রুপ টগল ব্যবহার করা সহায়ক যদি আপনি কিচ্ছু একটি সাবসেট ব্যবহারকারীর কাছে রিলিজ করতে চান। বেটা রিলিজ বা ইন্টারন্যাল রিলিজ কল্পনা করুন।

এক্টরস (Actors)

কখনো কখনো, আপনি একটি নির্দিষ্ট ব্যক্তির কাছে কিছু রিলিজ করতে চান। এই কেসে, এক্টর টগল কিছুটা বিবেচনাযোগ্য।

এই মেকানিজম ব্যবহার করার জন্য আপনাকে ইনিশিয়ালাইজারে কিছু পরিবর্তন করতে হবে না। কিন্তু, আপনাকে নিশ্চিত করতে হবে যে আপনার এক্টর মডেল — যা অধিকাংশ সময় আপনার ইউজার মডেল হবে — flipper_id ইমপ্লিমেন্ট করে। Flipper::Identifier ইনক্লুড করলে সেটি হয়ে যায়।



তারপর আপনি এই আইডি ব্যবহার করে একটি ফিচার নির্দিষ্ট ব্যবহারকারীদের জন্য ইনাবেল করতে পারেন।

ফ্লিপার (Flipper) ফিচার ফ্ল্যাগস দিয়ে রেইলসে নতুন ফিচার নিরাপদে ডিপ্লয় করুন

এই ফিচার টগলটি হ্যান্ডি যদি আপনি নির্দিষ্ট ব্যক্তিদের জন্য ফাংশন্যালিটি প্রিভিউ করতে চান। যেসব টেস্ট একাউন্টস পার্টনারদের জন্য ইনাবেল করার কথা চিন্তা করুন যাদের একটি ফিচার ব্রোডার অডিয়েন্সের কাছে রিলিজ হওয়ার আগে অ্যাক্সেস দরকার।

এক্টরসের শতাংশ (Percentage of Actors)

আপনি যদি ফিচার ব্যবহার ধীরে ধীরে বাড়াতে চান, এক্টরসের শতাংশ টগল আপনার জন্য। কল্পনা করুন আপনি কিছু পারফরম্যান্স অপ্টিমাইজেশন ইমপ্লিমেন্ট করেছেন, এবং আপনি পুরোপুরি নিশ্চিত নন যে প্রোডাকশনে এটি কীভাবে বیهেভ করবে। আপনি প্রথমে ব্যবহারকারীদের একটি ছোট শতাংশের কাছে এটি রোল আউট করবেন এবং তারপর ধীরে ধীরে ব্যবহার বাড়াবেন আপনার অ্যাপ্লিকেশন মনিটরিং করতেসময়।

ফ্লিপার (Flipper) ফিচার ফ্ল্যাগস দিয়ে রেইলসে নতুন ফিচার নিরাপদে ডিপ্লয় করুন

যদি বিষয়টি খারাপ হয়, আপনি সবসময় শতাংশটি শূন্য রিসেট করতে পারেন।

টাইমের শতাংশ (Percentage of Time)

শেষ কিন্তু কম গুরুত্বপূর্ণ নয়, আপনি একটি ফিচার রিকোয়েস্টের একটি শতাংশের জন্য ইনাবেল করতে পারেন। এই টগল ব্যবহার করার সময় আপনাকে এক্টর দিতে হবে না।


আমি এটিকে দুটি ভিন্ন ইমপ্লিমেন্টেশনের পারফরম্যান্স তুলনা করার জন্য পছন্দ করি। দ্রষ্টব্য যে এই ফিচার টগলটি র‍্যান্ডম। একই ব্যবহারকারী প্রতিটি রিকোয়েস্টে ভিন্ন আচরণ অনুভব করবে।

Flipper-এ অ্যাডভান্সড কনফিগারেশন

আমরা ইতিমধ্যে দেখেছি যে আমরা ActiveRecord অ্যাডাপ্টার ব্যবহার করে ফিচার ফ্ল্যাগ ইনফরমেশন আপনার ডাটাবেসে সংরক্ষণ করতে পারি। কিন্তু আপনার নির্দিষ্ট প্রয়োজনের উপর নির্ভর করে, আপনি অন্য অ্যাডাপ্টার ব্যবহার করতে চাইতে পারেন।

বেশির ভাগ সময়, স্টোরেজ অ্যাডাপ্টার বদলার সময় আপনাকে बस সংশ্লিষ্ট জেম ইনস্টল করতে হয় এবং Flipper কনফিগার করতে হয়। উদাহরণস্বরূপ, আপনি যদি Redis অ্যাডাপ্টার ব্যবহার করতে চান, আপনার Gemfile-এ flipper-redis জেম যোগ করুন এবং Flipper ইনিশিয়ালাইজার আপডেট করুন।



স্টোরেজ অ্যাডাপ্টার কনফিগার করার পাশাপাশি, Flipper-এর অনেক দিক আপনি টইক করতে পারেন।

ফিচার ফ্ল্যাগ যোগ করা কিছুটা পারফরম্যান্স পেনাল্টি নিয়ে আসে, তাই আপনি সাধারণত মেমোইজেশন এবং ক্যাশিং যোগ করতে চাবেন। আপনি সম্ভবত Flipper UI-তে অথোরাইজড ইউজারদের অ্যাক্সেস সীমাবদ্ধ করতে চাবেন। এই টপিকগুলো এই পোস্টের স্কোপের বাইরে, কিন্তু আপনি যদি গভীরে যেতে চান, Flipper ডকুমেন্টেশন চেক আউট করুন।

রেইলসে ফিচার ফ্ল্যাগসের সতর্কতা (Caveats)

ফিচার ফ্ল্যাগস চমৎকার। কিন্তু অনেক জিনিসের মত, এখানেও ট্রেড-অফস আছে।

ফিচার ফ্ল্যাগস যোগ করা এবং সেগুলো মেইনটেইন করা অর্গানাইজেশনাল ওভারহেড যুক্ত করে। ফ্ল্যাগস ব্যবহার করে লুকানো ফিচার রিলিজ এবং রোল আউট করা 'নियमিত' কোড ডিপ্লয় করার মতো সহজ নয় — আপনাকে সেটি অন করা মনে রাখতে হবে, অবশ্যই! সেটা সাধারণত সtona কঠিন নয়, কিন্তু আর প্রয়োজন নেই এমন ফিচার ফ্ল্যাগস ক্লিন আপ করা কঠিন হতে পারে।

প্রতিবার আপনি আপনার কোডে একটি ফিচার ফ্ল্যাগ যোগ করলে, আপনি একটি কন্ডিশনাল যোগ করছেন, এবং আপনি যদি সতর্ক না হন, আপনার কোড দ্রুত সেসব দিয়ে অस्तব্যস্ত হয়ে যাবে। কখন এবং কেন আপনি নির্দিষ্ট ফিচার ফ্ল্যাগস তৈরি করেছেন সেটি ট্র্যাক রাখা চ্যালেঞ্জিং হতে পারে। দুঃখজনকভাবে, Flipper UI নিজে ফিচার ফ্ল্যাগস ম্যানেজ করার জন্য অনেক কিছু অফার করে না।

আপনাকে অবগত থাকা উচিত যে ফিচার ফ্ল্যাগস ব্যবহার করা একটি মাইনর পারফরম্যান্স পেনাল্টি নিয়ে আসে। এটিকে কমানোর উপায় আছে, কিন্তু যদি আপনি Flipper মিসকনফিগার বা মিসইউজ করেন, এটি উল্লেখযোগ্য প্রভাব ফেলতে পারে।

সমাপন: রুবি অন রেইলসে ফিচার ফ্ল্যাগস দিয়ে শুরু করুন

আমরা দেখেছি কীভাবে ফিচার ফ্ল্যাগস আপনাকে আরও আত্মবিশ্বাসের সাথে রিলিজ করতে সাহায্য করে, সেগুলো প্রিন্সিপ্যালি কীভাবে কাজ করে, এবং Flipper জেম ব্যবহার করে ফিচার ফ্ল্যাগস দিয়ে কীভাবে শুরু করতে হয়।

ফিচার ফ্ল্যাগস যেনে অনেক পরিস্থিতিতে হ্যান্ডি। আপনার ইউজ কেসের উপর নির্ভর করে, আপনি পাঁচটি ভিন্ন টগল — বুলিয়ান, গ্রুপ, এক্টর, এক্টরসের শতাংশ, বা রিকোয়েস্টের শতাংশ — এর যেকোনো একটি হাতে নিতে পারেন।

যদিও ফিচার ফ্ল্যাগস নিয়ে কাজ করার কিছু সতর্কতা আছে এবং এটিকে অভ্যাস হতে কিছু সময় লাগতে পারে, তবুও এগুলো আপনার হাতে থাকা একটি চমৎকার টুল।

পরবর্তী বার পর্যন্ত, খুশি কোডিং!

P.S. আপনি যদি রুবি ম্যাজিক পোস্টগুলো প্রেস থেকে বের होतेই পড়তে চান, আমাদের রুবি ম্যাজিক নিউজলেটার সাবস্ক্রাইব করুন এবং একক পোস্টও মিস করবেন না!


  1. HTML DOM Style resize প্রোপার্টি

  2. Pillow লাইব্রেরি ব্যবহার করে একটি ছবির প্রতিটি ব্যান্ডের সব পিক্সেলের ভ্যারিয়েন্স ক্যালকুলেট করা

  3. স্ট্রংলি কানেক্টেড গ্রাফ (Strongly Connected Graphs)

  4. অপারেশনাল ডাটাবেস