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

ওপেন-সোর্স টুলস দিয়ে ফিচার ফ্ল্যাগ ব্যবহার করে স্কেলেবল API বানান

ওপেন-সোর্স টুলস দিয়ে ফিচার ফ্ল্যাগ ব্যবহার করে স্কেলেবল API বানান

ফিচার ফ্ল্যাগিং ব্যাকএন্ড ডেভেলপাররা যে কীভাবে টেস্ট এবং মডিফাই করেন সেটার প্যারাডাইম পরিবর্তন করেছে। ফিচার ফ্ল্যাগের সাথে, আমরা একটি ফিচার বা কোডের অংশকে একটি সিঙ্গেল ক্লিকের সাথে অনাবেল বা ডিজেবল করতে পারি বা ফাংশনালিটি পরিবর্তন করতে পারি (রিডিপ্লয়ের কোনো প্রয়োজন নেই)।

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

জিনিসগুলো আরও গভীরে বোঝার জন্য, আমরা একটি অ্যাপ স্ক্র্যাচ থেকে বিল্ড করব, ফিচার ফ্ল্যাগিং ক্যাপাবিলিটি দেখব, এবং Flagsmith নামক একটি টুল ব্যবহার করব আমাদের তৈরি ফিচার ফ্ল্যাগগুলো একটি সিঙ্গেল ড্যাশবোর্ড থেকে ম্যানেজ করার জন্য।

এখানে আমরা কী কভার করব:

  • পূর্বশর্ত

  • ফিচার ফ্ল্যাগ কী?

  • ব্যাকএন্ড ডেভেলপমেন্টে ফিচার ফ্ল্যাগ

  • কেন ওপেন সোর্স টুলস ব্যবহার করব?

  • চলুন কোডিং করি!

    • টুলস ইনিশিয়ালাইজ করা

    • API-এর জন্য এন্ডপয়েন্ট তৈরি করা

    • ফিচার ফ্ল্যাগিং কীভাবে যোগ করবেন

    • ফিচার ফ্ল্যাগ কোড লজিক বোঝা

    • Flagsmith ড্যাশবোর্ডে ফিচার ফ্ল্যাগ তৈরি করা

    • রেট লিমিটিং ফিচার ফ্ল্যাগ

    • বিটা ফিচার ফ্ল্যাগ

    • অ্যাক্সেস কী পাওয়া

    • API চালানো

    • rate_limit ফ্ল্যাগ আপডেট করা

    • GitHub অ্যাপের সাথে ফিচার ফ্ল্যাগ ইন্টিগ্রেট করা

    • Flagsmith GitHub অ্যাপ টেস্ট করা

  • উপসংহার

পূর্বশর্ত

  • Golang ইনস্টলড এবং মিডিয়াম লেভেলের বোঝাপড়া।

  • একটি রানিং Redis ইন্সট্যান্স (রিমোট বা লোকাল ইন্সট্যান্স)

  • Flagsmith অ্যাকাউন্ট (এটি ফ্রি। আমরা পরে এটি কভার করব।)

ফিচার ফ্ল্যাগ কী?

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

এটাকে একটু সিম্পল করে বললে, এগুলো কন্ডিশনাল স্টেটমেন্টের মতো কাজ করে (উদাহরণস্বরূপ, if-else স্টেটমেন্ট): কিছু সত্য বা মিথ্যা হওয়ার ভিত্তিতে, এটি কোড পাথ নির্ধারণ করে যা এক্সিকিউট হবে।

ব্যাকএন্ড ডেভেলপমেন্টে ফিচার ফ্ল্যাগ

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

এটি ডেমোন্সট্রেট করার জন্য, আমরা একটি ডেমো অ্যাপের মাধ্যমে যাব। ডেমো অ্যাপটি ফিচার ফ্ল্যাগিং ক্যাপাবিলিটি দেখানোর জন্য ক্যুরেট করা হয়েছে — ফাংশনালিটি মডিফাই করার জন্য (রেট লিমিট) অন-দ-ফ্লাই থেকে API-এ নতুন এন্ডপয়েন্ট যোগ করা বিটা টেস্টিং বা ইনিশিয়াল রোলআউটের জন্য। আমরা পুরোপুরি ওপেন সোর্স টুলস ব্যবহার করব পথে পথে!

আমরা এই অ্যাপ বিল্ড করতে ওপেন সোর্স টুলস ব্যবহার করব (Golang, Redis, এবং Flagsmith)। ওপেন সোর্স আরও ট্রান্সপেরেন্সি এবং আস্থা আনে এবং বিশ্বব্যাপী ব্যাকএন্ড ডেভেলপার কমিউনিটির সাথে কোলাবোরেশন এনকরেজ করে।

ওপেন সোর্স টুলস ইন্টিগ্রেট করলে, বিল্ড এবং টেস্ট করার সময় আমাদের ফুল ভিজিবিলিটি থাকে। উদাহরণস্বরূপ, আমরা ফিচার ফ্ল্যাগকে GitHub-এর সাথে ইন্টিগ্রেট করব, যা আমাদের একটি Flagsmith ফিচার ফ্ল্যাগকে GitHub Pull Request বা Issue-এর সাথে লিংক করতে দেয়। এটি আমাদের আমাদের ফিচারগুলোর পরিবর্তনগুলো ম্যানুয়ালি ট্র্যাক ছাড়া আপডেট রাখতে সাহায্য করে। আমরা সহজে আমাদের ফিচারগুলোর স্ট্যাটাস বিভিন্ন এনভায়রনমেন্টে ট্র্যাক করতে পারি।

চলুন কোডিং করি!

এই টিউটোরিয়ালে, আপনি দেখবেন ফিচার ফ্ল্যাগিং মেকানিজম দিয়ে টেস্ট করার আগে এবং পরে অ্যাপের ফাংশনালিটি কীভাবে পরিবর্তন হয়। আমরা যে টুলস এবং ফ্রেমওয়ার্কগুলো ব্যবহার করব সেগুলো হলো Golang, Docker, Redis, Flagsmith, এবং GitHub। আলোচনা অনুযায়ী, সবই ওপেন সোর্স এবং টেস্ট করার জন্য ফ্রি অ্যাকাউন্ট তৈরি করা যায়।

শুরু করতে, আপনার ফেভারিট IDE-এ খুলুন, একটি Golang প্রজেক্ট ইনিশিয়ালাইজ করুন, এবং নিচের কোডটি main.go ফাইলে কপি করুন। তারপর go mod tidy চালান সব ডিপেন্ডেন্সি ইনস্টল করার জন্য।

নিচের কোড স্নিপেটে কী হচ্ছে সেটা বুঝি:

package main
import (
  "context"
  "errors"
  "fmt"
  "log"
  "net/http"
  "os"
  "strconv"
  "github.com/gin-gonic/gin"
  "github.com/go-redis/redis_rate/v10"
  "github.com/joho/godotenv"
  "github.com/redis/go-redis/v9"
)
var (
  redisClient *redis.Client
  limiter *redis_rate.Limiter
)
func initClients() {
  redisClient = redis.NewClient(&redis.Options{
    Addr: os.Getenv("REDIS_URL"),
  })
  limiter = redis_rate.NewLimiter(redisClient)
}
func main() {
  err := godotenv.Load()
  if err != nil {
    log.Printf("Loading environment variable from the host system")
  } else {
    log.Printf("Loading environment from .env file")
  }
  initClients()
  defer redisClient.Close()
  r := gin.Default()
  r.GET("/ping", func(c *gin.Context) {
    err, remainingLimit := rateLimitCall(c.ClientIP())
    if err != nil {
      c.JSON(
        http.StatusTooManyRequests,
        gin.H{"error": "Rate Limit Hit"}
      )
    } else {
      c.JSON(
        http.StatusOK,
        gin.H{"Your left over API request is": remainingLimit}
      )
    }
  })
  r.GET("/beta", func(c *gin.Context) {
    c.JSON(
      http.StatusOK,
      gin.H{"message": "This is beta endpoint"}
    )
  })
  r.Run(":" + os.Getenv("PORT"))
}
func rateLimitCall(ClientIP string) (error, int) {
  ctx := context.Background()
  rateLimitString := os.Getenv("RATE_LIMIT")
  RATE_LIMIT, _ := strconv.Atoi(rateLimitString)
  res, err := limiter.Allow(ctx, ClientIP, redis_rate.PerHour(RATE_LIMIT))
  if err != nil {
    panic(err)
  }
  if res.Remaining == 0 {
    return errors.New("You have hit the Rate Limit for the API. Try again later"), 0
  }
  fmt.Println("remaining request for", ClientIP, "is", res.Remaining)
  return nil, res.Remaining
}

টুলস ইনিশিয়ালাইজ করা

func initClients() {
  redisClient = redis.NewClient(&redis.Options{
    Addr: os.Getenv("REDIS_URL"),
  })
  limiter = redis_rate.NewLimiter(redisClient)
}
func main() {
  err := godotenv.Load()
  if err != nil {
    log.Printf("Loading environment variable from the host system")
  } else {
    log.Printf("Loading environment from .env file")
  }
  initClients()
  defer redisClient.Close()
  r := gin.Default()
  ...
})

শীর্ষে, আমরা Redis এবং রেট লিমিটার ক্লায়েন্টের জন্য ভেরিয়েবল ডিক্লেয়ার করি যাতে একবার ইনিশিয়ালাইজ করে রিয়ুজ করতে পারি। তারপর initClients()-এ সেগুলো ইনিশিয়ালাইজ করি।

main()-এ, প্রথমে আমরা এনভায়রনমেন্ট ভেরিয়েবল সিস্টেম বা .env ফাইল থেকে লোড করি। তারপর initClients() কল করি। এটি ক্লায়েন্টগুলো তৈরি করে এবং আমরা তৈরি করা ভেরিয়েবলগুলোর মধ্যে স্টোর করে।

এরপর, আমরা একটি Gin রাউটার তৈরি করি যা আমাদের সব ইনকামিং রিকোয়েস্ট হ্যান্ডেল করে। এই এনভায়রনমেন্ট ভেরিয়েবলগুলো আমাদের .env ফাইলে থাকতে হবে। এই ডেমোর জন্য, আমাদের একটি Redis ইন্সট্যান্স রানিং থাকতে হবে রেট-লিমিটিং ফাংশনালিটির সব ডেটা স্টোর করার জন্য। আমরা Docker বা যেকোনো রিমোট মেশিন ব্যবহার করতে পারি — শুধু REDIS_URL যেনো আপডেট করা থাকে। আমি Docker ব্যবহার করব।

আমরা আরও এগিয়ে যেতে পারি এবং সব এনভায়রনমেন্ট ভেরিয়েবল ফিচার ফ্ল্যাগ থেকে নিতে পারি, কিন্তু এখানে সেটা করব না।

REDIS_URL=localhost:6379
PORT=8080
RATE_LIMIT=10

API-এর জন্য এন্ডপয়েন্ট তৈরি করা

r.GET("/ping", func(c *gin.Context) {
  err, remainingLimit := rateLimitCall(c.ClientIP())
  if err != nil {
    c.JSON(
      http.StatusTooManyRequests,
      gin.H{"error": "Rate Limit Hit"}
    )
  } else {
    c.JSON(
      http.StatusOK,
      gin.H{"Your left over API request is": remainingLimit}
    )
  }
})
r.GET("/beta", func(c *gin.Context) {
  c.JSON(
    http.StatusOK,
    gin.H{"message": "This is beta endpoint"}
  )
})
r.Run(":" + os.Getenv("PORT"))

তারপর আমরা দুটি GET এন্ডপয়েন্ট তৈরি করি, /ping এবং /beta। প্রতিবার কেউ /ping এন্ডপয়েন্ট হিট করলে আমরা rateLimitCall() ফাংশন কল করি। এটি ইনকামিং রিকোয়েস্টের IP অ্যাড্রেস-এর রেট লিমিট চেক এবং সেট করে। এটা সব Redis ইন্সট্যান্সে স্টোর হয় যা আমরা তৈরি করেছিলাম।

তাহলে, এখন যদি ইউজার /ping API এন্ডপয়েন্টের সাথে প্রথমবার ইন্টারঅ্যাক্ট করে, তবে এটি ১০ প্রতি ঘন্টা লিমিটের সাথে একটি এন্ট্রি তৈরি করবে। লিমিট নম্বর ১০ আসছে RATE_LIMIT থেকে যা আমরা সেট করেছিলাম, এবং ঘন্টা পর আপডেট হওয়া আসছে redis_rate.PerHour(RATE_LIMIT) ফাংশন থেকে।

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

/ping এন্ডপয়েন্ট ছাড়া, আমাদের আরেকটি এন্ডপয়েন্ট আছে /beta। এটি একটি সিম্পল মেসেজ রিটার্ন করে, কিন্তু পরে দেখব কীভাবে (ফিচার ফ্ল্যাগ ব্যবহার করে) আমরা এই এন্ডপয়েন্টের ফাংশনালিটি পুরোপুরি অনাবেল এবং ডিজেবল করতে পারি।

ফিচার ফ্ল্যাগিং কীভাবে যোগ করবেন

এখন আমাদের অ্যাপে ফিচার ফ্ল্যাগিং ক্যাপাবিলিটি যোগ করার 시간। আমরা Flagsmith ব্যবহার করব। Flagsmith একটি ওপেন সোর্স সফটওয়্যার যা আমাদের সহজে ফিচার ফ্ল্যাগ তৈরি এবং ম্যানেজ করতে দেয় ওয়েব, মোবাইল, এবং সার্ভার-সাইড অ্যাপ্লিকেশনের জন্য।

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

তাহলে, Flagsmith প্যাকেজ ইনস্টল করুন নিচের কমান্ড চালিয়ে:

go get github.com/Flagsmith/flagsmith-go-client/v3

তারপর প্যাকেজটি ইমপোর্ট করুন flagsmith অ্যালিয়াস দিয়ে। নিচে ফিচার ফ্ল্যাগিং অ্যাপ্লাই করার পর আপডেটেড ফাংশনালিটি দেওয়া হলো।

আমরা এখানে কী চেঞ্জ করলাম সেটা বুঝি (নিচে ব্যাখ্যা করছি):

package main
import (
  "context"
  "errors"
  "fmt"
  "log"
  "net/http"
  "os"
  flagsmith "github.com/Flagsmith/flagsmith-go-client/v3"
  "github.com/gin-gonic/gin"
  "github.com/go-redis/redis_rate/v10"
  "github.com/joho/godotenv"
  "github.com/redis/go-redis/v9"
)
var (
  redisClient *redis.Client
  limiter *redis_rate.Limiter
  flagsmithClient *flagsmith.Client
)
func initClients() {
  redisClient = redis.NewClient(&redis.Options{
    Addr: os.Getenv("REDIS_URL"),
  })
  limiter = redis_rate.NewLimiter(redisClient)
  flagsmithClient = flagsmith.NewClient(os.Getenv("FLAGSMITH_ENVIRONMENT_KEY"))
}
func main() {
  err := godotenv.Load()
  if err != nil {
    log.Printf("Loading environment variable from the host system")
  } else {
    log.Printf("Loading environment from .env file")
  }
  initClients()
  defer redisClient.Close()
  r := gin.Default()
  r.GET("/ping", func(c *gin.Context) {
    err, remainingLimit := rateLimitCall(c.ClientIP())
    if err != nil {
      c.JSON(
        http.StatusTooManyRequests,
        gin.H{"error": "Rate Limit Hit"}
      )
    } else {
      c.JSON(
        http.StatusOK,
        gin.H{"Your left over API request is": remainingLimit}
      )
    }
  })
  r.GET("/beta", func(c *gin.Context) {
    flags := getFeatureFlags()
    isEnabled, _ := flags.IsFeatureEnabled("beta")
    if isEnabled {
      c.JSON(
        http.StatusOK,
        gin.H{"message": "This is beta endpoint"}
      )
    } else {
      c.String(http.StatusNotFound, "404 page not found")
    }
  })
  r.Run(":" + os.Getenv("PORT"))
}
func rateLimitCall(ClientIP string) (error, int) {
  ctx := context.Background()
  flags := getFeatureFlags()
  rateLimitInterface, _ := flags.GetFeatureValue("rate_limit")
  RATE_LIMIT := int(rateLimitInterface.(float64))
  fmt.Println("Current Rate Limit is", RATE_LIMIT)
  res, err := limiter.Allow(ctx, ClientIP, redis_rate.PerHour(RATE_LIMIT))
  if err != nil {
    panic(err)
  }
  if res.Remaining == 0 {
    return errors.New("You have hit the Rate Limit for the API. Try again later"), 0
  }
  fmt.Println("remaining request for", ClientIP, "is", res.Remaining)
  return nil, res.Remaining
}
func getFeatureFlags() flagsmith.Flags {
  ctx := context.Background()
  flags, _ := flagsmithClient.GetEnvironmentFlags(ctx)
  return flags
}

ফিচার ফ্ল্যাগ কোড লজিক বোঝা

func getFeatureFlags() flagsmith.Flags {
  ctx := context.Background()
  flags, _ := flagsmithClient.GetEnvironmentFlags(ctx)
  return flags
}

প্রথমে, সরাসরি নিচে তৈরি করা নতুন getFeatureFlags() ফাংশনে যাই। এই ফাংশনটি Flagsmith ড্যাশবোর্ডে তৈরি করা সকল ফ্ল্যাগ রিটার্ন করবে, flagsmithClient-এ GetEnvironmentFlags() মেথড কল করে।

আমরা flagsmithClient-কে initClients() ফাংশনে ইনিশিয়ালাইজ করেছিলাম। Flagsmith Client-কে এক্সেস কী লাগে ( NewClient() ফাংশন) যা আমরা Flagsmith ড্যাশবোর্ড থেকে পাব। Redis এবং Limiter ক্লায়েন্টের মতো, আমরা ক্লায়েন্টটি একটি গ্লোবাল ভেরিয়েবলে স্টোর করব রিয়ুজেবিলিটির জন্য। ড্যাশবোর্ড, ফ্ল্যাগ তৈরি, এবং কী রিট্রিভ করার প্রক্রিয়া পরবর্তী স্টেপে বোঝাব।

func rateLimitCall(ClientIP string) (error, int) {
  ctx := context.Background()
  flags := getFeatureFlags()
  rateLimitInterface, _ := flags.GetFeatureValue("rate_limit")
  RATE_LIMIT := int(rateLimitInterface.(float64))
  fmt.Println("Current Rate Limit is", RATE_LIMIT)
  res, err := limiter.Allow(ctx, ClientIP, redis_rate.PerHour(RATE_LIMIT))
  if err != nil {
    panic(err)
  }
  if res.Remaining == 0 {
    return errors.New("You have hit the Rate Limit for the API. Try again later"), 0
  }
  fmt.Println("remaining request for", ClientIP, "is", res.Remaining)
  return nil, res.Remaining
}

এখন rateLimitCall() ফাংশনে, এনভায়রনমেন্ট থেকে RATE_LIMIT নেওয়ার বদলে, আমরা rate_limit ফ্ল্যাগ থেকে ভ্যালু নিচ্ছি (যেটি আমরা পরে তৈরি করব)। আমরা getFeatureFlags() কল করি এবং সব ফ্ল্যাগ থেকে rate_limit ফ্ল্যাগের ভ্যালু বের করি।

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

r.GET("/beta", func(c *gin.Context) {
  flags := getFeatureFlags()
  isEnabled, _ := flags.IsFeatureEnabled("beta")
  if isEnabled {
    c.JSON(
      http.StatusOK,
      gin.H{"message": "This is beta endpoint"}
    )
  } else {
    c.String(http.StatusNotFound, "404 page not found")
  }
})

এখন /beta এন্ডপয়েন্টে, beta ফ্ল্যাগ ইनेबलড বা ডিজেবলড কিনা তার ভিত্তিতে এই এন্ডপয়েন্ট কোয়েরি সার্ভ করবে। অন্যথায়, এটি একটি নন-রিচেয়েবল এন্ডপয়েন্টের মতো আচরণ করবে এবং 404 এরর মেসেজ রিটার্ন করবে।

আমাদের উদাহরণে, আমি একটি বেসিক প্লেসহোল্ডার মেসেজ যোগ করেছি দেখানোর জন্য কীভাবে কাজ করে, কিন্তু এটি টেস্টিং এবং ইনিশিয়াল রিলিজ (বিটা)-এ নতুন সম্ভাবনার দরজা খুলে দেয়। যদি API-এ একটি নতুন এন্ডপয়েন্ট থাকে, তবে আমরা ফাংশনালিটি ফিচার ফ্ল্যাগে র‍্যাপ করে একটি বাটন ক্লিক দিয়ে এভেইলেবল এবং অনঅভেইলেবল করতে পারি। এছাড়া আমরা আরও অনেক কিছু করতে পারি যেমন স্কিডিউলিং এবং ক্যানারি রিলিজ।

এছাড়া আমাদের .env ফাইলটি এরকম দেখাবে। আমরা RATE_LIMIT সরিয়ে দিয়েছি এবং FLAGSMITH_ENVIRONMENT_KEY যোগ করেছি।

REDIS_URL=localhost:6379
PORT=8080
FLAGSMITH_ENVIRONMENT_KEY=ser.ZRd***********469

Flagsmith ড্যাশবোর্ডে ফিচার ফ্ল্যাগ তৈরি করা

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

সাইন আপ করার পর আপনাকে একটি অর্গানাইজেশন এবং একটি প্রজেক্ট তৈরি করার জন্য বলা হবে। প্রজেক্ট সেপারেশন ভালো, কারণ এটি আমাদের বিভিন্ন প্রজেক্টের লজিক আইসোলেট করতে সাহায্য করে। একবার হয়ে গেলে, আপনি নিচের স্ক্রিনশটের মতো একটি ড্যাশবোর্ড দেখবেন।

ইন্টিগ্রেশন থেকে স্কিডিউলিং ফ্ল্যাগ এবং চেঞ্জ কম্পেয়ার করার পর্যন্ত আমাদের ढের সারা ফাংশনালিটি আছে। Go ছাড়াও Flagsmith অনেক SDK প্রদান করে। আপনি যেখানে ল্যাঙ্গুয়েজের নাম লেখা আছে সেখানে ক্লিক করলে সে ল্যাঙ্গুয়েজের জন্য কিছু বয়লারপ্লেট কোড দেবে।

ওপেন-সোর্স টুলস দিয়ে ফিচার ফ্ল্যাগ ব্যবহার করে স্কেলেবল API বানান

রেট লিমিটিং ফিচার ফ্ল্যাগ

এখন, আমাদের প্রথম ফিচার ফ্ল্যাগ তৈরি করি রেট লিমিটের জন্য। টপ রাইট কর্নারের Create Feature বাটনে ক্লিক করুন। একটি সাইডবার উইন্ডো খুলবে। নাম সেট করুন, তারপর ফ্ল্যাগটি তৈরি করার সময় সঠিকভাবে অনাবেল করার জন্য, আমরা Enabled by default সিলেক্ট করতে পারি।

ভ্যালু সেকশনে, আমাদের ফ্ল্যাগ ভ্যালু সেট করতে হবে। এটি Txt, JSON, XML, ইত্যাদি ফরম্যাট নিতে পারে। যেহেতু আমাদের ফিচার ভ্যালু সিম্পল টেক্সট seperti ২০, ৩০, ইত্যাদি, তাই আমরা Txt (ডিফল্টটি) বেছে নেব এবং একটি র‍্যান্ডম লিমিট সেট করব — আমরা ২০ দিয়ে যাব।

আপনি ট্যাগ এবং ডেসক্রিপশনও দিতে পারেন। ফিচার ফ্ল্যাগ ফিল্টার আউট করার জন্য ট্যাগ হেল্পফুল হতে পারে। উদাহরণস্বরূপ, আমরা একটি ট্যাগ backend তৈরি করতে পারি ব্যাকএন্ড সংক্রান্ত সকল ফিচার ফ্ল্যাগ ফিল্টার আউট করার জন্য। ডেসক্রিপশন হলো একটি সংক্ষিপ্ত ব্যাখ্যা যে এই নির্দিষ্ট ফিচার ফ্ল্যাগ ইনেবলড হলে কী করে (এবং ভবিষ্যতে বোঝার জন্য সাহায্য করবে)।

নিচের স্ক্রিনশটে দেখানো হয়েছে ডিটেইল পূরণ করার পর কীভাবে দেখাবে। তারপর Create Feature বাটনে ক্লিক করুন ফ্ল্যাগ তৈরি করার জন্য।

ওপেন-সোর্স টুলস দিয়ে ফিচার ফ্ল্যাগ ব্যবহার করে স্কেলেবল API বানান

বিটা ফিচার ফ্ল্যাগ

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

ওপেন-সোর্স টুলস দিয়ে ফিচার ফ্ল্যাগ ব্যবহার করে স্কেলেবল API বানান

অ্যাক্সেস কী পাওয়া

অ্যাক্সেস কী পাওয়ার জন্য, সাইডবার থেকে SDK Keys-এ ক্লিক করুন, এবং Create Server-side Environment Key বাটনে ক্লিক করুন একটি কী জেনারেট করতে। যেহেতু আমাদের অ্যাপ সার্ভার-সাইড, সেটাই ব্যবহার করা ভালো। তারপর সেই কীটি কপি করে .env-এ FLAGSMITH_ENVIRONMENT_KEY কীটির ভ্যালু হিসেবে পেস্ট করুন।

ওপেন-সোর্স টুলস দিয়ে ফিচার ফ্ল্যাগ ব্যবহার করে স্কেলেবল API বানান

API চালানো

এখন সব সেট, তাই IDE-এ ফিরে যাই এবং টার্মিন্যালে go run main.go কমান্ড এক্সিকিউট করে সার্ভার চালান। টার্মিন্যালে এই মেসেজটি দেখবেন। যদি কোনো এরর হয়, তবে চেক করুন প্যাকেজগুলো সঠিকভাবে ইনস্টল হয়েছে কিনা, ভেরিয়েবলগুলো সঠিকভাবে সেট হয়েছে কিনা, এবং অ্যাপটি Redis ইন্সট্যান্স এক্সেস করতে পারছে কিনা।

ওপেন-সোর্স টুলস দিয়ে ফিচার ফ্ল্যাগ ব্যবহার করে স্কেলেবল API বানান

এখন যদি আমরা localhost:8080/ping ভিজিট করি, তবে আমরা একটি মেসেজ পাব {"Your left over API request is":19}। লিমিট ছিল ২০, আমরা একবার রিকোয়েস্ট করলাম, এবং রিমেনিং ১৯।

ওপেন-সোর্স টুলস দিয়ে ফিচার ফ্ল্যাগ ব্যবহার করে স্কেলেবল API বানান

rate_limit ফ্ল্যাগ আপডেট করা

চলুন rate_limit ফ্ল্যাগের ভ্যালু ১০ করে আপডেট করি এবং দেখি কী হয়। এর জন্য আবার Flagsmith ড্যাশবোর্ডে যান এবং ফ্ল্যাগের নামের ওপর ক্লিক করুন। একটি সাইড মেনু বার খুলবে। ভ্যালু ১০ আপডেট করুন, এবং Update Feature Value বাটনে ক্লিক করুন।

আমরা আপডেটটি স্কিডিউলও করতে পারি। উদাহরণস্বরূপ, এটি ইউজফুল যখন আমরা একটি নির্দিষ্ট টাইমফ্রেমে ট্রাফিক স্পাইক এক্সপেক্ট করি এবং সার্ভার লোড কমাতে প্রতি ইউজার লিমিট কমাতে চাই।

ওপেন-সোর্স টুলস দিয়ে ফিচার ফ্ল্যাগ ব্যবহার করে স্কেলেবল API বানান

এখন যদি আপনি localhost:8080/ping ভিজিট করেন, তবে আপনি একটি মেসেজ পাবেন {"Your left over API request is":8} — কারণ টোটাল লিমিট ১০ এবং আমরা ইতিমধ্যে দুবার রিকোয়েস্ট করেছি।

ওপেন-সোর্স টুলস দিয়ে ফিচার ফ্ল্যাগ ব্যবহার করে স্কেলেবল API বানান

চলুন /beta এন্ডপয়েন্ট টেস্ট করি। localhost:8080/beta ভিজিট করুন, এবং আমরা একটি মেসেজ পাব {"message":"This is beta endpoint"}।

ওপেন-সোর্স টুলস দিয়ে ফিচার ফ্ল্যাগ ব্যবহার করে স্কেলেবল API বানান

এখন Flagsmith ড্যাশবোর্ডে ফিরে যান এবং সوییচটি টগল করে এই ফ্ল্যাগটি ডিজেবল করুন। এখন URL ভিজিট করুন। আপনি একটি 404 মেসেজ পাবেন যেন এই এন্ডপয়েন্ট কখনো একজিস্ট করলো না।

ওপেন-সোর্স টুলস দিয়ে ফিচার ফ্ল্যাগ ব্যবহার করে স্কেলেবল API বানান

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

GitHub অ্যাপের সাথে ফিচার ফ্ল্যাগ ইন্টিগ্রেট করা

প্রথমে, নিশ্চিত করুন আপনি আপনার অ্যাপ GitHub-এ পুশ করেছেন। তারপর, GitHub Marketplace থেকে আপনার রিপোজিটরিতে GitHub Flagsmith App ইনস্টল করুন।

GitHub এবং Flagsmith ইন্টিগ্রেট করলে, আমরা আপনার ফিচার ফ্ল্যাগ/ফিচারগুলোর আপডেট GitHub Issues এবং Pull Request-এ কমেন্ট হিসেবে দেখতে পাব। এটি আমাদের ফিচারগুলো সহজে ট্র্যাক করতে দেয়, একটি ইস্যু তৈরি করার থেকে PR মর্জ এবং চেঞ্জ ডিপ্লয় করার পর্যন্ত।

ওপেন-সোর্স টুলস দিয়ে ফিচার ফ্ল্যাগ ব্যবহার করে স্কেলেবল API বানান

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

ইনস্টল করার সাথে সাথে, আপনি অটোমেটিক্যালি Flagsmith ড্যাশবোর্ডে রিডাইরেক্ট হবেন কনফিগারেশন কমপ্লিট করার জন্য। অধিকাংশ ডেটা প্রি-পপুলেটেড থাকবে, তাই আপনাকে শুধু একটি প্রজেক্ট সিলেক্ট করে অ্যাড করতে হবে, এবং কনফিগারেশন সেভ করতে হবে।

ওপেন-সোর্স টুলস দিয়ে ফিচার ফ্ল্যাগ ব্যবহার করে স্কেলেবল API বানান

Save Configuration Button-এ হিট করলে, এটি আপনাকে আবার মেইন Flagsmith ড্যাশবোর্ডে রিডাইরেক্ট করবে যেখানে আমরা আগে কাজ করতাম।

এখন চলুন একটি এক্সিস্টিং ফ্ল্যাগকে GitHub ইস্যু/পুল রিকোয়েস্টের সাথে লিংক করি (একটি ডামি PR/ইস্যু রেইজ করে টেস্ট করুন), অথবা আপনি একটি নতুন ফ্ল্যাগ তৈরি করতে পারেন টেস্ট করার জন্য। চলুন beta ফ্ল্যাগটির সাথে এগিয়ে যাই যা আমরা ইতিমধ্যে beta এন্ডপয়েন্টের জন্য তৈরি করেছিলাম।

ফ্ল্যাগকে একটি এক্সিস্টিং ইস্যু বা পুল রিকোয়েস্টের সাথে লিংক করতে, ফ্ল্যাগের নামের ওপর ক্লিক করুন, এবং ডান পাশ থেকে একটি সাইড মেনু পপ আপ হবে। তারপর, 'Link' ট্যাব বেছে নিন। তারপর Pull Request অপশন সিলেক্ট করুন, এবং যে Pull Request-টিকে লিংক করতে চান সেটা বেছে নিন। এই ফ্ল্যাগের সাথে লিংক করা আপনার সব Issues এবং Pull Requests নিচে ভিজিবল:

ওপেন-সোর্স টুলস দিয়ে ফিচার ফ্ল্যাগ ব্যবহার করে স্কেলেবল API বানান

ফ্ল্যাগ সফলভাবে লিংক হয়েছে কিনা ভেরিফাই করতে, Name কলাম হেডিং-এর নিচে আro কারত আরো আইকনসহ হাইপারলিংকে ক্লিক করুন। এটি আপনাকে সেই নির্দিষ্ট Issue/Pull Request-এ GitHub-এ নেভিগেট করবে। আপনি দেখবেন যে Flagsmith GitHub App নিচে কমেন্ট করেছে সব ডিটেইলসহ, যেমন এনভায়রনমেন্ট, ইনাবেলড ভ্যালু, ইত্যাদি।

ওপেন-সোর্স টুলস দিয়ে ফিচার ফ্ল্যাগ ব্যবহার করে স্কেলেবল API বানান

Flagsmith GitHub অ্যাপ টেস্ট করা

এই পর, আপনি ফ্ল্যাগ সেটিংসে যেকোনো পরিবর্তন করলে, যেমন অন/অফ করা বা ভ্যালু পরিবর্তন করা, বটটি সব আপডেটেড ডিটেইলসহ কমেন্ট করবে।

চলুন টেস্ট করি ফ্ল্যাগটি অফ করি। ড্যাশবোর্ড থেকে ফ্ল্যাগটি অফ করার সাথে সাথে, বট কমেন্ট করবে যে ফ্ল্যাগটি এখন ডিজেবলড হয়েছে:

ওপেন-সোর্স টুলস দিয়ে ফিচার ফ্ল্যাগ ব্যবহার করে স্কেলেবল API বানান

এটাই ছিল। Flagsmith-কে GitHub-এ ইন্টিগ্রেট করা কত সিম্পল সেটা দেখলাম।

উপসংহার

সারসংক্ষেপে, আপনি এখন জানেন কীভাবে একটি ব্যাকএন্ড ডেভেলপার হিসেবে ফিচার ফ্ল্যাগ লিভারেজ করতে পারেন আপনার অ্যাপের ফাংশনালিটি অন-দ-ফ্লাই পরিবর্তন করার জন্য।

নেক্সট লেভেলে নেওয়ার জন্য, আমরা আমাদের ডেমো অ্যাপকে Flagsmith GitHub অ্যাপের সাথে ইন্টিগ্রেট করেছি যাতে এটি আমাদের ফিচার ফ্ল্যাগগুলোর স্ট্যাটাস চেঞ্জ Pul Requests/Issues-এ আপডেট রাখে ম্যানুয়ালি আপডেট ছাড়া।

Flagsmith রিপো চেক করুন এখানে এবং এই সব প্রজেক্টকে একটি স্টার দিয়ে আপনার সমর্থন জানাতে ভুলবেন না। আপনি তাদের চমৎকার কমিউনিটির সাথে যোগ দিয়ে টেকনিক্যাল সাপোর্টও পেতে পারেন।

আপনি আমার সাথে — Pradumna Saraf, সোশ্যালসে কানেক্ট করতে পারেন।

নিঃশুল্ক কোডিং শিখুন। freeCodeCamp-এর ওপেন সোর্স কারিকুলাম ৪০,০০০-এর বেশি মানুষকে ডেভেলপার হিসেবে জব পেতে সাহায্য করেছে। শুরু করুন

  1. CSS3 Multiple Backgrounds (একাধিক ব্যাকগ্রাউন্ড) যোগ করা

  2. Kibana-এ 써드-পার্টি ম্যাপ টাইল ইন্টিগ্রেট করা: উন্নত জিওস্পেশিয়াল ভিজ্যুয়ালাইজেশনের জন্য

  3. অ্যান্ড্রয়েড ListView-এর রঙ এবং ফন্ট কীভাবে পরিবর্তন করবেন?

  4. Upstash Multi-Zone Replication: রেজিলিয়েন্স ও স্কেলেবিলিটি বাড়ান