Redis 7.0 এর রিলিজ ট্র্যাকে রয়েছে এবং আমরা সবেমাত্র এটির দ্বিতীয় রিলিজ প্রার্থী প্রকাশ করেছি। এই রিলিজ প্রার্থীটি একটি পরিকল্পিত মাইলফলক যা সংস্করণের বৈশিষ্ট্যগুলি সম্পূর্ণ করার উদ্দেশ্যে, তবে এটি আমাদের জন্য নতুন সংস্করণে অতিরিক্ত সামগ্রী উপস্থাপন করার একটি সুযোগ। উদাহরণস্বরূপ, Redis ফাংশনগুলি স্ক্রিপ্টিংয়ের জন্য বিদ্যমান সমর্থন থেকে উদ্ভূত হয়েছে যা Redis সংস্করণ 2.6 থেকে ছিল। একইভাবে, রেডিসের আরও বৈশিষ্ট্য বিকশিত হয়েছে।
প্রকৃতিতে, বিবর্তন দৃশ্যত এলোমেলোভাবে ঘটে এবং প্রাকৃতিক নির্বাচন তার ফলাফল বাছাই করার যত্ন নেয়। সাধারণত, সাধারণভাবে সফ্টওয়্যারে, এবং বিশেষত রেডিসের সাথে, এই প্রক্রিয়াটি পশ্চাৎপদ হয়:আমরা পছন্দসই পথ নির্বাচন করি এবং সেই অনুযায়ী এটি অনুসরণ করার জন্য প্রকল্পটি বিকাশ করি। এলোমেলোভাবে ভবিষ্যৎ নির্ধারণ না করে, আমাদের রোডম্যাপের পরিকল্পনা এবং বাস্তবায়ন প্রাথমিকভাবে ব্যবহারকারীদের প্রতিক্রিয়া এবং নতুন ব্যবহারের ক্ষেত্রে নির্দেশিত হয় যেখানে রেডিস উপযুক্ত।
রেডিস 7.0-এ, অ্যাক্সেস কন্ট্রোল লিস্ট (ACL) বিবর্তনীয় সিঁড়িও বাড়িয়ে দিয়েছে। Redis 6.0-এ প্রবর্তিত, ACL ব্যবহারকারীদের এবং তাদের অনুমতিগুলি পরিচালনা করার জন্য প্রক্রিয়াগুলি যুক্ত করে প্রকল্পের সুযোগের বাইরে থাকায় সুরক্ষা সম্পর্কে দীর্ঘ সময়ের দৃষ্টিভঙ্গিকে উল্টে দিয়েছে। যাইহোক, আমাদের সম্প্রদায় আমাদের দ্রুত শিক্ষিত করেছে যে এটি সঠিক পথে নেওয়া একটি পদক্ষেপ ছিল, বৈশিষ্ট্যটির এখনও প্রয়োজনীয় ক্ষমতার অভাব ছিল।
ACL এর একটি ফাঁক ইতিমধ্যে Redis 6.2 দ্বারা সমাধান করা হয়েছে, যথা Pub/Sub চ্যানেল নামের অনুমোদিত প্যাটার্ন নিয়ন্ত্রণ করা। কিন্তু এটি শুধুমাত্র একটি আংশিক স্টপ-গ্যাপ ছিল এবং বাকিগুলিকে মোকাবেলা করার জন্য একটি সহজ এবং কার্যকর পদ্ধতি নিয়ে আসতে আমাদের আরও বেশি সময় লেগেছে।
ACL এর মূল নকশায় শুধুমাত্র মৌলিক অনুমতি-নিয়ন্ত্রণ ব্যবহারের ক্ষেত্রে বিধান করা হয়েছে। এটি ব্যবহারকারী প্রতি শুধুমাত্র কমান্ড, কী' এবং চ্যানেলের নামের প্যাটার্নের একক সেটে অ্যাক্সেস মঞ্জুর করা বা অস্বীকার করা সক্ষম করে। এটি অসম্ভব ছিল, উদাহরণস্বরূপ, কীগুলির একটি উপসেটে `SET` কমান্ডকে সীমাবদ্ধ করা এবং একই সময়ে একটি প্রদত্ত ব্যবহারকারীর জন্য কীগুলির আরেকটি উপসেটে `GET` এর অনুমতি দেওয়া। কার্যকরভাবে, ACL নিরাপত্তা নীতি বাস্তবায়নের জন্য একটি কার্যকর ব্যবস্থা ছিল না।
Redis 7.0 এর অ্যাক্সেস কন্ট্রোল লিস্ট, বা সংক্ষেপে ACLv2, মূলের সাথে সামঞ্জস্যপূর্ণ কিন্তু দুটি গুরুত্বপূর্ণ উন্নতি যোগ করে। প্রথমত, ACLv2 হল নির্বাচকদের সম্পর্কে। দ্বিতীয়ত, ACLv2 নির্দিষ্ট কীগুলিতে অ্যাক্সেস টাইপ অনুমতি সেট করার অনুমতি দেয়। এই ক্ষমতাটি ব্যবহারকারীকে কেবলমাত্র পঠন-পাঠন, শুধুমাত্র-লেখা বা পঠন-লেখার ক্রিয়াকলাপগুলিকে কীগুলির একটি উপসেটে সীমাবদ্ধ করা সম্ভব করে তোলে৷
আসল ACL ডিজাইন প্রতি ব্যবহারকারীর জন্য শুধুমাত্র একটি নির্বাচক প্রদান করেছে - ডিফল্ট নির্বাচক। নির্বাচক কী এবং চ্যানেলগুলি বর্ণনা করে যা ব্যবহারকারী অ্যাক্সেস করতে পারে, বিভাগ এবং কমান্ড। ACLv2 ক্রমানুসারে প্রয়োগ করা ডিফল্টের উপরে যেকোন সংখ্যক নির্বাচক যোগ করার অনুমতি দেয়। এই পদ্ধতিটি আরও চাহিদাপূর্ণ নিরাপত্তা নীতির প্রয়োজনীয়তা পূরণ করে এবং ACL-কে সম্পূর্ণতার কাছাকাছি নিয়ে আসে।
সার্ভারের অন্তর্মুখী ক্ষমতা রেডিসের আরেকটি দিক যা 7.0 সংস্করণে উল্লেখযোগ্যভাবে উন্নত হয়েছে। রেডিস একটি API প্রকাশ করে, এর কমান্ডের অভিধান, যার মাধ্যমে এটি ইন্টারঅ্যাক্ট করে। প্রকল্পটি বিকশিত হওয়ার সাথে সাথে, বিভিন্ন কমান্ডের সংখ্যা (এবং তাদের উপ-কমান্ড) বৃদ্ধি পেয়েছে, সংস্করণ 7.0-এ 380-এর বেশি পৌঁছেছে। যেহেতু প্রতিটি রেডিস কমান্ড প্রদত্ত কাজের জন্য বিশেষায়িত, তাই প্রতিটি কমান্ডের আহ্বানের আর্গুমেন্ট এবং আচরণ নথিভুক্ত করা প্রকল্পের একটি মূল নীতি। এই ডকুমেন্টেশন সার্ভার এবং এর ক্লায়েন্টদের মধ্যে একমাত্র চুক্তি।
ঐতিহাসিকভাবে, কমান্ডগুলি বাহ্যিকভাবে একটি পৃথক কোড সংগ্রহস্থলে প্রজেক্টে নথিভুক্ত করা হয়েছিল। আমরা সমস্ত ডকুমেন্টেশন একটি (বেশিরভাগ) মানব-পাঠযোগ্য বিন্যাসে রেখেছি কারণ এটি মানুষের দ্বারা পড়ার উদ্দেশ্যে ছিল। এটি মেশিনগুলির জন্য একটি চ্যালেঞ্জ উপস্থাপন করেছিল (বা বরং, যারা মেশিন প্রোগ্রাম করে) কারণ কোডে গদ্য অনুবাদ করা অগোছালো এবং ভঙ্গুর। বিশেষত, রেডিসের ক্লায়েন্টদের লেখকরা কেবলমাত্র ডকুমেন্টেশনের পরিবর্তনগুলি পর্যবেক্ষণ করে এবং রিলিজ নোটগুলি পড়ার মাধ্যমে তাদের প্রকল্প আপ-টু-ডেট রাখার আশা করতে পারেন।
সুতরাং, সংস্করণ 2.8 দ্বারা, আমরা বুঝতে পেরেছি যে আমাদের একটি প্রোগ্রামেটিক পদ্ধতিরও প্রয়োজন যা সার্ভারকে তার কমান্ড রিপোর্ট করতে দেয়। উপযুক্ত নামযুক্ত (কিন্তু জিভ-টুইস্টারও) `COMMAND` কমান্ড রানটাইমে সার্ভার সমর্থন করে এমন কমান্ডগুলিকে তালিকাভুক্ত করে। উপরন্তু, 'কমান্ড গেটকি' সাবকমান্ড ক্লায়েন্টদেরকে একটি verbatim কমান্ড এবং এর আর্গুমেন্ট পাঠাতে দেয় যাতে সার্ভার এটি থেকে কীগুলির যেকোনো নাম বের করে নেয়। একটি কমান্ড থেকে মূল নামগুলি বের করা প্রয়োজন যাতে ক্লায়েন্ট একটি ক্লাস্টার স্থাপনে সঠিকভাবে অপারেশন পরিচালনা করতে পারে৷
আংশিকভাবে ACLv2-সম্পর্কিত প্রচেষ্টার দ্বারা চালিত কিন্তু ক্লায়েন্টদের জন্য রানটাইম কমান্ডের তালিকাকে আরও উপযোগী করে তুলতে, সংস্করণ 7.0 সার্ভারের কমান্ড পরিচালনার অনেক অভ্যন্তরীণ প্রক্রিয়াকে ওভারহল করে। উপরন্তু, আমরা মেটাডেটা সমৃদ্ধ করেছি যা সার্ভার প্রতিটি কমান্ড সম্পর্কে রাখে, এটি এমন অত্যাধুনিক ক্লায়েন্ট তৈরি করা সম্ভব করে যাদের (প্রায়) সার্ভারের ক্ষমতা সম্পর্কে কোনো পূর্ব জ্ঞান নেই। পরিশেষে, পরিমার্জিত কমান্ড টেবিলটি এমনভাবে তৈরি করা হয়েছে যাতে রেডিস মডিউলগুলি তাদের নিজ নিজ কমান্ডের সাথে এটিকে প্রসারিত করতে পারে, যাতে মূল কমান্ডের মতো একই স্তরের আত্মদর্শন প্রদান করা যায়।
নতুন কমান্ড কী স্পেসিফিকেশনগুলি ক্লায়েন্টদেরকে ক্লাস্টারের সার্ভারগুলিকে জড়িত না করে স্থানীয়ভাবে মৌখিক কমান্ডগুলি থেকে কীগুলি বের করার অনুমতি দেয়, এইভাবে লেটেন্সি উন্নত করে এবং নেটওয়ার্ক ব্যান্ডউইথ হ্রাস করে। কমান্ড আর্গুমেন্ট সম্পর্কে মেটাডেটা ক্লায়েন্টদের সার্ভার সংস্করণগুলির মধ্যে কমান্ডের সিনট্যাক্সের পরিবর্তনগুলি আবিষ্কার করতে এবং মানিয়ে নিতে দেয়। ক্লায়েন্টরা কমান্ড টিপস থেকে বিশেষ পরিস্থিতিতে কমান্ড চালানো এবং বিভিন্ন স্থাপনার ধরন সম্পর্কে আরও বেশি তথ্য পেতে পারে।
এই প্রচেষ্টার মধ্যে সার্ভারের কমান্ড টেবিলের প্রথম শ্রেণীর নাগরিকদের কাছে সাবকমান্ডের প্রচারও অন্তর্ভুক্ত ছিল। মূলত, এপিআই-এর ক্রমাগত ক্রমবর্ধমান কার্ডিনালিটির বিরুদ্ধে লড়াই করার জন্য রেডিসের সাথে সাবকমান্ডগুলি চালু করা হয়েছিল। যুক্তি ছিল যে প্রতিটি কাজের জন্য একটি নতুন কমান্ড যোগ করার পরিবর্তে, শুধুমাত্র একটি "অভিভাবক" কমান্ড কল করে সম্পর্কিত কাজগুলি আহ্বান করা হয়। "অভিভাবক" কমান্ডটি তার প্রথম যুক্তি হিসাবে সাবকমান্ডের নাম গ্রহণ করে, যা ফলস্বরূপ সম্পাদিত ক্রিয়াকে নির্দেশ করে। একটি প্রযুক্তিগত দৃষ্টিকোণ থেকে, সাবকমান্ডগুলি তাদের অভিভাবক কমান্ডের সমস্ত বৈশিষ্ট্য (যেমন, ACL বিভাগ, পতাকা পড়া/লেখা, কী স্পেসিফিকেশন, এবং আরও অনেক কিছু) উত্তরাধিকারসূত্রে পেয়েছে, যার ফলে তাদের বিভিন্ন আচরণের মধ্যে একটি সূক্ষ্ম পার্থক্য পাওয়া অসম্ভব।
উদাহরণ স্বরূপ, 'ক্লায়েন্ট' কমান্ড হল কানেকশন ম্যানেজমেন্ট টাস্কের জন্য একটি ক্যাচ-অল বাস্কেট যা 15 টিরও কম আলাদা সাবকমান্ডের গর্ব করে না। এর কিছু সাবকমান্ড, যেমন `ক্লায়েন্ট সেটনাম`, নিয়মিতভাবে সাধারণ ক্লায়েন্ট সংযোগ দ্বারা কল করা হয়, যেখানে অন্যদের যেমন `ক্লায়েন্ট কিল` এর অপব্যবহারের সম্ভাবনা রয়েছে এবং তাই শুধুমাত্র অ্যাডমিন ব্যবহারের জন্য সীমাবদ্ধ থাকা উচিত। রেডিসের পূর্ববর্তী সংস্করণগুলিতে অভ্যন্তরীণ পদ্ধতির অভাব ছিল যা এই ধরনের পার্থক্য তৈরি করতে সহায়তা করে, যার ফলে ডেভেলপারদের ডকুমেন্টেশনের দিকে পরিচালিত করে এবং বিভ্রান্তি তৈরি করে। Redis 7.0-এ, যাইহোক, প্রতিটি সাবকমান্ডের নিজস্ব বৈশিষ্ট্য রয়েছে, তার পিতামাতা বা ভাইবোন নির্বিশেষে, এটির সঠিক বর্ণনার অনুমতি দেয়৷
এই পোস্টটি পাঠ্যের বেশ প্রাচীর হিসাবে পরিণত হয়েছিল যা সম্ভবত এর শেষের দিকে খুব বেশি প্রযুক্তিগত বিশদে চলে যায় (যদি খুব বেশি প্রযুক্তিগত বিবরণের মতো জিনিস থাকে)। আমরা আশা করি যে এটি সমস্ত বিরক্তিকর ছিল না, এবং আমরা নতুন সংস্করণ এবং প্রকল্পে এটির জন্য কিছু আলোকপাত করেছি। আমরা সংস্করণের সাধারণ উপলভ্যতার দিকে চূড়ান্ত প্রকাশ প্রার্থী(দের) নিয়ে কাজ করছি, তবে সিরিজের আমাদের পরবর্তী পোস্টগুলির জন্য আমাদের সাথে থাকুন যা নতুন সংস্করণের সফর অব্যাহত রাখবে৷