Akka হল একটি শক্তিশালী ফ্রেমওয়ার্ক যা Actor Model ব্যবহার করে কনকারেন্ট, ডিসট্রিবিউটেড, এবং রেসিলিয়েন্ট অ্যাপ্লিকেশন তৈরি করতে ব্যবহৃত হয়। Akka Cluster এবং Akka Remote দুটি ফিচার প্রদান করে, যা ডিস্ট্রিবিউটেড অ্যাপ্লিকেশন তৈরির জন্য অত্যন্ত উপযোগী। এই দুটি ফিচার ব্যবহার করে আপনি আপনার অ্যাক্টরদের একাধিক নোডে বা মেশিনে স্থাপন করতে পারেন এবং তারা একে অপরের সাথে যোগাযোগ করতে পারে।
১. Akka Cluster
Akka Cluster একটি ডিসট্রিবিউটেড সিস্টেম তৈরি করতে সাহায্য করে, যেখানে একাধিক নোড বা মেশিনের মধ্যে অ্যাক্টররা একে অপরের সাথে যোগাযোগ করতে পারে। এটি failover এবং scalability সুবিধা প্রদান করে। Akka Cluster আপনাকে ডিস্ট্রিবিউটেড অ্যাপ্লিকেশন তৈরির জন্য নিম্নলিখিত সুবিধা প্রদান করে:
- Clustering: একাধিক নোডের মধ্যে অ্যাক্টরগুলিকে যুক্ত করা।
- Failover: এক নোড ব্যর্থ হলে অন্য নোড থেকে অ্যাক্টর পুনরুদ্ধার করা।
- Eventual Consistency: নোডগুলির মধ্যে ডেটা সমন্বয় করা।
- Shard: একাধিক নোডের মধ্যে অ্যাক্টরদের শার্ড করা (Shard-based routing)।
১.১ Akka Cluster কনফিগারেশন
Akka Cluster ব্যবহার করতে হলে আপনাকে application.conf ফাইলে কিছু কনফিগারেশন করতে হবে। এখানে একটি সাধারণ Akka Cluster কনফিগারেশন দেখানো হলো:
akka {
actor {
provider = "cluster" // Enable Akka Cluster
}
remote {
enabled-transports = ["akka.remote.netty.tcp"]
netty.tcp {
hostname = "127.0.0.1"
port = 2551
}
}
cluster {
seed-nodes = [
"akka.tcp://ClusterSystem@127.0.0.1:2551",
"akka.tcp://ClusterSystem@127.0.0.1:2552"
]
auto-down-unreachable-after = 10s
}
}এখানে:
hostnameএবংportসেট করা হয়েছে, যা নোডের ঠিকানা নির্ধারণ করে।seed-nodesহল সিড নোডগুলির তালিকা, যেগুলি ক্লাস্টারের অন্যান্য নোডগুলোকে জানায়।auto-down-unreachable-afterসেকেন্ডে সেট করা হয়েছে, যার মাধ্যমে একটি নোড যদি দীর্ঘ সময়ের জন্য পৌঁছাতে না পারে, তবে তা ডাউন হিসেবে চিহ্নিত হবে।
১.২ Akka Cluster কোড উদাহরণ
এখন আমরা একটি সিম্পল Akka Cluster উদাহরণ তৈরি করি যেখানে দুইটি নোড অ্যাক্টরদের মধ্যে যোগাযোগ করবে।
ClusterApp.scala:
import akka.actor.{Actor, ActorSystem, Props}
import akka.cluster.Cluster
import akka.cluster.ClusterEvent.{MemberUp, MemberEvent}
class ClusterListener extends Actor {
val cluster = Cluster(context.system)
// Subscribe to cluster changes
cluster.subscribe(self, classOf[MemberEvent])
def receive = {
case MemberUp(member) =>
println(s"Member is Up: ${member.address}")
case _ => // Ignore other messages
}
}
object ClusterApp extends App {
val system = ActorSystem("ClusterSystem")
val listener = system.actorOf(Props[ClusterListener], name = "clusterListener")
// Join the cluster
val cluster = Cluster(system)
cluster.join(cluster.selfAddress)
// Keep the application running
println("Cluster system is running.")
}এখানে:
- ClusterListener অ্যাক্টরটি ক্লাস্টারের সদস্যদের পরিবর্তন দেখবে এবং সদস্যদের
MemberUpস্টেটাস মেসেজ গ্রহণ করবে। cluster.join(cluster.selfAddress)এর মাধ্যমে নোডটি ক্লাস্টারে যোগদান করবে।
২. Akka Remote
Akka Remote আপনাকে আপনার অ্যাক্টরদের একাধিক মেশিনে বা নোডে চালানোর ক্ষমতা দেয় এবং তারা একে অপরের সাথে যোগাযোগ করতে পারে। Akka Remote ব্যবহৃত হয় যখন আপনি একাধিক অ্যাক্টর সিস্টেমকে আলাদা মেশিনে বা প্রক্রিয়ায় চালাতে চান।
২.১ Akka Remote কনফিগারেশন
Akka Remote ব্যবহার করার জন্য আপনাকে application.conf ফাইলে কনফিগারেশন করতে হবে।
akka {
remote {
enabled-transports = ["akka.remote.netty.tcp"]
netty.tcp {
hostname = "127.0.0.1"
port = 2551
}
}
}এখানে, hostname এবং port সেট করা হয়েছে, যা নির্দিষ্ট করে দেয় যে এই অ্যাক্টর সিস্টেম কোন মেশিনে চলবে এবং কোন পোর্টে এটি অ্যাক্সেস করা যাবে।
২.২ Akka Remote উদাহরণ
এখন একটি উদাহরণ দেখানো হলো যেখানে Akka Remote ব্যবহার করা হচ্ছে দুটি আলাদা সিস্টেমের মধ্যে যোগাযোগের জন্য।
RemoteSender.scala (Sender Side):
import akka.actor.{Actor, ActorSystem, Props}
import akka.remote.RemoteScope
class RemoteActor extends Actor {
def receive = {
case msg: String => println(s"Received message: $msg")
}
}
object RemoteSender extends App {
val system = ActorSystem("RemoteSystem")
val remoteActor = system.actorOf(Props[RemoteActor], name = "remoteActor")
// Send a message to the remote actor
remoteActor ! "Hello from remote system"
}RemoteReceiver.scala (Receiver Side):
import akka.actor.{Actor, ActorSystem, Props}
class RemoteActor extends Actor {
def receive = {
case msg: String => println(s"Received message: $msg")
}
}
object RemoteReceiver extends App {
val system = ActorSystem("RemoteSystem")
val remoteActor = system.actorOf(Props[RemoteActor], name = "remoteActor")
// Wait for messages
}এখানে:
- RemoteSender অ্যাক্টরটি একটি মেসেজ "Hello from remote system" পাঠাচ্ছে।
- RemoteReceiver অ্যাক্টরটি রিসিভ করে মেসেজটি প্রিন্ট করবে।
৩. Akka Cluster এবং Remote-এর সুবিধা
- Scalability: Akka Cluster ব্যবহার করে আপনি সহজেই অ্যাপ্লিকেশন স্কেল করতে পারেন। একাধিক নোড যোগ করে আপনি আপনার সিস্টেমকে স্কেল করতে পারবেন।
- Fault Tolerance: Akka Cluster অটোমেটিকালি ব্যর্থ নোডকে চিনতে পারে এবং সিস্টেম পুনরুদ্ধার করতে পারে।
- High Availability: Akka Remote এবং Cluster ব্যবহার করে আপনার অ্যাপ্লিকেশন সর্বদা উপলব্ধ থাকবে, কারণ অ্যাক্টররা বিভিন্ন নোডের মধ্যে যোগাযোগ করতে সক্ষম।
- Distributable Actors: আপনি আপনার অ্যাক্টরগুলোকে বিভিন্ন সিস্টেমে বিতরণ করতে পারবেন, যা আপনাকে বড় সিস্টেম ডিজাইন করতে সাহায্য করবে।
সারাংশ
- Akka Cluster হল একটি ডিসট্রিবিউটেড সিস্টেম তৈরি করার জন্য ব্যবহৃত শক্তিশালী ফিচার যা একাধিক নোডের মধ্যে অ্যাক্টরদের মধ্যে যোগাযোগ করতে সক্ষম।
- Akka Remote আপনাকে আপনার অ্যাক্টর সিস্টেমকে বিভিন্ন সিস্টেম বা নোডে রান করতে সক্ষম করে এবং তাদের মধ্যে যোগাযোগ স্থাপন করতে সাহায্য করে।
- Akka এর মাধ্যমে আপনি কনকারেন্ট, ডিসট্রিবিউটেড, এবং স্কেলেবল সিস্টেম তৈরি করতে পারেন যা অত্যন্ত কার্যকর এবং উচ্চ পারফরম্যান্স প্রদান করে।
Akka Cluster এবং Remote ব্যবহারের মাধ্যমে আপনি একটি সিস্টেমের বিভিন্ন অংশে একাধিক অ্যাক্টর সিস্টেমকে সিঙ্ক্রোনাইজ করতে সক্ষম হবেন, যা বড় এবং স্কেলেবল অ্যাপ্লিকেশন তৈরি করতে সাহায্য করে।