রেডিস ৭.০-র রিলিজ ট্র্যাক-এ আছে, এবং আমরা এখন এর দ্বিতীয় রিলিজ ক্যান্ডিডেট পাবলিশ করেছি। এই রিলিজ ক্যান্ডিডেট একটি প্লানড মাইলстоন ভার্সনের ফিচারগুলো কমপ্লিট করার জন্য, কিন্তু এটাও একটি সুযোগ আমাদের জন্য নতুন ভার্সনে অতিরিক্ত কন্টেন্ট প্রেজেন্ট করতে। উদাহরণস্বরূপ, রেডিস ফাংশনস বিবর্তিত হয়েছে রেডিসের যেটা ভার্সন ২.৬ থেকে স্ক্রিপ্টিং সাপোর্ট ছিল। একইভাবে, রেডিসের আরও অনেক ফিচার বিবর্তিত হয়েছে।
প্রকৃতিতে, বিবর্তন তেমন র্যান্ডমলি হয় এবং ন্যাচারেল সিলেকশন এর রেজাল্ট সর্ট আউট করে। সাধারণত সফটওয়্যারে, এবং স্পেসিফিক্যালি রেডিসে, এই প্রসেস উল্টো দিকে ঘটে: আমরা ডিজায়ারড পাথ সিলেক্ট করি এবং প্রজেক্টকে সেটা ফলো করার জন্য বিবর্তিত করি। র্যান্ডমনেসকে ভবিষ্যত দিকনির্দেশনা দেয়া না দিয়ে, আমাদের রোডম্যাপের প্ল্যানিং এবং এক্সিকিউশন প্রাথমিকভাবে গাইডেড হয় ইউজার ফিডব্যাক এবং নতুন ইউজ কেস যেখানে রেডিস একটি ভাল ফিট।
রেডিস ৭.০-এ, অ্যাক্সেস কন্ট্রোল লিস্ট (ACL) এবং একটি ধাপ আগে বেড়েছে। রেডিস ৬.০-এ পরিচিত, ACL দীর্ঘদিনের মতামত উল্টিয়ে দিয়েছিল সিকিউরিটি প্রজেক্টের স্কোপের বাইরে বলে, ইউজার এবং তাদের পারমিশন ম্যানেজ করার মেকানিজম যোগ করে। যেতো, আমাদের কমিউনিটি দ্রুত আমাদের শিখিয়েছে যে যদিও এটি সঠিক দিকে একটি ধাপ, ফিচারটিতে এখনো প্রয়োজনীয় ক্যাপাবিলিটির অভাব ছিল।
ACL-এ একটি গ্যাপ ইতিমধ্যে রেডিস ৬.২-এ সমাধান করা হয়েছিল, নামলে Pub/Sub চ্যানেল নামের অ্যালোড প্যাটার্ন কন্ট্রোল করা। কিন্তু সেটা শুধু একটি আংশিক স্টপ-গ্যাপ ছিল এবং বাকি গ্যাপগুলো সমাধান করার জন্য একটি সিম্পল এবং ইফেক্টিভ অ্যাপ্রোচ খুঁজে বের করতে আমাদের বেশি সময় লাগল।
ACL-এর ওরিজিনাল ডিজাইন শুধু বেসিক পারমিশন-কন্ট্রোল ইউজ কেসের জন্য প্রোভিশন করেছিল। এটা শুধু একটি সেট কমান্ড, কী'স, এবং চ্যানেলস' নাম প্যাটার্ন প্রতি ইউজার গ্র্যান্ট বা ডিনি করতে পারত। এটা অসম্ভব ছিল, উদাহরণস্বরূপ, `SET` কমান্ডকে একটি কী সাবসেটে সীমাবদ্ধ করতে, এবং একই সাথে `GET`-কে অন্য কী সাবসেটে অ্যালো করতে একই ইউজারের জন্য। কার্যকরভাবে, ACL সিকিউরিটি পলিসি বাস্তবায়নের জন্য একটি ইফেক্টিভ মেকানিজম ছিল না।
রেডিস ৭.০-এর অ্যাক্সেস কন্ট্রোল লিস্ট, বা সংক্ষেপে ACLv2, ওরিজিনালটির সাথে কম্প্যাটিবল কিন্তু দুটি গুরুত্বপূর্ণ উন্নতি যোগ করে। প্রথম, ACLv2 হলো সিলেক্টরগুলোর ওপর সবকিছু। দ্বিতীয়, ACLv2 স্পেসিফিক কীগুলোর জন্য এক্সেস টাইপ পারমিশন সেট করার অনুমতি দেয়। এই ক্যাপাবিলিটি এক ইউজারকে এক্সক্লুসিভলি রিড-ওনলি, রাইট-ওনলি, বা রিড-রাইট অপারেশন সীমাবদ্ধ করতে দেয় কীগুলোর একটি সাবসেটে।
ওরিজিনাল ACL ডিজাইন শুধু একটি সিলেক্টর প্রতি ইউজার প্রোভাইড করেছিল - ডিফল্ট সিলেক্টর। সিলেক্টর বর্ণনা করে কী এবং চ্যানেলগুলো যা ইউজার অ্যাক্সেস করতে পারে, ক্যাটাগরি এবং কমান্ড। ACLv2 ডিফল্টর ওপর যেকোনো সংখ্যক সিলেক্টর যোগ করার অনুমতি দেয় যেগুলো ক্রমে অ্যাপ্লাই হয়। এই অ্যাপ্রোচ আরও ডিমান্ডিং সিকিউরিটি পলিসির রিকোয়ারমেন্ট স্যাটিসফাই করে এবং ACL-কে কমপ্লিটনেসের নিকটে আনয়।
সার্ভারের ইন্ট্রোস্পেক্টিভ ক্ষমতা রেডিসের আরেকটি দিক যা ৭.০-এ উল্লেখযোগ্যভাবে এগিয়ে এসেছে। রেডিস একটি API এক্সপোজ করে, এর কমান্ডের ডিকশনারি, যেটার মাধ্যমে এটি ইন্টারঅ্যাক্ট করে। প্রজেক্ট বিবর্তনされる সাথে সাথে, ভিন্ন কমান্ডের সংখ্যা (এবং তাদের সাব-কমান্ড) বেড়েছে, ৭.০-এ ৩৮০-এর বেশি পৌঁছে। যেহেতু প্রতিটি রেডিস কমান্ড নির্দিষ্ট টাস্কের জন্য স্পেশালাইজড, প্রতিটি কমান্ডের ইনভোকেশন আর্গুমেন্ট এবং বিহেবিয়ার ডকুমেন্ট করা প্রজেক্টের একটি কোর প্রিন্সিপল। এই ডকুমেন্টেশন একমাত্র কন্ট্রাক্ট সার্ভার এবং এর ক্লায়েন্টদের মাঝপথে।
ঐতিহাসিকভাবে, কমান্ডগুলো প্রজেক্টের বাইরে এক্সটার্নালি ডকুমেন্ট করা হতো একটি আলাদা কোড রিপোজিটরিতে। আমরা সকল ডকুমেন্টেশন একটি (প্রায়) হিউম্যান-রিডেবল ফরম্যাটে রাখতাম কারণ এটা মানুষ পড়তে জন্য ছিল। এটা মেশিনগুলোকে (বা বরং, যারা মেশিন প্রোগ্রাম করে) চ্যালেঞ্জ করতো কারণ গদ্য কোডে ট্রান্সলেট করা গুলবুল এবং ব্রITLE। স্পেসিফিক্যালি, রেডিসের জন্য ক্লায়েন্টের লেখকরা শুধু আশা করতে পারতেন তাদের প্রজেক্ট আপ টু ডেট রাখতে ডকুমেন্টেশনের পরিবর্তন এবং রিলিজ নোটস মনিটর করে।
তাই, ভার্সন ২.৮-এ, আমরা বুঝলাম আমাদের একটি প্রোগ্রাম্যাটিক উপায়ও দরকার যা সার্ভারকে তার কমান্ড রিপোর্ট করতে দেবে। উপযুক্ত নামে (যদিও জিহ্বা-ব্র تشارلز) `COMMAND` কমান্ড রানটাইমে সার্ভার সাপোর্ট করে এমন কমান্ডগুলো লিস্ট করে। மேலும், `COMMAND GETKEYS` সাবকমান্ড ক্লায়েন্টকে একটি ভারব্যাটিম কমান্ড এবং এর আর্গুমেন্ট পাঠাতে দেয় যাতে সার্ভার সেটা থেকে কী-নেম এক্সট্র্যাক্ট করতে পারে। একটি কমান্ড থেকে কী নাম এক্সট্র্যাক্ট করা দরকার যাতে ক্লায়েন্ট অপারেশনটি সঠিকভাবে ডাইরেক্ট করতে পারে একটি ক্লাস্টার ডিপ্লয়মেন্টে।
অংশত ACLv2-রিলেটেড প্রচেষ্টার 의해 চালিত কিন্তু রানটাইম কমান্ড লিস্টকে ক্লায়েন্টদের জন্য আরও উপযোগী করার জন্যও, ভার্সন ৭.০ সার্ভারের কমান্ড ম্যানেজমেন্টের ইন্টারন্যাল মেকানিজমের অনেকাংশও ওভারহল করে। 덧붙ে, আমরা সার্ভার প্রতিটি কমান্ড সম্পর্কে রেখে থাকা মেটাডেটা সমৃদ্ধ করেছি, যা সফিস্টিকেটেড ক্লায়েন্ট বানাতে সম্ভব করে যাদের (প্রায়) কোনো প্রায়োর নলেজ নেই সার্ভার ক্যাপাবিলিটির সম্পর্কে। অবশেষে, রিভ্যাম্পড কমান্ড টেবিল এমনভাবে বিল্ট করা হয়েছে যাতে রেডিস মডিউলগুলো তাদের নিজস্ব কমান্ডের সাথে এক্সটেন্ড করতে পারে, কোর কমান্ডের মতো একই লেভেলের ইন্ট্রোস্পেকশন প্রদান করতে।
নতুন কমান্ড কী স্পেসিফিকেশন ক্লায়েন্টদের লোকালি কী এক্সট্র্যাক্ট করতে দেয় ভারব্যাটিম কমান্ড থেকে সার্ভার ক্লাস্টারের সাপেক্ষে না लेकर, যাতে লেটেন্সি উন্নত হয় এবং নেটওয়ার্ক ব্যান্ডউইথ কমে। কমান্ড আর্গুমেন্ট সম্পর্কে মেটাডেটা ক্লায়েন্টদের ডিসকভার এবং অ্যাডাপ্ট করতে দেয় কমান্ড সিনট্যাক্সের পরিবর্তন সার্ভার ভার্সনের মাঝপথে। ক্লায়েন্টরা কমান্ড টিপস থেকে আরও ইনফরমেশন পেতে পারে স্পেশাল সার্কামস্ট্যান্স এবং ডিফারেন্ট ডিপ্লয়মেন্ট টাইপে কমান্ড এক্সিকিউশনের সম্পর্কে।
এই প্রচেষ্টা সাবকমান্ডকে সার্ভারের কমান্ড টেবিলের ফার্স্ট-ক্লাস সিটিজেন হিসেবে প্রোমোট করারও অন্তর্ভুক্ত করেছিল। ওরিজিনালি, সাবকমান্ড রেডিসে পরিচিত হয়েছিল API-এর বেড়ে কার্ডিন্যালিটি কন্ট্রোল করার জন্য। কারণ ছিল প্রতিটি টাস্কের জন্য একটি নতুন কমান্ড যোগ করার বদলে, রিলেটেড টাস্কগুলো ইনভোক করা যায় শুধু একটি "প্যারেন্ট" কমান্ড কল করে। "প্যারেন্ট" কমান্ড তার প্রথম আর্গুমেন্ট হিসেবে সাবকমান্ডের নাম নেয়, যেটা بدوره একশন ডিক্টেট করে। একটি টেকনিক্যাল স্ট্যান্ডপয়েন্ট থেকে, সাবকমান্ড সকল তার প্যারেন্ট কমান্ডের ট্রেইট ইনহেরিট করত (যেমন, ACL ক্যাটাগরি, রিড/রাইট ফ্ল্যাগ, কী স্পেসিফিকেশন, ইত্যাদি), যা তাদের ভিন্ন বিহেবিয়ারের মধ্যে ফাইন-গ্রেইনড ডিস্টিংকশন অসম্ভব করে দিত।
উদাহরণস্বরূপ, `CLIENT` কমান্ড একটি ক্যাচ-অল বাস্কেট কানেকশন ম্যানেজমেন্ট টাস্কের জন্য যেটার ১৫টি অলग সাবকমান্ড আছে। এর কিছু সাবকমান্ড, যেমন `CLIENT SETNAME`, রুটিনلي কল হয় নরমাল ক্লায়েন্ট কানেকশন দিয়ে, যেখানে অন্যগুলো যেমন `CLIENT KILL` মিসইউজের পটেনশিয়াল রাখে এবং সেজন্য শুধু অ্যাডমিন ইউজের জন্য রিস্ট্রিক্টেড হওয়া উচিত। রেডিসের tidligere ভার্সনে সে ইন্টারন্যাল মেকানিজমের অভাব ছিল যেটা এমন ডিস্টিংকশন সাপোর্ট করে, ফলে ডেভেলপারদের ডকুমেন্টেশনের দিকে ধাক্কা দিত এবং কনফিউশন সৃষ্টি করত। রেডিস ৭.০-এ, যেতো, প্রতিটি সাবকমান্ডের নিজস্ব সেট অফ ট্রেইট আছে, তার প্যারেন্ট বা সিবলিংস নির্বিশেষে, যা এর সঠিক বর্ণনা করার অনুমতি দেয়।
এই পোস্ট খুব বড় একটি টেক্সট ওল creación করেছে যা সম্ভবত এর শেষে টেকনিক্যাল ডিটেইলে চলে গেছে (যদি এমন কিছু "টু মাচ টেকনিক্যাল ডিটেইল" আছে)। আমরা আশা করি এটি সব বোরিং নয়, এবং আমরা নতুন ভার্সন এবং প্রজেক্টে এর ফিট সম্পর্কে কিছু আলো ফেলতে পেরেছি। আমরা ফাইনাল রিলিজ ক্যান্ডিডেট(স들) নিয়ে কাজ করছি ভার্সনের সাধারণ উপলব্ধতার দিকে, কিন্তু আমাদের পরবর্তী পোস্ট সিরিজের জন্য টিউন্ড থাকুন যা নতুন ভার্সন টัวর চালিয়ে যাবে।