
পরিচয়
বিতরণ করা লকগুলি সহজ শোনায় যতক্ষণ না আপনি প্রকৃতপক্ষে উত্পাদনে তাদের উপর নির্ভর করেন৷
একটি প্রক্রিয়া একটি সম্পদ একচেটিয়া অ্যাক্সেস প্রয়োজন. একাধিক সার্ভার চলছে। রেডিস মাঝখানে বসে। ধারণাটি সহজবোধ্য:রেডিসে একটি তালা রাখুন এবং এগিয়ে যান৷
৷কিছু সময়ের জন্য, এই পদ্ধতিটি কাজ করে বলে মনে হচ্ছে। তারপরে একটি প্রক্রিয়া ক্র্যাশ হয়, একটি নেটওয়ার্ক বিলম্ব ঘটে বা লেটেন্সি স্পাইক হয়। হঠাৎ, দুটি প্রক্রিয়া একই লক দাবি করে, কোনো প্রক্রিয়া এটির মালিক নয়, অথবা লকটি কখনই মুক্তি পায় না।
বেশিরভাগ Redis লকিং সমস্যা Redis নিজেই দ্বারা সৃষ্ট হয় না. এগুলি ঘটে কারণ বিতরণ করা লকগুলি প্রায়শই ভুল বোঝা যায়। রেডিস সমন্বয়ের জন্য একটি টুল প্রদান করে, নিখুঁত এক্সক্লুসিভিটির গ্যারান্টি নয়।
একটি বিতরণ করা লক আসলে কি
একটি বিতরণ করা লক একটি ইন-মেমরি মিউটেক্সের মতো নয়। এটি পরম গ্যারান্টি প্রদান করে না, এবং এটি ব্যর্থতা দূর করতে পারে না।
বিতরণ করা লকগুলি সমন্বয় প্রক্রিয়া যা অবিশ্বস্ত পরিবেশে কাজ করে। নেটওয়ার্কগুলি ব্যর্থ হয়, প্রক্রিয়াগুলি ক্র্যাশ হয় এবং ঘড়িগুলি প্রবাহিত হয়৷ নিখুঁত আচরণ অনুমান করে এমন যেকোনো লকিং কৌশল অবশেষে ভেঙে যাবে।
রেডিস লকগুলি সর্বোত্তম প্রচেষ্টার লক। সঠিকভাবে ডিজাইন করা হলে, তারা অত্যন্ত কার্যকর। যখন আকস্মিকভাবে প্রয়োগ করা হয়, তখন তারা সূক্ষ্ম রেস শর্ত এবং ডেটা দুর্নীতির পরিচয় দেয়।
নিরাপদে রেডিস লক ব্যবহার করার প্রথম ধাপ হল প্রত্যাশা সামঞ্জস্য করা।
যখন রেডিস লক সেন্স করে
পুনরায় বিতরণ করা লকগুলি উপযুক্ত যখন:
-
আপনাকে একটি সমালোচনামূলক বিভাগের একযোগে কার্যকর করা প্রতিরোধ করতে হবে
-
কাজ একাধিক সার্ভার জুড়ে সমন্বয় করা আবশ্যক
-
অপারেশনটি স্বল্পস্থায়ী
-
পুনরায় চেষ্টা গ্রহণযোগ্য
সাধারণ ব্যবহারের ক্ষেত্রে কাজের অনুলিপি, নির্ধারিত টাস্ক সমন্বয়, ক্যাশে পুনর্নির্মাণ এবং ডবল প্রসেসিং প্রতিরোধ অন্তর্ভুক্ত।
রেডিস লকগুলি দীর্ঘস্থায়ী ব্যবসায়িক লেনদেন, ব্যবহারকারী-মুখী সমালোচনামূলক কর্মপ্রবাহ, বা অপারেশনগুলির জন্য একটি দুর্বল ফিট যা নিরাপদে পুনরায় চেষ্টা করা যায় না। পুনরায় চেষ্টা গ্রহণযোগ্য না হলে, Redis লকগুলি ভুল টুল।
Redis-এ একমাত্র নিরাপদ লকিং আদিম
সবচেয়ে নিরাপদ রেডিস লকিং আদিম হল একটি একক পারমাণবিক কমান্ড:
সেট কী মান NX EX ttl
এই কমান্ডটি একটি লক তৈরি করে যদি এটি ইতিমধ্যে বিদ্যমান না থাকে, একটি অনন্য মালিকের মান নির্ধারণ করে এবং একটি TTL সেট করে যাতে লকটি স্বয়ংক্রিয়ভাবে শেষ হয়ে যায়৷
যে কোনো বিকল্প পদ্ধতি জাতি অবস্থার পরিচয় দেয়। TTL ছাড়া SETNX ব্যবহার করা বা আলাদা ধাপে মেয়াদ শেষ হওয়ার সময় নির্ধারণ করা ব্যর্থতায় ভেঙে যায়। TTL বাধ্যতামূলক এবং কোনো প্রক্রিয়া অপ্রত্যাশিতভাবে ক্র্যাশ হলে সিস্টেমকে রক্ষা করে।
টিটিএল লক করা কেন বাধ্যতামূলক
একটি TTL ছাড়া, একটি Redis লক চিরকাল বেঁচে থাকতে পারে। যদি একটি লক ধরে রাখার সময় একটি প্রক্রিয়া ক্র্যাশ হয়, তাহলে সিস্টেমটি নীরবে স্টল হয়ে যায়৷
TTL লকগুলিকে স্ব-নিরাময় করে তোলে। যখন একটি ব্যর্থতা ঘটে, লকটি শেষ পর্যন্ত শেষ হয়ে যায় এবং অগ্রগতি পুনরায় শুরু করার অনুমতি দেয়। এর ফলে সংক্ষিপ্ত ওভারল্যাপ হতে পারে, কিন্তু সেই ট্রেডঅফ ইচ্ছাকৃত।
যে লকগুলি কখনই মেয়াদোত্তীর্ণ হয় না তালাগুলি না থাকার চেয়ে বেশি বিপজ্জনক৷
মালিকানা এবং নিরাপদ মুক্তি লক করুন
একটি রেডিস লক শুধুমাত্র সেই প্রক্রিয়ার মাধ্যমে প্রকাশ করা উচিত যা এটি অর্জন করেছে। এই কারণেই লক মানগুলি অনন্য শনাক্তকারী হওয়া উচিত, ধ্রুবক স্ট্রিং নয়৷
একটি লক মুক্তির জন্য মালিকানা যাচাই করা প্রয়োজন৷ নিরাপদ পদ্ধতি হল একটি লুয়া স্ক্রিপ্ট ব্যবহার করা যা সঞ্চিত মান পরীক্ষা করে এবং লকটি মুছে দেয় শুধুমাত্র যদি এটি প্রত্যাশিত মালিকের সাথে মেলে।
এটি এমন একটি রেস অবস্থাকে প্রতিরোধ করে যেখানে একটি লকের মেয়াদ শেষ হয়ে যায়, অন্য প্রক্রিয়া দ্বারা অর্জিত হয় এবং তারপরে আসল হোল্ডার দ্বারা ঘটনাক্রমে মুছে ফেলা হয়৷
একটি নিরাপদ লক সময়কাল নির্বাচন করা
লক TTL অবশ্যই সুরক্ষিত অপারেশনের সর্বোচ্চ প্রত্যাশিত এক্সিকিউশন সময় অতিক্রম করবে। গড় কার্যকর করার সময় ব্যবহার করা যথেষ্ট নয়।
কাজ চলার সময় যদি একটি লক মেয়াদোত্তীর্ণ হয়, অন্য একটি প্রক্রিয়া এটি অর্জন করতে পারে এবং একই সাথে একই কাজ সম্পাদন করতে পারে। এটি নকল বা দুর্নীতির কারণ হতে পারে৷
একই সময়ে, কিছু ভুল হয়ে গেলে অত্যধিক দীর্ঘ TTL পুনরুদ্ধারে বিলম্ব করে। লক সময়কাল হল একটি ভারসাম্য যা সিস্টেমের পরিবর্তনের সাথে সাথে বিকশিত হয়।
লক করা কাজকে ছোট এবং আবদ্ধ রাখা সবচেয়ে নিরাপদ পদ্ধতি।
লক এক্সটেনশন এবং হার্টবিটস
কিছু অপারেশন প্রত্যাশার চেয়ে বেশি সময় নেয়। পর্যায়ক্রমে TTL রিফ্রেশ করে লক বাড়ানো সম্ভব, তবে এটি জটিলতা এবং নতুন ব্যর্থতার মোড যোগ করে।
শুধুমাত্র লক মালিককে TTL প্রসারিত করার অনুমতি দেওয়া উচিত, এবং মালিকানা হারিয়ে গেলে এক্সটেনশন অবিলম্বে বন্ধ করতে হবে।
অনেক ক্ষেত্রে, লক এক্সটেনশন লজিক প্রয়োগ করার চেয়ে ছোট অংশে কাজকে পুনরায় ডিজাইন করা নিরাপদ৷
রেডলক বিতর্ক
Redlock হল একটি অ্যালগরিদম যা লক নিরাপত্তা উন্নত করতে একাধিক Redis উদাহরণ ব্যবহার করে। এটি বিতর্কিত এবং কার্যকরীভাবে জটিল।
বেশিরভাগ সিস্টেমের জন্য, রেডলক সুবিধার চেয়ে বেশি জটিলতার পরিচয় দেয়। এটি সময়ের অনুমানের উপর নির্ভর করে যা বাস্তব-বিশ্বের পরিবেশে গ্যারান্টি দেওয়া কঠিন।
যদি Redlock-স্তরের গ্যারান্টি প্রয়োজন হয়, Redis উপযুক্ত টুল নাও হতে পারে। লেনদেন লকিং বা বিশেষ সমন্বয় ব্যবস্থা সহ ডেটাবেসগুলি আরও ভাল ফিট হতে পারে৷
বেশিরভাগ Redis ব্যবহারের ক্ষেত্রে, সঠিক TTL-ভিত্তিক লকিং সহ একটি একক Redis উদাহরণ যথেষ্ট।
লকগুলি লেনদেন নয়
Redis লক অপারেশন লেনদেন করে না. তারা স্বয়ংক্রিয় রোলব্যাক প্রদান করে না বা অপারেশনের মাঝামাঝি ব্যর্থতা ঘটলে ধারাবাহিকতার গ্যারান্টি দেয় না।
তালাগুলি একযোগে হ্রাস করে; তারা ব্যর্থতা দূর করে না। সমালোচনামূলক বিভাগগুলিকে অক্ষমতার জন্য ডিজাইন করা উচিত যাতে বারবার মৃত্যুদণ্ড ক্ষতির কারণ না হয়৷
এই ডিজাইন নীতিটি লকিং-সম্পর্কিত বাগগুলির ঝুঁকি উল্লেখযোগ্যভাবে হ্রাস করে৷
৷রেডিস নিচে গেলে কি হয়
যখন রেডিস নেমে যায় বা পুনরায় চালু হয়, সমস্ত লক অদৃশ্য হয়ে যায়। এটি প্রত্যাশিত আচরণ৷
রেডিস যখন অনলাইনে ফিরে আসে, তখন একাধিক প্রক্রিয়া একই সাথে লকগুলি অর্জন করতে পারে এবং কাজ শুরু করতে পারে। সিস্টেমগুলিকে অবশ্যই এই সম্ভাবনা সহ্য করতে হবে৷
৷যদি রেডিস রিস্টার্ট করার সময় লক হারানো দুর্নীতির দিকে পরিচালিত করে, লকিং ডিজাইনটি অনিরাপদ এবং পুনর্বিবেচনা করা প্রয়োজন৷
উৎপাদনে লক মনিটরিং
রেডিস লকগুলি কখনই অদৃশ্য হওয়া উচিত নয়। কতগুলি লক বিদ্যমান, কতদিন তারা বেঁচে থাকে এবং কত ঘন ঘন লক অধিগ্রহণ ব্যর্থ হয় তা টিমগুলিকে পর্যবেক্ষণ করা উচিত৷
অস্বাভাবিকভাবে দীর্ঘজীবী লকগুলি স্থবির প্রক্রিয়া নির্দেশ করে। ঘন ঘন অধিগ্রহণ ব্যর্থতা বিবাদ বা ভুল লক ডিজাইনের পরামর্শ দেয়।
নিরাপদ অপারেশনের জন্য দৃশ্যমানতা অপরিহার্য।
সাধারণ রেডিস লক অ্যান্টি-প্যাটার্নস
সাধারণ ভুলগুলির মধ্যে রয়েছে TTL ছাড়া SETNX ব্যবহার করা, লক মালিকানার জন্য ধ্রুবক মান ব্যবহার করা, অন্ধভাবে লকগুলি মুছে ফেলা, দীর্ঘমেয়াদী কাজগুলির জন্য লকগুলি ধরে রাখা এবং লকগুলি সঠিকতার গ্যারান্টি দেয়৷
এই অ্যান্টি-প্যাটার্নগুলি প্রায়শই বাস্তব-বিশ্বের উত্পাদন বিভ্রাটে উপস্থিত হয়৷
একটি ব্যবহারিক লকিং চেকলিস্ট
একটি নিরাপদ রেডিস লকিং বাস্তবায়নের মধ্যে রয়েছে:
-
TTLs দিয়ে লক কী
-
অনন্য লক মালিকানা মান
-
রিলিজে মালিকানা যাচাই
-
স্বল্পকালীন সমালোচনামূলক বিভাগগুলি
-
ইমপোটেন্ট অপারেশনস
-
পরীক্ষিত ব্যর্থতার পথ
এর মধ্যে যেকোনটি অনুপস্থিত থাকলে, লকিং ডিজাইনটি পুনর্বিবেচনা করা উচিত।
রিডিস লকগুলির জন্য একটি স্বাস্থ্যকর মানসিক মডেল
রেডিস লক হল সিটবেল্ট, এয়ারব্যাগ নয়। এগুলো ক্ষয়ক্ষতি কমায় কিন্তু দুর্ঘটনা সম্পূর্ণভাবে প্রতিরোধ করে না।
সাবধানে ব্যবহার করা হয়, তারা বিতরণ করা সিস্টেমে সমন্বয় সহজতর করে। আকস্মিকভাবে ব্যবহার করা হয়, তারা সূক্ষ্ম এবং অবিরাম বাগ প্রবর্তন করে।
সারাংশ
বিতরণ করা লকিং কঠিন কারণ ব্যর্থতা অনিবার্য। Redis একটি দ্রুত, সহজ, এবং বাস্তবসম্মত লকিং প্রক্রিয়া প্রদান করে, একটি নিখুঁত নয়।
ব্যর্থতার জন্য ডিজাইন করুন, লকগুলি সংক্ষিপ্ত রাখুন, ধারাবাহিকভাবে TTL ব্যবহার করুন এবং নিশ্চিত করুন যে অপারেশনগুলি পুনরায় চেষ্টা করা নিরাপদ। সঠিকভাবে ব্যবহার করা হলে, রেডিস বিতরণ করা লকগুলি উত্পাদন ব্যবস্থায় নির্ভরযোগ্য এবং কার্যকর সরঞ্জাম।