GenServer, Supervisor, এবং Application in Elixir
Elixir তে GenServer, Supervisor, এবং Application হল তিনটি গুরুত্বপূর্ণ কনসেপ্ট যা concurrency, fault-tolerance, এবং system design এর ক্ষেত্রে গুরুত্বপূর্ণ ভূমিকা পালন করে। এগুলি Elixir এর OTP (Open Telecom Platform) ফ্রেমওয়ার্কের অংশ, যা একটি শক্তিশালী concurrency এবং process management মডেল সরবরাহ করে।
চলুন, এই তিনটি কনসেপ্ট বিস্তারিতভাবে দেখি।
1. GenServer
GenServer হল Elixir তে একটি generic server যা stateful process পরিচালনা করতে ব্যবহৃত হয়। এটি GenServer মডিউল ব্যবহার করে তৈরি করা হয় এবং এটি প্রক্রিয়াগুলির মধ্যে state management, message passing, এবং async tasks পরিচালনার জন্য অত্যন্ত উপযোগী।
GenServer এর মৌলিক ধারণা
- Stateful Process: GenServer একটি প্রক্রিয়া তৈরি করে যেটি তার নিজের একটি স্টেট ধরে রাখে।
- Message Handling: GenServer প্রক্রিয়া message passing এর মাধ্যমে কমিউনিকেট করে।
- Callbacks: GenServer সাধারণত কিছু callback ফাংশন (যেমন
init,handle_call,handle_cast,handle_info) ব্যবহার করে কাজ করে।
GenServer এর মৌলিক ফাংশনসমূহ
init/1: শুরুতে স্টেট ইনিশিয়ালাইজ করার জন্য ব্যবহার করা হয়।handle_call/3: সিঙ্ক্রোনাস মেসেজ (request-response) হ্যান্ডল করার জন্য।handle_cast/2: অ্যাসিনক্রোনাস মেসেজ হ্যান্ডল করার জন্য।handle_info/2: অন্য যেকোনো মেসেজ হ্যান্ডল করার জন্য।
GenServer উদাহরণ:
defmodule MyGenServer do
use GenServer
# Starting the GenServer
def start_link(initial_state) do
GenServer.start_link(__MODULE__, initial_state, name: __MODULE__)
end
# Initialization callback
def init(initial_state) do
{:ok, initial_state}
end
# Handle synchronous call
def handle_call(:get_state, _from, state) do
{:reply, state, state}
end
# Handle asynchronous cast
def handle_cast(:increment, state) do
{:noreply, state + 1}
end
end
# Starting and interacting with the GenServer
{:ok, pid} = MyGenServer.start_link(0)
GenServer.call(pid, :get_state) # Get the current state
GenServer.cast(pid, :increment) # Increment the stateএখানে, MyGenServer একটি স্টেটফুল প্রক্রিয়া তৈরি করে যা স্টেটের মান 0 দিয়ে শুরু হয়। handle_call ব্যবহার করে সিঙ্ক্রোনাস কল করা হচ্ছে এবং handle_cast দিয়ে অ্যাসিনক্রোনাস মেসেজ পাঠানো হচ্ছে।
2. Supervisor
Supervisor হল Elixir এর একটি বিশেষ ধরনের প্রক্রিয়া যা অন্য প্রক্রিয়াগুলির (যেমন GenServer) ত্রুটি ব্যবস্থাপনা করে। একটি সুপারভাইজার একটি বা একাধিক প্রক্রিয়া পর্যবেক্ষণ করে এবং যদি কোন প্রক্রিয়া ক্র্যাশ করে, তাহলে তা পুনরায় শুরু করে। এটি fault tolerance নিশ্চিত করতে সাহায্য করে, যার মাধ্যমে সিস্টেমের একাধিক অংশ ব্যর্থ হলেও পুরো সিস্টেম চালু থাকে।
Supervisor এর মৌলিক ধারণা
- Fault-tolerance: সুপারভাইজার নিশ্চিত করে যে একটি প্রক্রিয়া ব্যর্থ হলে তা পুনরায় শুরু হবে।
- Restart strategies: সুপারভাইজার বিভিন্ন স্ট্রাটেজি অনুসরণ করতে পারে যেমন
:one_for_one,:one_for_all,:rest_for_oneইত্যাদি। - Child Process Management: সুপারভাইজার তার অধীনে থাকা প্রক্রিয়াগুলিকে পরিচালনা এবং পুনরায় শুরু করার জন্য কাজ করে।
Supervisor উদাহরণ:
defmodule MySupervisor do
use Supervisor
def start_link do
Supervisor.start_link(__MODULE__, :ok, name: __MODULE__)
end
def init(:ok) do
children = [
%{
id: MyGenServer,
start: {MyGenServer, :start_link, [0]},
restart: :permanent,
type: :worker
}
]
Supervisor.init(children, strategy: :one_for_one)
end
endএখানে, MySupervisor একটি সুপারভাইজার যা MyGenServer প্রক্রিয়াটিকে মনিটর করবে এবং যদি MyGenServer ক্র্যাশ করে তবে এটি পুনরায় শুরু করবে। :one_for_one স্ট্রাটেজি ব্যবহৃত হয়েছে, যার মানে হল যে যদি একটি প্রক্রিয়া ব্যর্থ হয়, শুধুমাত্র সেই প্রক্রিয়াটি পুনরায় শুরু হবে।
3. Application
Elixir তে Application একটি ইউনিট যা একাধিক মডিউল এবং প্রক্রিয়া নিয়ে তৈরি হয়। এটি একটি কোডের কাঠামো যা আপনার Elixir প্রোগ্রাম চালানোর জন্য প্রয়োজনীয় সেটআপ এবং কনফিগারেশন প্রদান করে। Application মডিউলটি আপনার কোডের শুরুতে এবং শেষের সময়কার কার্যক্রম নির্ধারণ করে।
Application এর মৌলিক ধারণা
- Application lifecycle: Application মডিউলটি অ্যাপ্লিকেশন স্টার্টআপ, শutdown, এবং কনফিগারেশন ব্যবস্থাপনা নিয়ে কাজ করে।
- Supervision Tree: Applications সাধারণত সুপারভাইজারদের মধ্যে একটি হায়ারার্কি (supervision tree) তৈরি করে।
- Start/Stop functions:
start/2এবংstop/1ফাংশনগুলি অ্যাপ্লিকেশন স্টার্ট এবং শাটডাউন করতে ব্যবহৃত হয়।
Application উদাহরণ:
defmodule MyApp.Application do
use Application
def start(_type, _args) do
children = [
{MyGenServer, 0}, # MyGenServer কে অ্যাপ্লিকেশনে যুক্ত করা হচ্ছে
MySupervisor # সুপারভাইজার যুক্ত করা হচ্ছে
]
Supervisor.start_link(children, strategy: :one_for_all)
end
endএখানে, MyApp.Application একটি অ্যাপ্লিকেশন হিসেবে কাজ করে যা MyGenServer এবং MySupervisor কে তার children হিসাবে শুরু করে।
Application Configurations
Elixir অ্যাপ্লিকেশনগুলির কনফিগারেশন সাধারণত config/config.exs ফাইলে রাখা হয়, যেখানে আপনি ডাটাবেস সেটআপ, API কী, অন্যান্য ডিপেনডেন্সি কনফিগারেশন রাখতে পারেন।
use Mix.Config
config :my_app, :some_setting, "some_value"GenServer, Supervisor, এবং Application এর সম্পর্ক
- GenServer: স্টেটফুল প্রক্রিয়া তৈরি করে এবং তার মধ্যে লজিকাল অপারেশন করে। GenServer ব্যবহার করে আপনি সিঙ্ক্রোনাস এবং অ্যাসিনক্রোনাস কাজ করতে পারেন।
- Supervisor: GenServer বা অন্যান্য প্রক্রিয়া পর্যবেক্ষণ করে এবং কোন প্রক্রিয়া ক্র্যাশ করলে তা পুনরায় শুরু করে। এটি fault tolerance নিশ্চিত করে।
- Application: একাধিক GenServer এবং Supervisor গুলো একত্রে কাজ করতে সাহায্য করে। Application ব্যবস্থাপনা এবং lifecycle পরিচালনা করে।
এগুলি Elixir এর OTP (Open Telecom Platform) এর মৌলিক উপাদান, যা আপনার প্রোগ্রামকে সহজে concurrent এবং fault-tolerant সিস্টেমে পরিণত করতে সহায়তা করে।
Read more