কম্পিউটার টিউটোরিয়াল

Redis ডিস্ট্রিবিউটেড লক্স মাস্টারিং: প্রুভেন প্যাটার্ন, কমন পিটফল এবং প্র্যাক্টিক্যাল অ্যাপ্লিকেশন

Redis ডিস্ট্রিবিউটেড লক্স মাস্টারিং: প্রুভেন প্যাটার্ন, কমন পিটফল এবং প্র্যাক্টিক্যাল অ্যাপ্লিকেশন

ভূমিকা

ডিস্ট্রিবিউটেড লকস শুনতে সিম্পল লাগে যতক্ষণ আপনি প্রোডাকশনে সেগুলোতে ডিপেন্ড করেন।

একটি প্রসেসকে একটি রিসোর্সের এক্সক্লूसিভ অ্যাক্সেস দরকার। একাধিক সার্ভার রান করছে। Redis মাঝপথে বসে আছে। আইডিয়া শুনতে সহজ লাগে: Redis-এ একটি লক রাখুন এবং এগিয়ে যান।

একসময়ের জন্য এই পদ্ধতি কাজ করে বলে মনে হয়। তারপর একটি প্রসেস ক্র্যাশ করে, একটি নেটওয়ার্ক ডिले হয়, বা লেটেন্সি স্পাইক করে। হঠাৎ, দুটি প্রসেস একই লক দাবি করে, কোনো প্রসেস সেটি ওন করে না, বা লক কখনো রিলিজ হয় না।

আমার অধিকাংশ Redis লকিং ইস্যু Redis-এর দোষ নয়। এগুলো ঘটে কারণ ডিস্ট্রিবিউটেড লকস প্রায়শই মিসঅন্ডারস্টুড। Redis কোঅর্ডিনেশনের জন্য একটি টুল দেয়, পেরফেক্ট এক্সক্লूसিভিটির গ্যারান্টি দেয় না।

একটি ডিস্ট্রিবিউটেড লক আসলে কী

একটি ডিস্ট্রিবিউটেড লক ইন-মেমরি মিউটেক্সের মত নয়। এটি অ্যাবসোলিউট গ্যারান্টি দেয় না, এবং ফেইলিউর’éliminate করতে পারে না।

ডিস্ট্রিবিউটেড লকগুলো হলো কোঅর্ডিনেশন মেকানিজম যা অনরিলায়েবল এনভায়রনমেন্টে অপারেট করে। নেটওয়ার্ক ফেইল করে, প্রসেস ক্র্যাশ করে, এবং ক্লক ড্রিফট করে। যে কোনো লকিং স্ট্র্যাটেজি যা পারফেক্ট বিহেভিয়র অনুমান করে সেটি অবশেষে ভাঙবে।

Redis লকগুলো হলো বেস্ট-এফোর্ট লক। সঠিকভাবে ডিজাইন করা হলে, এগুলো এক্সট্রিমলি ইফেক্টিভ। कैজুয়ালি ইমপ্লিমেন্ট করা হলে, এগুলো সাবটেল রেস কন্ডিশন এবং ডেটা করপশন আনে।

Redis লক সফলভাবে ব্যবহার করার প্রথম ধাপ হলো এক্সপেক্টেশন অ্যাডজাস্ট করা।

Redis লক কখন মিনিংফুল

Redis ডিস্ট্রিবিউটেড লকগুলো উপযুক্ত যখন:

  • আপনাকে একটি ক্রিটিক্যাল সেকশনের কনকারেন্ট এক্সিকিউশন প্রতিবন্ধক করতে হয়

  • কাজ একাধিক সার্ভার জুড়ে কোঅর্ডিনেট করতে হয়

  • অপারেশন শর্ট-লিভড

  • রিট্রাইস এক্সেপটেবল

সাধারণ ইউজ কেস شامل: জব ডিডুপ্লিকেশন, শিডিউল্ড টাস্ক কোঅর্ডিনেশন, ক্যাশ রিবিল্ড, এবং ডাবল প্রসেসিং প্রতিবন্ধকতা।

Redis লক লং-রানিং বিজনেস ট্রানজ্যাকশন, ইউজার-ফেসিং ক্রিটিক্যাল ওয়ার্কফ্লো, বা যেসব অপারেশন সফলি রিট্রাই করা যাবে না সেসবके জন্য খারাপ ফিট। যদি রিট্রাই এক্সেপটেবল না হয়, Redis লক ভুল টুল।

Redis-এ একমাত্র সেফ লকিং প্রিমিটিভ

সबচেয়ে সেফ Redis লকিং প্রিমিটিভ হলো একটি সিঙ্গেল অ্যাটমিক কমান্ড:

SET key value NX EX ttl

এই কমান্ড একটি লক তৈরি করে শুধু তখনই যখন এটি ইতিমধ্যে এক্সিস্ট না করে, একটি ইউনিক ওনার ভ্যালু অ্যাসাইন করে, এবং একটি TTL সেট করে যাতে লকটি অটোমেটিক্যালি এক্সপায়ার হয়।

যেকোনো অল্টারনেটিভ পদ্ধতি রেস কন্ডিশন আনে। TTL ছাড়া SETNX ব্যবহার করা বা এক্সপায়ারেশন আলাদা স্টেপে সেট করা ফেইলিউর আন্ডারে ভাঙে। TTL ম্যানডেটরি এবং সিস্টেমকে প্রোটেক্ট করে যখন একটি প্রসেস আনপেক্টেডলি ক্র্যাশ করে।

কেন লক TTL ম্যানডেটরি

TTL ছাড়া, একটি Redis লক চিরকাল লিভ করতে পারে। যদি একটি প্রসেস লক ধরে 크্যাশ করে, সিস্টেম সাইলেন্টলি স্টল করে।

TTL লকগুলাকে সেলফ-হিলিং বানায়। যখন একটি ফেইলিউর হয়, লক অবশেষে এক্সপায়ার হয় এবং প্রগ্রেস রিজিউম হতে দেয়। এটি সংক্ষিপ্ত ওভারল্যাপ তৈরি করতে পারে, কিন্তু সেই ট্রেডঅফ ইণ্টেনশনাল।

যে লকগুলো কখনো এক্সপায়ার হয় না সেগুলো নো লক থেকেও বেশি ডেঞ্জারাস।

লক ওনারশিপ এবং সেফ রিলিজ

একটি Redis লক শুধু সেই প্রসেস দ্বারা রিলিজ করা উচিত যেটি এটিকে আকোয়ার করেছিল। এটাই কারণ লক ভ্যালুগুলো ইউনিক আইডেন্টিফায়ার হতে হবে, কনস্ট্যান্ট স্ট্রিং নয়।

একটি লক রিলিজ করতে হলে ওনারশিপ ভেরিফাই করতে হয়। সেফ পদ্ধতি হলো একটি Lua স্ক্রিপ্ট ব্যবহার করা যেটি স্টোরড ভ্যালু চেক করে এবং লকটি শুধু তখনই ডিলিট করে যখন এটি এক্সপেক্টেড ওনার সাথে মэтচ করে।

এটি একটি রেস কন্ডিশন প্রতিবন্ধক করে যেখানে একটি লক এক্সপায়ার হয়, অন্য একটি প্রসেস আকোয়ার করে, এবং তারপর অরিজিন্যাল হোল্ডার অকস্মাতে সেটি ডিলিট করে দেয়।

একটি সেফ লক ডিউরেশন বেছে নেওয়া

লক TTL প্রোটেক্টেড অপারেশনের ম্যাক্সিমাম এক্সপেক্টেড এক্সিকিউশন টাইমের চেয়ে বড় হতে হবে। এভারেজ এক্সিকিউশন টাইম ব্যবহার করলেই হবে না।

যদি লক এক্সপায়ার হয় কাজ চলাকালীন, অন্য একটি প্রসেস সেটি আকোয়ার করতে পারে এবং একই কাজ কনকারেন্টলি করতে পারে। এটি ডুপ্লিকেশন বা করপশন তৈরি করতে পারে।

একই সাথে, অতিরিক্ত লম্বা TTL রিকভারি ডিলে করে যখন কিছু ভুল হয়। লক ডিউরেশন একটি ব্যালেন্স যা সিস্টেম চেঞ্জের সাথে বিবর্তিত হয়।

লকড কাজ ছোট এবং বাউন্ডেড রাখা সेफেস্ট পদ্ধতি।

লক এক্সটেনশন এবং হার্টবীট

কিছু অপারেশন এক্সপেক্টেড চেয়ে বেশি টাইম নেয়। লক এক্সটেন্ড করা পিরিয়ডিক্যালি TTL রিফ্রেশ করলেও সম্ভব, কিন্তু এটি কমপ্লেক্সিটি এবং নতুন ফেইল মোড আনে।

শুধু লক ওনারকেই TTL এক্সটেন্ড করতে পারবেন, এবং এক্সটেনশন অবশ্যই তৎক্ষণ বন্ধ হয়ে যেতে হবে যদি ওনারশিপ হারানো হয়।

অনেক কেসে, কাজকে ছোট চাঙ্কে রিডিজাইন করা লক এক্সটেনশন লজিক ইমপ্লিমেন্ট করার চেয়ে সेफার।

Redlock ডিবেট

Redlock একটি অ্যালগরিদম যা মাল্টিপল Redis ইনস্ট্যান্স ব্যবহার করে লক সেফটি উন্নত করতে। এটি কনট্রোভার্শিয়ালও এবং অপারেশনালি কমপ্লেক্স।

অধিকাংশ সিস্টেমের জন্য, Redlock বেনিফিটের চেয়ে বেশি কমপ্লেক্সিটি আনে। এটি টাইমিং অনুমানের ওপর নির্ভর করে যা রিয়েল-ওয়ার্ল্ড এনভায়রনমেন্টে গ্যারান্টি দিতে কঠিন।

যদি Redlock-লেভেল গ্যারান্টি দরকার হয়, Redis উপযুক্ত টুল নয়। ট্রানজ্যাকশনাল লকিংয়ের ডাটাবেস বা স্পেশালাইজড কোঅর্ডিনেশন সিস্টেম बेटার ফিট হতে পারে।

অধিকাংশ Redis ইউজ কেসের জন্য, প্রপার TTL-বেসড লকিংসহ একটি সিঙ্গেল Redis ইনস্ট্যান্স পর্যাপ্ত।

লকস ট্রানজ্যাকশন নয়

Redis লক অপারেশনকে ট্রানজ্যাকশনাল বানায় না। সেগুলো অটোমেটিক রোলব্যাক বা গ্যারান্টি কনসিস্টেন্সি প্রোভাইড করে না যখন ফেইলিউর ঘটে মিড-অপারেশন।

লকস কনকারেন্সি কমায়; সেগুলো ফেইলিউর এলিমিনেট করে না। ক্রিটিক্যাল সেকশনগুলোকে আইডেমপটেন্ট ডিজাইন করা উচিত যাতে রিপিটেড এক্সিকিউশন হানिकारক হয় না।

এই ডিজাইন প্রিন্সিপল লকিং-রিলেটেড বাগের রিস্ক উল্লেখযোগ্যভাবে কমায়।

যখন Redis ডাউন হয় তখন কী হয়

যখন Redis ডাউন হয় বা রিস্টার্ট হয়, সব লক মুছে যায়। এটি এক্সপেক্টেড বিহেভিয়র।

যখন Redis আবার অনলাইন আসে, একাধিক প্রসেস সিমাল্টেনিয়াসলি লক আকোয়ার করতে পারে এবং কাজ শুরু করতে পারে। সিস্টেমগুলো এই সম্ভাবনা টলারেট করতে হবে।

যদি Redis রিস্টার্টের সময় লক হারানো করপশনে ইড করে, লকিং ডিজাইন আনসেফ এবং সেটি রিকনসিডার করতে হবে।

প্রোডাকশনে লক মনিটরিং

Redis লক কখনো ইনভিজিবল হতে দেয়া উচিত নয়। টিমরা মনিটর করা উচিত কতগুলো লক এক্সিস্ট করে, সেগুলো কতক্ষণ লিভ করে, এবং লক আকুইজিশন কতবার ফেইল হয়।

অনুচিতভাবে লম্বা লিভ করা লক স্টল্ড প্রসেস ইন্ডিকেট করে। ফ্রিকোয়েন্ট আকুইজিশন ফেইলিয়ার কনটেনশন বা ভুল লক ডিজাইন ইন্ডিকেট করে।

ভিজিবিলিটি সেফ অপারেশনের জন্য এসেনশিয়াল।

সাধারণ Redis লক অ্যান্টি-প্যাটার্ন

সাধারণ মিস্টেক شامل: TTL ছাড়া SETNX ব্যবহার, লক ওনারশিপের জন্য কনস্ট্যান্ট ভ্যালু ব্যবহার, ব্লাইন্ডলি লক ডিলিট করা, লং-রানিং টাস্কের জন্য লক হোল্ড করা, এবং অনুমান করা লক করেক্টনেস গ্যারান্টি দেয়।

এই অ্যান্টি-প্যাটার্নগুলো রিয়েল-ওয়ার্ল্ড প্রোডাকশন আউটেজে বারবার দেখা যায়।

একটি প্র্যাক্টিক্যাল লকিং চেকলিস্ট

একটি সেফ Redis লকিং ইমপ্লিমেন্টেশন شامل:

  • TTLসহ লক কী

  • ইউনিক লক ওনারশিপ ভ্যালু

  • রিলিজের সময় ওনারশিপ ভেরিফিকেশন

  • শর্ট-লিভড ক্রিটিক্যাল সেকশন

  • আইডেমপটেন্ট অপারেশন

  • টেস্টেড ফেইল পাথ

যদি এই중에 যেকোনো একটা মিসিং থাকে, লকিং ডিজাইনটি রিকনসিডার করা উচিত।

Redis লকসের জন্য একটি হেলথি মেন্টাল মডেল

Redis লক সিটবেল্ট, নয় এয়ারব্যাগ। এগুলো ড্যামেজ কমায় কিন্তু এক্সিডেন্ট পুরোপুরি প্রতিবন্ধক করে না।

যত্নপূর্বক ব্যবহার করা হলে, এগুলো ডিস্ট্রিবিউটেড সিস্টেমে কোঅর্ডিনেশন সিম্পলিফাই করে। ক্যাজুয়ালি ব্যবহার করা হলে, এগুলো সাবটেল এবং 지속되는 বাগ আনে।

সারসংক্ষেপ

ডিস্ট্রিবিউটেড লকিং কঠিন কারণ ফেইলিউর অবश्यম্ভাবী। Redis একটি ফাস্ট, সিম্পল, এবং প্র্যাগম্যাটিক লকিং মেকানিজম দেয়, পেরফেক্ট একটা নয়।

ফেইলিউর-এর জন্য ডিজাইন করুন, লকগুলো ছোট রাখুন, TTL কনসিস্টেন্টলি ব্যবহার করুন, এবং অপারেশনগুলো রিট্রাই করার জন্য সেফ নিশ্চিত করুন। সঠিকভাবে ব্যবহার করা হলে, Redis ডিস্ট্রিবিউটেড লকস প্রোডাকশন সিস্টেমে বিশ্বস্ত এবং ইফেক্টিভ টুল।


  1. জাভাস্ক্রিপ্টে লিঙ্ক নতুন উইন্ডোতে খোলা

  2. Windows-এ MySQL টেবিল ডেটা কোথায় সংরক্ষিত থাকে?

  3. জাভাস্ক্রিপ্ট দিয়ে ইমেজকে Blob-এ রূপান্তর করা

  4. LaTeX ব্যবহার করে রেন্ডারিং সময় Matplotlib প্লটে অক্ষ টিক ফন্ট পরিবর্তন করুন