Supervisor এবং Supervision Tree এর ধারণা
Supervisor এবং Supervision Tree Erlang এর অন্যতম গুরুত্বপূর্ণ এবং শক্তিশালী বৈশিষ্ট্য যা fault-tolerant সিস্টেম তৈরি করার জন্য ব্যবহৃত হয়। Erlang এর OTP ফ্রেমওয়ার্কে Supervisor মডিউলটি অন্য প্রসেসের কার্যক্রম মনিটর করে এবং যদি কোনো প্রসেস ব্যর্থ হয়, তবে তা পুনরায় শুরু করতে সহায়তা করে। Supervision Tree হলো এই সুপারভাইজার এবং তার অধীনস্থ প্রসেসগুলির একটি কাঠামো বা গঠন যা সিস্টেমের ত্রুটির প্রতি প্রতিক্রিয়া জানিয়ে সিস্টেমের স্থায়িত্ব বজায় রাখে।
1. Supervisor (সুপারভাইজার)
Supervisor হলো একটি বিশেষ ধরনের Erlang প্রসেস যা অন্য প্রসেসগুলির কার্যক্রম তদারকি করে। যখন একটি প্রসেস ব্যর্থ হয়, তখন সুপারভাইজার সেই প্রসেসটিকে পুনরায় চালু করার চেষ্টা করে। সুপারভাইজার নিজে কোনো কার্যকরী কাজ করে না, বরং তার অধীনে চলমান "worker" প্রসেসগুলির সঠিক কার্যকারিতা নিশ্চিত করে।
সুপারভাইজারের কাজ:
- Monitoring: সুপারভাইজার তার অধীনে চলমান প্রসেসগুলোকে মনিটর করে।
- Restarting: যদি কোনো প্রসেস ব্যর্থ হয়, তবে সে ওই প্রসেসটিকে পুনরায় চালু করে।
- Error Handling: সুপারভাইজার ব্যর্থ প্রসেসের সাথে সম্পর্কিত কার্যক্রম নির্ধারণ করে, যেমন restart, shutdown, অথবা ignore।
সুপারভাইজারের প্রধান বৈশিষ্ট্য:
- সুপারভাইজার শুধুমাত্র একটি supervision strategy অনুসরণ করে। এই স্ট্র্যাটেজি অনুযায়ী, ব্যর্থ প্রসেসটি কি ভাবে পুনরায় শুরু হবে, তা নির্ধারণ করা হয়।
- সুপারভাইজার কয়েকটি worker প্রসেসের জন্য দায়িত্বপ্রাপ্ত।
সুপারভাইজার স্ট্র্যাটেজি:
সুপারভাইজার একাধিক restart strategy অনুসরণ করতে পারে:
- one_for_one: যদি একটি প্রসেস ব্যর্থ হয়, শুধুমাত্র সেই প্রসেসটি পুনরায় শুরু হবে।
- one_for_all: যদি একটি প্রসেস ব্যর্থ হয়, তবে সমস্ত প্রসেস পুনরায় শুরু হবে।
- rest_for_one: যদি একটি প্রসেস ব্যর্থ হয়, তবে সেই প্রসেস এবং তার পরবর্তী প্রসেসগুলো পুনরায় শুরু হবে।
- simple_one_for_one: এটি একক ধরনের প্রসেসের জন্য ব্যবহৃত হয়, যেখানে শুধুমাত্র এক ধরনের কর্মী (worker) প্রসেস থাকে।
2. Supervision Tree (সুপারভিশন ট্রি)
Supervision Tree হলো Erlang সিস্টেমের একটি কাঠামো যেখানে সুপারভাইজাররা একটি হায়ারার্কিতে (hierarchy) সংগঠিত থাকে এবং তারা বিভিন্ন worker প্রসেসগুলির তদারকি করে। এটি একটি ডিপেনডেন্সি হায়ারার্কি তৈরি করে, যেখানে প্রত্যেক সুপারভাইজারের অধীনে কর্মী প্রসেস থাকতে পারে এবং তারা তাদের ওপর নির্ভরশীল সুপারভাইজারকে তদারকি করে।
Supervision Tree এর মূল উদ্দেশ্য হলো সিস্টেমের ফাটল বা ত্রুটি হলে, প্রভাবিত অংশগুলির দ্রুত পুনরুদ্ধার করা এবং সিস্টেমের কার্যকারিতা বজায় রাখা।
Supervision Tree এর গঠন:
- Root Supervisor: এটি মূল সুপারভাইজার, যা সিস্টেমের শীর্ষ স্তরে অবস্থান করে এবং অন্য সুপারভাইজারদের তদারকি করে।
- Supervisor: প্রতিটি সুপারভাইজার একটি নির্দিষ্ট অংশের কার্যক্রম তদারকি করে এবং তার অধীনে worker প্রসেস থাকে।
- Worker Processes: কর্মী প্রসেসগুলি আসলে সিস্টেমের বাস্তব কার্যক্রম সম্পাদন করে এবং সুপারভাইজারের অধীনে থাকে।
উদাহরণ:
ধরা যাক, একটি সিস্টেমে দুটি সুপারভাইজার রয়েছে:
- একটি সুপারভাইজার
Aকর্মী প্রসেসA1,A2তদারকি করছে। - আরেকটি সুপারভাইজার
Bকর্মী প্রসেসB1,B2তদারকি করছে।
এটি একটি সাধারণ supervision tree হতে পারে যেখানে একটি মূল সুপারভাইজার বা রুট সুপারভাইজার রয়েছে যা সব কিছু তদারকি করছে।
3. সুপারভাইজার ব্যবহার করার উদাহরণ
এখানে একটি সুপারভাইজার এবং একটি কর্মী প্রসেসের উদাহরণ দেওয়া হলো:
কর্মী প্রসেস:
% worker.erl
-module(worker).
-export([start_link/0, do_work/0]).
start_link() ->
spawn_link(fun do_work/0).
do_work() ->
io:format("Working...~n"),
timer:sleep(1000),
io:format("Done!~n").এখানে, worker মডিউলটি একটি সহজ কাজ করে, যা কিছু সময় ধরে কাজ করার পর "Done!" মেসেজ প্রিন্ট করে।
সুপারভাইজার:
% supervisor.erl
-module(supervisor).
-behaviour(supervisor).
-export([start_link/0, init/1]).
start_link() -> supervisor:start_link({local, supervisor}, ?MODULE, []).
init([]) ->
{ok, {{one_for_one, 5, 10},
[{worker, {worker, start_link, []}, permanent, 5000, worker, [worker]}]}}.এখানে, supervisor মডিউলটি একটি সুপারভাইজার তৈরি করছে যা worker প্রসেসকে তদারকি করে। সুপারভাইজারের restart strategy হল one_for_one, যার মানে হচ্ছে, যদি কোন worker প্রসেস ব্যর্থ হয়, শুধুমাত্র সেই প্রসেস পুনরায় চালু হবে।
সুপারভাইজার এবং কর্মী প্রসেস চালু করা:
1> c(worker).
{ok,worker}
2> c(supervisor).
{ok,supervisor}
3> supervisor:start_link().
{ok, <0.50.0>}এখানে, সুপারভাইজারটি সফলভাবে শুরু হয়েছে এবং কর্মী প্রসেসটি নিয়ন্ত্রণ করা হচ্ছে।
উপসংহার
Supervisor এবং Supervision Tree Erlang সিস্টেমে fault-tolerance নিশ্চিত করার জন্য অত্যন্ত গুরুত্বপূর্ণ উপাদান। সুপারভাইজার প্রসেস ব্যর্থ হলে তাকে পুনরায় চালু করে সিস্টেমের স্থায়িত্ব বজায় রাখে, এবং Supervision Tree একাধিক সুপারভাইজার ও কর্মী প্রসেসের মধ্যে নির্ভরতা তৈরি করে, যা সিস্টেমের কার্যক্ষমতা এবং স্কেলেবিলিটি বাড়াতে সাহায্য করে। Erlang এর OTP framework এর মাধ্যমে এই সুপারভাইজার প্যাটার্নটি সহজে বাস্তবায়ন করা যায় এবং সিস্টেমের স্থায়িত্ব এবং নির্ভরযোগ্যতা নিশ্চিত করা যায়।
Read more