পারম্পরিক লোড ব্যালেন্সিং এনভায়রনমেন্টে সেশন
সাধারণত, আমরা সব ওয়েব অ্যাপ্লিকেশনে ইন-মেমরি সেশন (র্যামে ডেটা স্টোর) ব্যবহার করি। এটি বেশির ভাগ পারম্পরিক হোস্টিং এনভায়রনমেন্টে ভালো কাজ করে যেখানে আমরা একটি ডেডিকেটেড ভিএম বা শেয়ার্ড হোস্টিং প্ল্যানে অ্যাপ্লিকেশন হোস্ট করি।
তবে, যখন ট্রাফিক বেড়ে, আমরা একাধিক ওয়েব সার্ভার তৈরি করে এবং লোড ব্যালেন্সার দিয়ে ট্রাফিক কন্ট্রোল করে লোড ব্যালেন্সিংর পরিকল্পনা করি। এই পরিস্থিতিতে, সেশন কাজ করে না কারণ রিকোয়েস্টগুলো (যেগুলো একটি সিঙ্গেল সেশনের সাথে সম্পর্কিত) একাধিক সার্ভার দ্বারা সার্ভ করা হবে (একই সার্ভার একটি সিঙ্গেল সেশনের রিকোয়েস্ট সার্ভ করলেও, তা সাজেস্ট করা হয় না)। সমাধান হলো সেশনগুলো একটি SQL সার্ভারে স্টোর করা যা লোড ব্যালেন্সিং এনভায়রনমেন্টের সব ওয়েব সার্ভার থেকে অ্যাকসেসযোগ্য।
অ্যাঝার অটো-স্কেল এনভায়রনমেন্টে সেশন
তাত্ত্বিক আলোচনা না করে, সেশন কীভাবে অ্যাঝারে কাজ করে সেটি বুঝতে একটি ছোট প্রোগ্রাম ডেভেলপ করি যা সেশন ব্যবহার করে।
নিচের ওয়েব পেজগুলো সহ একটি ওয়েবসাইট তৈরি করি (আপনি MVC অ্যাপ্লিকেশনও তৈরি করতে পারেন) এবং আমার একটি পূর্বের আর্টিকেলে দেখানো মতো ডিপ্লয় করি:
- Azure App Service - Configure Existing Application From Visual Studio
Login.aspx
এই পেজটি ইউজারনেম এবং পাসওয়ার্ড গ্রহণ করে। "Login" বাটনে ক্লিক করলে, একটি সেশন তৈরি করে লগইন করা ইউজারনেমের ভ্যালু সেশনে স্টোর করে এবং ইউজারকে "Default.aspx"-এ রিডাইরেক্ট করে।
দ্রষ্টব্য: পেজটি ওয়েবসাইট হোস্ট করা ভার্চুয়াল মেশিনের IP ঠিকানা "10.202.116.91" প্রদর্শন করে।
Default.aspx
এই পেজটি সেশনে থাকা ভ্যালুর উপর ভিত্তি করে নিচের মেসেজগুলো প্রদর্শন করে।
যদি সেশনে কোনো ভ্যালু থাকে, তবে নিচের স্ক্রিন ক্যাপচারের মত "Logged in user as admin. You are in 10.202.116.91" দেখাবে।
যদি সেশনে কোনো ভ্যালু না থাকে, তবে নিচের স্ক্রিন ক্যাপচারের মত "Session is NULL. You are in 10.202.116.91" দেখাবে।
লক্ষ্য করুন Login.aspx এবং Default.aspx-এ সার্ভারের IP ঠিকানা একই। সকল রিকোয়েস্ট একই সার্ভারে রিডাইরেক্ট হচ্ছে।
নিচের স্ক্রিন ক্যাপচারের মতে, সেশনগুলো "ASP.NET_SessionID" নামক একটি কুকি দিয়ে মেইন্টেইন হচ্ছে। এটি অধিকাংশের কাছে পরিচিত হওয়া উচিত।

ধরি আমাদের ওয়েবসাইটের ট্রাফিক বেড়েছে এবং আমরা ইন্সট্যান্স কাউন্ট دوগুণ করতে চাই। এগিয়ে যাই এবং ইন্সট্যান্স কাউন্ট দুটি করি।
নোট: দ্রষ্টব্য, ফ্রি এবং শেয়ার্ড টিয়ারে ইন্সট্যান্স কাউন্ট বাড়ানো যাবে না। আপনার অ্যাপ সার্ভিস "Basic", "Standard" বা "Premium" টিয়ারে থাকতে হবে।

আবার লগইন পেজ অ্যাক্সেস করি এবং একাধিকবার রিফ্রেশ করি। পেজ কতবারই রিফ্রেশ করলে IP ঠিকানা পরিবর্তন হবে না।
আপনি লক্ষ্য করবেন একই ওয়েব সার্ভার পেজগুলো সার্ভ করছে। যদিও আমরা দুটি ইন্সট্যান্সে স্কেলিং এনাবল করেছি, অ্যাপ সার্ভিস এখনও একই সার্ভার থেকে রিকোয়েস্ট সার্ভ করছে।
এটি বাস্তব পরিস্থিতিতে একটি সমস্যা হতে পারে কারণ লোড ব্যালেন্সিং এনাবল থাকা সত্ত্বেও একই সার্ভার রিকোয়েস্ট সার্ভ করছে এবং অন্যান্য সার্ভারগুলো সঠিকভাবে ইউটিলাইজ হচ্ছে না।
কারণ হলো ARR কুকি, নিচে দেখানো হলো। আরও তথ্যের জন্য এখানে দেখুন।

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

উপরের স্ক্রিন ক্যাপচারে "ARR Affinity" অফ করুন এবং "Save" বাটনে ক্লিক করুন। অ্যাপ সার্ভিস রিস্টার্ট করুন যাতে সব সেশন ক্লিয়ার হয়।
এখন থেকে একটু সতর্ক থাকুন। পরবর্তী কয়েক প্যারাগ্রাফ কিছুটা বিভ্রান্তিকর।
গুরুত্বপূর্ণ
ARR Affinity অফ করলে ARRAffinity কুকি তৈরি হওয়া প্রসেস ডিজেবল হয়ে যাবে। তাই, কুকি ডিজেবল থাকলে, রিকোয়েস্টগুলো যেকোনো উপলব্ধ সার্ভারে যেতে পারে। তাই সেশন সঠিকভাবে মেইন্টেইন হবে इसकी কোনো গ্যারান্টি নেই। সেশন শুধু তখন কাজ করবে যখন রিকোয়েস্টগুলো একই সার্ভার থেকে সার্ভ হচ্ছে। যদি কোনো রিকোয়েস্ট সেশন যেখানে স্টোর করা আছে সেটি ব্যতীত অন্য সার্ভার দ্বারা সার্ভ হয়, তবে সেশন NULL হবে।
এখন ওয়েব অ্যাপে ফিরে লগইন পেজে যান এবং নতুন IP ঠিকানা "10.202.174.84" লক্ষ্য করুন। (আপনার কেসে, আপনি প্রথমে আগের IP ঠিকানাটি দেখতে পারেন। পেজ রিফ্রেশ করলে IP পরিবর্তন হবে। আমার কেসে, আমি দুবার রিফ্রেশ করলাম নতুন IP পেতে)।

"Login" বাটনে ক্লিক করলে ফর্মটি 10.202.174.84-এ পোস্ট হবে তা গ্যারান্টি নেই। এটি অন্য সার্ভারে পোস্ট হতে পারে যা আমার কেসে "10.202.116.91"।
আমার কেসে, উপরের স্ক্রিন ক্যাপচারের "Login" বাটনে ক্লিক করলে আমাকে নিচের ভ্যালু সহ Default পেজে নিয়ে গেল।

- IP Address is 10.202.174.84 (এটি লগইন পেজের মত)।
- Session is NULL। কারণ, লগইন ক্লিক করলে রিকোয়েস্ট অন্য ইনস্ট্যান্সে ("10.202.116.91") চলে গিয়েছিল যেখানে আমার সেশন স্টোর হয়েছিল।
- পেজ দু-একবার রিফ্রেশ করুন।
নিম্নলিখিত বিষয়গুলো লক্ষ্য করুন।
- সেশনে কিছু ভ্যালু "admin" আছে।
- IP Address is 10.202.116.91।
এখান থেকে নিষ্কর্ষ: "সেশন" অ্যাঝার অ্যাপ সার্ভিসে আশা অনুযায়ী কাজ করবে না যখন আপনি অটো-স্কেলিং ফিচার ব্যবহার করে লোড ব্যালেন্সার কনফিগার করেন।
এখানে রক্ষাকর্তা আসে: রেডিস ক্যাশ প্রোভাইডার। নিচে অ্যাঝার অফিশিয়াল ওয়েবসাইট থেকে ডেফিনেশন দেওয়া হলো।
অ্যাঝার রেডিস ক্যাশ পপুলার ওপেন-সোর্স রেডিস ক্যাশের উপর ভিত্তি করে তৈরি। এটি আপনাকে একটি সিকিউর, ডেডিকেটেড রেডিস ক্যাশে অ্যাক্সেস দেয়, যা মাইক্রোসফট দ্বারা ম্যানেজড এবং অ্যাঝারের যেকোনো অ্যাপ্লিকেশন থেকে অ্যাকসেসযোগ্য।
নিচে সেশন সঠিকভাবে কাজ করানোর জন্য প্রয়োজনীয় ধাপগুলো দেওয়া হলো।
- অ্যাঝার ম্যানেজমেন্ট পোর্টাল থেকে রেডিস ক্যাশ তৈরি করুন।
- অ্যাপ্লিকেশন কনফিগার করুন অ্যাঝার রেডিস ক্যাশ ব্যবহার করার জন্য।
- সেশন ব্যবহার করুন।
অ্যাঝার ম্যানেজমেন্ট পোর্টাল থেকে রেডিস ক্যাশ তৈরি করুন।
নিচে দেখানো মতো অ্যাঝার ম্যানেজমেন্ট পোর্টাল ব্যবহার করে রেডিস ক্যাশ তৈরি করা শুরু করি।
নিচে দেখানো মতো রেডিস ক্যাশের ডিটেইলস দিন।
উপরের স্ক্রিন ক্যাপচারের "Create" বাটনে ক্লিক করুন। রেডিস ক্যাশ তৈরি হতে কয়েক মিনিট লাগবে।
অ্যাপ্লিকেশন কনফিগার করুন অ্যাঝার রেডিস ক্যাশ ব্যবহার করার জন্য
আমরা যা 만들었다 সেটি ব্যবহার করতে অ্যাপ্লিকেশন কনফিগার করি।
উপরের স্ক্রিন ক্যাপচারে দেখানো মতো, প্যাকেজ ম্যানেজার কনসোলে যান এবং কমান্ড "Install-Package StackExchange.Redis" টাইপ করুন এবং "Enter" চাপুন।
এখন আমরা সফলভাবে প্রয়োজনীয় প্যাকেজগুলো ইনস্টল করেছি। (দ্রষ্টব্য: আপনার .NET ফ্রেমওয়ার্ক ৪ বা উচ্চতর হওয়া উচিত।)
অ্যাসেম্বলিগুলো ব্যবহার করতে, আমাদের প্রথমে Login.aspx এবং Default.aspx পেজ দুটোতে নিচের নেমস্পেস যোগ করতে হবে।
Using StackExchange.Redis;
প্রজেক্টে "RedisConnection" নামে একটি নতুন ক্লাস যোগ করুন। আটैচড প্রজেক্ট রেফার করুন।
রেডিস ক্যাশের সাথে কানেক্ট করতে, নিচের ইনফো `ConnectionMultiplexer.Connect` ফাংশনে পাস করতে হবে। পোর্টাল থেকে সেগুলো নিই।

- রেডিস ক্যাশ URL।
- কীগুলো।
কোডে কীগুলো সংরক্ষণ করবেন না। সহজ রাখতে আমি কীগুলো সোর্স কোডে রাখছি। কীভাবে ক্রেডেনশিয়াল সিকিউরভাবে রাখবেন সেটি জানতে এই পেজটি দেখুন।
এখন আমাদের রেডিস ক্যাশের সাথে কানেক্ট করতে 사용할 ক্লাসটি রেডি। এটা ব্যবহার করে রেডিস ক্যাশে সেশন তৈরি করি।
Login.aspx.cs ফাইল খুলুন এবং নিচের লাইনটি রিপ্লেস করুন।
Session["login"] = this.txtUsername.Text.Trim();
এটির সাথে।
IDatabase cache = RedisConnection.Connection.GetDatabase(); cache.StringSet("login", this.txtUsername.Text.Trim());
Default.aspx.cs খুলুন এবং নিচের লাইনটি রিপ্লেস করুন।
protected void Page_Load(object sender, EventArgs e) { if (Session["login"] == null) { Response.Write("Session is NULL. You are in " + Request.ServerVariables["LOCAL_ADDR"]); } else { Response.Write("Logged in user is " + Session["login"] + ". You are in " + Request.ServerVariables["LOCAL_ADDR"]); } }
এটির সাথে।
protected void Page_Load(object sender, EventArgs e) { IDatabase cache = RedisConnection.Connection.GetDatabase(); string strLoginValue = cache.StringGet("login"); if (strLoginValue == null) { Response.Write("Session is NULL. You are in " + Request.ServerVariables["LOCAL_ADDR"]); } else { Response.Write("Logged in user is " + strLoginValue + ". You are in " + Request.ServerVariables["LOCAL_ADDR"]); } }
কোডটি অ্যাঝার অ্যাপ সার্ভিসে ডিপ্লয় করুন এবং পরিবর্তনগুলো রিভিউ করুন এবং লগইন পেজে নেভিগেট করুন।
IP ঠিকানা লক্ষ্য করুন। এটি 10.202.174.84। এখন "Login" বাটনে ক্লিক করুন। আপনাকে Default.aspx পেজে নিয়ে যাওয়া হবে নিচের মত।
উপরের স্ক্রিন ক্যাপচারে লক্ষ্য করুন, যদিও IP ঠিকানা আলাদা, তবুও আমরা ইউজারনেম "admin" দেখতে পাচ্ছি কারণ সেশনগুলো এখন একটি ডিস্ট্রিবিউটেড লোকেশন "রেডিস ক্যাশ"-এ স্টোর হচ্ছে যা দুটি ইনস্ট্যান্সের জন্য অ্যাকসেসযোগ্য।
এখন পেজটি একাধিকবার রিফ্রেশ করুন। আপনি লক্ষ্য করবেন IP ঠিকানাগুলো পরিবর্তন হচ্ছে কিন্তু ইউজারনেমের ভ্যালু পরিবর্তন হচ্ছে না।
এতটুকু। আমরা শিখেছি লোড ব্যালেন্সিং এনভায়রনমেন্টে সেশন কীভাবে স্টোর করবেন। আপনি রেডিস ক্যাশে যেকোনো ধরনের ডেটা স্টোর করতে পারেন।
আর্টিকেলটি পড়তে ভালো লাগলো আশা করি। আপনার ফিডব্যাক আমাদের জন্য মূল্যবান।