স্কালা Akka HTTP এবং স্ট্রিমিং API

স্কালা HTTP এবং REST API - স্কালা প্রোগ্রামিং (Scala Programming) - Computer Programming

181

Akka HTTP এবং Akka Streams স্কালার জন্য দুটি অত্যন্ত শক্তিশালী লাইব্রেরি, যা রিয়েল-টাইম ওয়েব সার্ভিস এবং ডেটা স্ট্রিমিং প্রক্রিয়াগুলির জন্য ব্যবহৃত হয়। Akka HTTP একটি HTTP সার্ভার তৈরি করতে এবং ক্লায়েন্টের জন্য HTTP রিকোয়েস্ট পাঠাতে ব্যবহৃত হয়, আর Akka Streams একটি reactive স্ট্রিম প্রসেসিং লাইব্রেরি যা ডেটা স্ট্রিমের উপর প্রক্রিয়া সম্পাদন করে।

এখানে Akka HTTP এবং Akka Streams সম্পর্কে বিস্তারিত আলোচনা করা হবে এবং কীভাবে এগুলি স্কালায় ওয়েব সার্ভিস এবং ডেটা স্ট্রিমিং অ্যাপ্লিকেশন তৈরি করতে ব্যবহার করা যায় তা উদাহরণসহ ব্যাখ্যা করা হবে।


১. Akka HTTP

Akka HTTP হল একটি lightweight HTTP ফ্রেমওয়ার্ক যা HTTP সার্ভার এবং ক্লায়েন্ট তৈরি করার জন্য ব্যবহৃত হয়। এটি Akka প্ল্যাটফর্মের উপর ভিত্তি করে তৈরি এবং reactive programming ধারণা অনুসরণ করে।

Akka HTTP-তে সাধারণ ওয়েব সার্ভিস তৈরি করা

  1. Akka HTTP ডিপেন্ডেন্সি যোগ করা:

    আপনার build.sbt ফাইলে নিচের ডিপেন্ডেন্সি যোগ করুন:

    libraryDependencies += "com.typesafe.akka" %% "akka-http" % "10.2.6"
    libraryDependencies += "com.typesafe.akka" %% "akka-stream" % "2.6.14"
  2. একটি সাধারণ HTTP সার্ভার তৈরি করা:

    এখানে একটি সাধারণ Akka HTTP সার্ভারের উদাহরণ দেয়া হলো, যা HTTP রিকোয়েস্ট গ্রহণ করে এবং HTTP রেসপন্স পাঠায়।

    import akka.actor.ActorSystem
    import akka.http.scaladsl.Http
    import akka.http.scaladsl.server.Directives._
    import akka.stream.ActorMaterializer
    import akka.http.scaladsl.model.StatusCodes
    
    object AkkaHttpServer {
      def main(args: Array[String]): Unit = {
        implicit val system = ActorSystem("my-system")
        implicit val materializer = ActorMaterializer()
        implicit val executionContext = system.dispatcher
    
        // Define the route (endpoint)
        val route =
          path("hello") {
            get {
              complete(StatusCodes.OK, "Hello, Akka HTTP!")
            }
          }
    
        // Bind the HTTP server to a port
        Http().newServerAt("localhost", 8080).bind(route)
        println("Server started at http://localhost:8080/")
      }
    }

    এখানে:

    • path("hello"): একটি HTTP রাউট তৈরি করা হয়েছে, যা /hello পাথে GET রিকোয়েস্ট গ্রহণ করবে।
    • complete: এটি রেসপন্স তৈরি করে, যেখানে "Hello, Akka HTTP!" বার্তা পাঠানো হবে।
    • Http().newServerAt("localhost", 8080): এই লাইনটি সার্ভারকে লোকালহোস্টের 8080 পোর্টে চালু করে।
  3. ক্লায়েন্ট HTTP রিকোয়েস্ট করা:

    Akka HTTP ক্লায়েন্টের সাহায্যে আপনি HTTP রিকোয়েস্ট পাঠাতে পারেন। নিচে এর উদাহরণ:

    import akka.actor.ActorSystem
    import akka.http.scaladsl.Http
    import akka.http.scaladsl.model._
    import akka.http.scaladsl.unmarshalling.Unmarshal
    import akka.stream.ActorMaterializer
    
    object AkkaHttpClient {
      def main(args: Array[String]): Unit = {
        implicit val system = ActorSystem("my-system")
        implicit val materializer = ActorMaterializer()
        implicit val executionContext = system.dispatcher
    
        val responseFuture = Http().singleRequest(HttpRequest(uri = "http://localhost:8080/hello"))
    
        responseFuture.flatMap { response =>
          Unmarshal(response.entity).to[String].map { body =>
            println(s"Response: $body")
          }
        }
      }
    }

    এখানে:

    • singleRequest: HTTP রিকোয়েস্ট পাঠানোর জন্য ব্যবহৃত হয়।
    • Unmarshal(response.entity).to[String]: রেসপন্সের বডি থেকে স্ট্রিং আউটপুট বের করা হয়।

২. Akka Streams

Akka Streams হল একটি reactive streams লাইব্রেরি যা স্কালায় ডেটা প্রসেসিংয়ের জন্য ব্যবহৃত হয়। এটি একটি backpressure মেকানিজম ব্যবহার করে, যা ডেটা স্ট্রিমের গতিকে নিয়ন্ত্রণ করে। Akka Streams, Akka Actor Model এবং Akka HTTP-এর সাথে একত্রে কাজ করে।

Akka Streams এর মাধ্যমে ডেটা প্রসেসিং

  1. Akka Streams ডিপেন্ডেন্সি যোগ করা:

    আপনার build.sbt ফাইলে নিচের ডিপেন্ডেন্সি যোগ করুন:

    libraryDependencies += "com.typesafe.akka" %% "akka-stream" % "2.6.14"
  2. Akka Streams ফ্লো (Flow) তৈরি করা:

    এখানে একটি Akka Streams ফ্লো উদাহরণ দেয়া হলো, যেখানে একটি লিস্টের ডেটা প্রসেস করা হবে:

    import akka.actor.ActorSystem
    import akka.stream.{ActorMaterializer, Materializer}
    import akka.stream.scaladsl.{Source, Flow, Sink}
    
    object AkkaStreamsExample {
      def main(args: Array[String]): Unit = {
        implicit val system: ActorSystem = ActorSystem("AkkaStreamsSystem")
        implicit val materializer: Materializer = ActorMaterializer()
    
        // Define a Source
        val source = Source(List(1, 2, 3, 4, 5))
    
        // Define a Flow (a transformation step)
        val flow = Flow[Int].map(x => x * 2)
    
        // Define a Sink (where data will end up)
        val sink = Sink.foreach[Int](println)
    
        // Connect Source -> Flow -> Sink
        source.via(flow).to(sink).run()
      }
    }

    এখানে:

    • Source: এটি একটি ডেটা স্ট্রিম তৈরি করে (এখানে একটি লিস্ট)।
    • Flow: এটি একটি ট্রান্সফর্মেশন স্টেপ, যা ডেটাকে প্রসেস করে (এখানে ইনপুট ভ্যালুকে দ্বিগুণ করা হচ্ছে)।
    • Sink: এটি ডেটা গ্রহণ করে এবং আউটপুট হিসেবে প্রিন্ট করে।
  3. Backpressure:

    Akka Streams backpressure মেকানিজম ব্যবহার করে, যা নিশ্চিত করে যে ডেটা স্ট্রিমিংয়ের গতি বজায় থাকবে এবং অতিরিক্ত ডেটা প্রসেসিং এড়ানো যাবে। এটি স্ট্রিমের অবস্থা এবং গতির উপর নির্ভর করে ডেটার সাইজ এবং আউটপুট নিয়ন্ত্রণ করতে সাহায্য করে।


৩. Akka HTTP এবং Streams একত্রে ব্যবহার

Akka HTTP এবং Akka Streams একত্রে ব্যবহার করে আপনি রিয়েল-টাইম ডেটা স্ট্রিমিং এবং HTTP সার্ভার তৈরি করতে পারেন। নিচে একটি উদাহরণ দেয়া হলো, যেখানে HTTP রিকোয়েস্টের মাধ্যমে ডেটা স্ট্রিম করা হয়:

import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.server.Directives._
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Source, Sink, Flow}

object AkkaHttpStreamExample {
  def main(args: Array[String]): Unit = {
    implicit val system = ActorSystem("AkkaHttpStreamSystem")
    implicit val materializer = ActorMaterializer()

    val route =
      path("stream") {
        get {
          val source = Source(List("one", "two", "three"))
          val flow = Flow[String].map(str => s"Item: $str")
          val sink = Sink.foreach[String](println)

          // Connect Source -> Flow -> Sink
          source.via(flow).to(sink).run()

          complete("Streaming Started!")
        }
      }

    Http().newServerAt("localhost", 8080).bind(route)
    println("Server started at http://localhost:8080/stream")
  }
}

এখানে:

  • Source থেকে ডেটা স্ট্রিম করা হচ্ছে, যা HTTP রিকোয়েস্টে ব্যবহৃত হবে।
  • Flow ডেটার ট্রান্সফর্মেশন করছে, যেমন ডেটাকে স্ট্রিং হিসেবে প্রক্রিয়া করা হচ্ছে।
  • Sink ডেটাকে প্রিন্ট করছে।

সারাংশ

  • Akka HTTP হল একটি শক্তিশালী HTTP ফ্রেমওয়ার্ক যা ওয়েব সার্ভার এবং ক্লায়েন্ট তৈরি করতে ব্যবহৃত হয়।
  • Akka Streams হল একটি reactive streams লাইব্রেরি, যা ডেটা স্ট্রিমিংয়ের জন্য ব্যবহৃত হয় এবং backpressure নিয়ন্ত্রণ করে।
  • এই দুটি একত্রে ব্যবহার করে আপনি **রিয়েল-টাইম ডেট

া স্ট্রিমিং** এবং HTTP সার্ভিস তৈরি করতে পারেন। Akka HTTP এবং Akka Streams স্কালার শক্তিশালী টুল যা আপনাকে scalable, reactive, এবং efficient ডেটা প্রসেসিং সিস্টেম তৈরি করতে সহায়তা করে।

Content added By
Promotion

Are you sure to start over?

Loading...