ভূমিকা
সফটওয়্যারে আপডেট অভিন্ন একটি অংশ; বাগ ফিক্স করতে হয়, নতুন ফিচার যোগ করতে হয়, এবং সাধারণত আরও সিকিউর, নির্ভরযোগ্য বা দ্রুত করতে ইটারেট করতে হয়।
কিন্তু নতুন ফিচার বা সাধারণত পরিবর্তনগুলো ডিপ্লয়মেন্টের সাথে কাপল করা সবসময় ভালো আইডিয়া নয়। কখনও কখনও আপনি রিকারিং ডিপ্লয়মেন্ট শিডিউল ফলো করেন, কিন্তু মার্কেটিং টিম নতুন ফিচার ঘোষণা করার জন্য প্রস্তুত নয়। যদি পরিবর্তনগুলো হার্ডকোডেড থাকে, তবে মার্কেটিং টিমকে সেটা এক্টিভেট বা ডিঐক্টিভেট করার জন্য একজন ডেভেলপারের দরকার পড়তে পারে।
ফিচার ফ্ল্যাগ বা ফিচার টগল হলো আপনার পরিবর্তনগুলোকে ডিপ্লয়মেন্ট থেকে ডিকাপল করার একটি উপায়। আপনি একটি পরিবর্তন ইমপ্লিমেন্ট করেন, কিন্তু এটি একটি if-স্টেটমেন্টের পেছনে লুকিয়ে রাখেন; যতক্ষণ একটি ভেরিয়েবল false থাকে, সফটওয়্যারটি আপনার পরিবর্তন করার আগের ভার্সন ব্যবহার করবে; যদি ভেরিয়েবলটি true হয়, তবে এটি নতুন ভার্সন হবে। যদি এই ভেরিয়েবলের ভ্যালু একটি ডাটাবেস থেকে আসে जिसे মার্কেটিং টিম এক্সেস করতে পারে, তবে তারা কোড পরিবর্তন ছাড়াই এই পরিবর্তনগুলো টগল করতে পারবে।
Upstash Redis® এমন একটি ডাটাবেস। এটি একটি সিম্পল কী-ভ্যালু স্টোর যা আপনি আপনার ফিচার ফ্ল্যাগ স্টোর করতে ব্যবহার করতে পারেন। যেহেতু এটি জ্বালামুখির গতিতে দ্রুত, তাই আপনার অ্যাপ্লিকেশনে একাধিক আলাদা ফ্ল্যাগ চেক করলে লেটেন্সিতে খুব কম যোগ হয়।
এই টিউটোরিয়ালে আপনি শিখবেন কিভাবে আপনার Next.js অ্যাপের জন্য একটি সিম্পল ফিচার ফ্ল্যাগ মেকানিজম বিল্ড করতে হয়। আমরা Vercel-এ ডিপ্লয় করব এবং স্টোরেজ হিসেবে Upstash Redis® ব্যবহার করব।
পূর্বশর্ত
আপনার একটি GitHub অ্যাকাউন্ট, একটি Vercel অ্যাকাউন্ট, এবং একটি Upstash অ্যাকাউন্ট দরকার।
যেহেতু আমরা NPM ব্যবহার করছি, তাই আপনার একটি কারেন্ট Node.js ইনস্টলেশনও দরকার।
Next.js প্রজেক্ট ইনিশিয়ালাইজ করা
প্রথম ধাপ হলো একটি নতুন Next.js প্রজেক্ট তৈরি করা। এটি নিচের কমান্ড দিয়ে করা যায়:
$ npx create-next-app upstash-next-feature-flags
Upstash Redis® কানেকশন তৈরি করা
এরপর, আমাদের Next.js অ্যাপকে Upstash Redis® ডাটাবেসের সাথে কানেক্ট করতে হবে। এর জন্য @upstash/redis প্যাকেজ ইনস্টল করুন এবং এর চারদিকে একটি ছোট ওয়rapper তৈরি করুন।
$ npm i @upstash/redis
upstash-next-feature-flags/lib/featureFlags.js ফাইলটি এই কোডով তৈরি করুন:
import { Redis } from "@upstash/redis";
const { UPSTASH_TOKEN, UPSTASH_URL } = process.env;
const redis = new Redis({
token: UPSTASH_TOKEN,
url: UPSTASH_URL,
});
export async function flagIsActive(flagName) {
const flag = await redis.get(flagName);
return Boolean(flag);
}
আমরা এনভায়রনমেন্ট ভেরিয়েবল থেকে API ক্রেডেনশিয়াল নিব, যা এই টিউটোরিয়ালে পরে সেট আপ করব। flagIsActive ফাংশনটি Redis®-কে কোয়েরি করবে এবং রিটার্ন করা ভ্যালুকে boolean-এ কনভার্ট করবে। এই কনভার্সন ضرুরী কারণ আমরা ফ্ল্যাগটি Redis-এ একটি নম্বর হিসেবে সংরক্ষণ করব।
API রুট তৈরি করা
আমাদের দুটি আলাদা ইমপ্লিমেন্টেশনের সাথে API রুট তৈরি করতে হবে। আমরা ফিচার ফ্ল্যাগ ব্যবহার করে এদের মধ্যে সুইচ করব।
এজন্য, upstash-next-feature-flags/pages/api/sort-numbers.js ফাইলটি তৈরি করুন।
এতে নিচের কোড থাকবে:
import { flagIsActive } from "../../lib/featureFlags";
export default async function handler(request, response) {
let sort = bucketSort;
const newSortingAlgorithm = await flagIsActive("newSortingAlgorithm");
if (newSortingAlgorithm) sort = selectionSort;
const { numbers } = request.body;
const sorted = sort(numbers);
response.status(200).json({ numbers: sorted, newSortingAlgorithm });
}
// পুরনো সর্টিং অ্যালগরিদম
const bucketSort = (arr, size = 5) => {
const min = Math.min(...arr);
const max = Math.max(...arr);
const buckets = Array.from(
{ length: Math.floor((max - min) / size) + 1 },
() => [],
);
arr.forEach((val) => {
buckets[Math.floor((val - min) / size)].push(val);
});
return buckets.reduce((acc, b) => [...acc, ...b.sort((a, b) => a - b)], []);
};
// নতুন সর্টিং অ্যালগরিদম
const selectionSort = (arr) => {
const a = [...arr];
for (let i = 0; i < a.length; i++) {
const min = a
.slice(i + 1)
.reduce((acc, val, j) => (val < a[acc] ? j + i + 1 : acc), i);
if (min !== i) [a[i], a[min]] = [a[min], a[i]];
}
return a;
};
এই API রুটটি একটি সিম্পল নম্বর সর্টার। এটি একটি আনসোর্টেড নম্বর অ্যারে নেয় এবং সেটা সর্ট করার জন্য দুটি সর্টিং অ্যালগরিদমের একটি ব্যবহার করবে।
এই সর্টিং অ্যালগরিদম দুটো আপনার অ্যাপ্লিকেশনে যে কোনো পরিবর্তন "টগল" করার জন্য স্ট্যান্ড-ইন। উভয়টিই আপনার কোডে রাখুন এবং flagIsActive ফাংশন দিয়ে Redis-এ ভ্যালু পরিবর্তন করে এদের মধ্যে সুইচ করুন।
আমরা flagIsActive ফাংশনটি কল করি এবং সেটি যে ফ্ল্যাগটি চেক করতে চাই তার নাম দিয়ে। যদি ফ্ল্যাগটি Redis-এ 1 সেট থাকে, তবে এই ফাংশন true রিটার্ন করবে; অন্যথায় false রিটার্ন করবে।
সর্টিং করার পর, API রুটটি সোর্টেড অ্যারে রেসপন্স হিসেবে পাঠায়।
GitHub-এ প্রজেক্ট পুশ করা
সব কিছু ইমপ্লিমেন্ট করার পর, প্রজেক্টটি GitHub-এ একটি রিপোজিটরিতে পুশ করতে হবে যাতে Vercel-এর ডিপ্লয়মেন্ট সার্ভিসটি এক্সেস করতে পারে। GitHub-এর ডক্সে রিপোজিটরি তৈরি করার পদ্ধতি আছে।
একটি খালি রিপোজিটরি তৈরি করলে আপনাকে অটোমেটিক্যালি দেখাবে কীভাবে এটি আমাদের তৈরি করা প্রজেক্টের সাথে লিংক করতে হয়।
Upstash Redis® ডাটাবেস তৈরি করা
আপনি Upstash কনসোলে একটি নতুন ডাটাবেস তৈরি করতে পারেন। Figure 1 এই টিউটোরিয়ালের জন্য একটি ভালো কনফিগারেশন দেখাচ্ছে।

Figure 1-এ বলা আছে, একটি ডাটাবেস ফ্রি, তাই এই টিউটোরিয়ালের জন্য আপনাকে কিছু টাকা দিতে হবে না।
Upstash কনসোলের ব্রাউজার ট্যাবটি খোলা রাখুন কারণ পরে ডাটাবেসের ক্রেডেনশিয়াল সংগ্রহের জন্য এটি লাগবে।
GitHub রিপোজিটরিকে Vercel-এর সাথে লিংক করা
আপনি আপনার GitHub অ্যাকাউন্ট দিয়ে Vercel-এ লগইন করলে, GitHub রিপোজিটরি যোগ করতে চन्द ক্লিকই লাগে। Figure 2-এ Vercel ড্যাশবোর্ডের টপ লেফট দেখানো হয়েছে; "Add New…"-এ ক্লিক করুন এবং "Project" বেছে নিন।

"Continue with GitHub" বেছে নিন এবং পূর্বের ধাপে তৈরি করা রিপোজিটরির "import" বাটনlerden যেকোনো একটি বেছে নিন।

শেষে, প্রজেক্ট কনফিগারেশন স্টেপ আসবে, যেখানে আপনাকে এনভায়রনমেন্ট ভেরিয়েবল যোগ করতে হবে। বাকি কনফিগারেশনে ডিফল্ট রাখতে পারেন। Figure 4-এ দেখানো হয়েছে এনভ ভেরিয়েবল দিতে হবে কোথায়।

এগুলো UPSTASH_TOKEN এবং UPSTASH_URL নামে হবে, এবং আপনি আপনার Upstash কনসোলে পাবেন, যেখানে আমরা আগে ডাটাবেস তৈরি করেছিলাম। Figure 5-এ দেখানো হয়েছে কোন বাটনগুলো প্রেস করে আপনার ভেরিয়েবলগুলোর জন্য প্রয়োজনীয় ভ্যালু কপি করতে হবে।

বড় "Deploy" বাটনটি চাপলে, Vercel আপনার GitHub রিপোজিটরি ক্লোন করবে এবং তার ইনফ্রাস্ট্রাকচারে ডিপ্লয় করবে।
Redis-এ সুইচ করা ইমপ্লিমেন্টেশনের মাঝপথে
এখন, আমরা আমাদের API এন্ডপয়েন্ট কল করতে পারব, এবং Redis-এ ভ্যালু সেট করে ইমপ্লিমেন্টেশন সুইচ করতে পারব। Upstash কনসোলে Redis CLI এটি করার সবচেয়ে সহজ উপায়।
Figure 6-এ দেখানো হয়েছে CLI কোথায় পাবেন এবং যে কমান্ডটি এক্সিকিউট করতে হবে ভ্যালু সেট করার জন্য।
set newSortingAlgorithm 1

যদি আমরা newSortingAlgorithm ডিলিট করি বা এটাকে 0 সেট করি, তবে ফ্ল্যাগটি আবার false-এ সুইচ করবে, এবং আমাদের API রুট পুরনো অ্যালগরিদম ব্যবহার করবে।
API রুট ব্যবহার করা
শেষ যেটা বাকি, সেটা হলো API রুট ব্যবহার করা। আমাদের রুটে একটি JSON অবজেক্ট POST রিকোয়েস্ট দিয়ে পাঠাতে হবে। এটি করার সহজ উপায় হলো cURL।
নিচের কমান্ডটি এমন একটি অবজেক্ট পাঠাবে:
$ curl --header "Content-Type: application/json" \
--request POST \
--data '{"numbers":[1, 100, 10, 1000, 100000, 10000]}' \
API_ROUTE_URL
আপনাকে Vercel-এ সঠিক API_ROUTE_URL খুঁজে বের করতে হবে। Vercel ড্যাশবোর্ডে আপনার প্রজেক্টে "Domains" ক্যাটাগরি দেখতে পাবেন, Figure 7-এর মতো।

রেসপন্সটি একটি JSON অবজেক্ট হবে যাতে সোর্টেড numbers এবং একটি newSortingAlgorithm ফিল্ড থাকবে যা ইন্ডিকেট করবে এই সর্টিংয়ের জন্য কোন অ্যালগরিদম ব্যবহার করা হয়েছে।
সারসংক্ষেপ
ফিচার ফ্ল্যাগ ডিপ্লয়মেন্টকে ফিচার রিলিজ থেকে ডিকাপল করার একটি চমৎকার উপায়। এগুলো একটি হার্ডকোডেড পরিবর্তনকে একটি ডাটাবেসে একটি সিম্পল ভ্যালু সেট করার বিষয়ে পরিবর্তন করে দেয়, যা আপনার টিমগুলোর আরও নমনীয়তা দেয় এবং নন-টেকনিক্যাল লোক들에게 আরও ক্ষমতা দেয়।
Upstash Redis-এর মতো দ্রুত ডাটাবেস থাকলে, আপনার অ্যাপ্লিকেশনের জন্য ফিচার ফ্ল্যাগ প্যাটার্ন ইমপ্লিমেন্ট করা সহজ, পারফরম্যান্সে বড় কোনো হ্রাস ছাড়া। Upstash Redis-এর সাব-সেকেন্ড অ্যাক্সেস টাইম আছে, এবং আপনি যদি চান তবে আপনার FaaS-এর নিকটে ডিপ্লয় করতে পারেন। সব কিছুর সাথে অন-ডিমান্ড প্রাইসিং, তাই আপনি কখনোই যেসব রিসোর্স ব্যবহার করেননি সেসবের জন্য টাকা দেবেন না।