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

উচ্চuptime Redis ক্লাস্টারেเช่น PUBSUB এবং ব্লকিং লিস্ট অপারেশন নিশ্চিত করা

স্ট্যান্ডার্ড রিডান্ডান্ট Redis সমাধান হলো মাস্টার/স্লেভ রেপ্লিকেশন চালানো Sentinel-র সাথে ফেইলওভার ম্যানেজ করার জন্য। এর আশা করা হয় সেটি ফলো করা হবে either a) ক্লায়েন্ট সাপোর্ট এবং Sentinel ব্যবহার করে কারেন্ট মাস্টার ডিসকভার করতে বা b) Redis পডের সামনে একটি TCP প্রক্সি যেটি Sentinel-র ידי ম্যানেজ হয় মাস্টারকে পয়েন্ট করার জন্য। 前者 হলো Redis Sentinel ডিজাইন করা হয়েছে এবং পরেরটি একটি বর্ধমান ট্রেন্ড — এবং ObjectRocket Redis কনফিগার করা হয়েছে এইভাবে।

Redis-এ কমান্ডের ওপর ফেইলওভারের প্রভাব

Redis অপারেশনের অধিকাংশের জন্য এটি প্রত্যাশা অনুযায়ী কাজ করে। একটি ফেইলওভারে ক্লায়েন্ট কোড এক্সপেক্টেড হয় কানেকশন ফেইল হয়েছে সেটি ডিটেক্ট করতে এবং either a) কারেন্ট মাস্টার লুক আপ করতে এবং রিকানেক্ট করা বা b) উপরে মেনশন করা সিনেরিওর ভিত্তিতে রিকানেক্ট আটেম্পট করা। প্রক্সি-ভিত্তিক সিনেরিওও একটি Redis সার্ভার রিস্টার্টের সমান তাই এটি সিঙ্গেল ইনস্ট্যান্স Redis-ও ápplicable যা রিস্টার্ট করা যেতে পারে।

যাইহোক, Redis কমান্ডের একটি ছোট হাতফুল লং-টার্ম ব্লকিং বা নন-অ্যাটমিক। PUBSUB subscribe এবং psubscribe কমান্ডগুলো নন-অ্যাটমিক যেহেতু কমান্ডটি রেজিস্টার করে তার রিকোয়েস্ট যেকোনো মেসেজ যেটি দেয়া চ্যানেল(গুলো)এ পাবলিশ হয় সেটিও পাঠাতে, কিন্তু আসল ডেটা অনেক পরে আসতে পারে — অর্থাৎ পাবলিশ হওয়ার পর। BL* কমান্ডগুলো লং-টার্ম এবং টু-ফেজ কমান্ড যেহেতু subscribe কমান্ডের মত সেগুলো ব্লক করে এবং রিটার্ন করে না যতক্ষণ না একটি আইটেম লিস্টে উপলব্ধ হয় রিমুভ হওয়ার জন্য।

এই কমান্ডগুলোর একটি কী কমনালিটি হলো সেগুলো ইস্যু হয় এবং সার্ভারে একটি রেজিস্ট্রেশনের ফর্ম হয়, কিন্তু ডেটা পরে আসতে পারে। কমান্ড ইস্যু হওয়ার মধ্যে এবং সার্ভার ডেটা রিপ্লাই করার জন্য পাওয়ার মধ্যে ফেইলওভার এবং রিস্টার্ট হতে পারে। রিস্টার্ট বা ফেইলওভার কেসে "রেজিস্ট্রেশন" আর সার্ভারে থাকে না। এটা আমাদেরকে প্রশ্নের দিকে নিয়ে আসে যে এই কমান্ডগুলো এই সিনেরিওতে কী ঘটে।

সেগুলোর ডিটেইলে যাওয়ার আগে আরেকটি দিক নিয়ে আসা যাক কারণ এটা টেস্টিং-এ কাজ করবে এবং ফলাফল এবং কীভাবে ফেইলওভার সিনেরিওর জন্য কোড করবেন সেটি 위에 ড্রামেটিক ইফেক্ট ফেলে। আসলে দুটি টাইপের ফেইলওভার রয়েছে। আছে সেই ফেইলওভার যেটি আমরা অধিকাংশ কনসিডার করি — মাস্টার হার। এই টাইপের ফেইলওভারে মাস্টার নন-রেসপন্সিভ। আমি এটিকে "ট্রিগারড ফেইলওভার" বলে রেফার করি। দ্বিতীয় ক্লাস ফেইলওভার আমি "ইনিশিয়েটেড ফেইলওভার" বলে রেফার করি।

ইনিশিয়েটেড ফেইলওভার ঘটে যখন একটি অ্যাডমিনিস্ট্রেটর sentinel failover কমান্ড পাঠায় একটি Sentinel-কে যা তারপর পড রিকনফিগার করে, একটি মাস্টার প্রমোট করে তারপর আসল মাস্টার ডিমোট করে। সারফেসে এই দুটি সিনেরিও একই দেখে। অধিকাংশ Redis কমান্ডের কেসে সেগুলোকে আইডেন্টিক্যালি ট্রিট করা যায়। যাইহোক, আমাদের লং-ব্লক কমান্ডের কেসে সেগুলোকে তাদের নিজস্ব কনটেক্সটে বুঝতে হবে।

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

এখানে আলোচনা করা টেকনিক এবং সিনেরিও জেনারেলি বর্ণনা করা হবে এবং Python Redis লাইব্রেরি "redis-py" ব্যবহার করে ডেমোনস্ট্রেট করা হবে, কিন্তু যেকোনো ক্লায়েন্ট লাইব্রেরির জন্য প্রযোজ্য। ব্যাকগ্রাউন্ড হাতে, আসুন এখন দেখি কীভাবে এটি লং-ব্লক কমান্ডের ব্যবহারকে প্রভাবিত করে। প্রথম PUBSUB-কে দেখি।

PUBSUB

Redis PUBSUB তিনটি কমান্ড নিয়ে গঠিত: PUBLISH, SUBSCRIBE, এবং PSUBSCRIBE। প্রথম কমান্ডটি একটি মেসেজ পাবলিশ করতে ব্যবহৃত হয় যেখানে শেষ দুটি পাবলিশ কমান্ড দিয়ে পাবলিশ করা মেসেজ রেজিস্টার এবং রিসিভ করার জন্য ব্যবহৃত হয়। প্রথম, আসুন দেখা যাক একটি PUBLISH কমান্ডে কী ঘটে।

আপনি যখন PUBLISH এক্সিকিউট করেন এটি মেসেজটি দেয়া চ্যানেলে ইমিডিয়েটলি পাবলিশ করে এবং ক্লায়েন্টের সংখ্যা রিটার্ন করে যারা সেটি রিসিভ করেছে। কোনভাবে একটি ফেইলওভার সিনেরিও এটিকে রিলেভেন্সে আনবে? ফেইলওভার কেস কনসিডার করুন। ক্লায়েন্টকে রিকানেক্ট করতে হবে যেহেতু TCP কানেকশন চলে যায়। প্রক্সি-তে কথা বললে এটি ডিরেক্ট রিকানেক্ট করবে এবং একটি ভিন্ন সার্ভার পাবে। Sentinel ডিসকভারি করলে এটি একটু বেশি টাইম নেবে এবং এখনও একটি ভিন্ন সার্ভারের সাথে কানেক্ট হবে। ইস্যু থাকে টাইমিং-এ। যদি পাবলিশার নতুন সার্ভারের সাথে কানেক্ট করলে যেকোনো সাবস্ক্রাইবারের আগে, মেসেজটি হারিয়ে যাবে — লост। কিন্তু এটা কি হতে পারে? সেটি বুঝতে আমরা SUBSCRIBE কমান্ডগুলোর দিকে তাকাই।

আপনার কোড যখন একটি সাবস্ক্রাইব কমান্ড ইস্যু করে সার্ভার তার ইন-মেমরি ডেটা স্ট্রাকচারসে রেজিস্টার করে যে সেই স্পেসিফিক কানেকশনটি দেয়া চ্যানেল(গুলো)এ মেসেজ পাবে। এই ইনফরমেশন স্লেভস tarafে প্রপাগেট হয় না। তাই যখন একটি ফেইলওভার হয় এবং ক্লায়েন্ট রিকানেক্ট করে এটি অবশ্যই সাবস্ক্রাইব কমান্ড রি-ইস্যু করতে হবে। অন্যথায় নতুন সার্ভার জানতে পারবে না যে সেই নির্দিষ্ট কানেকশনটি নির্দিষ্ট মেসেজ রিসিভ করতে হবে। এখন আমাদের কাছে স্পষ্ট পোটেনশিয়াল রয়েছে একটি সাবস্ক্রাইবার নতুন মাস্টারের সাথে রিকানেক্ট করার পাবলিশারের পর। মেসেজ লসের কন্ডিশনগুলো এখন এক্সিস্ট করে। তাই কীভাবে মিনিমাইজ বা প্রিভেন্ট করবেন? কয়েকটি অপশন রয়েছে।

প্রথমে পাবলিশার এই फैक्टকে লিভারেজ করতে পারে যে PUBLISH সেস ক্লায়েন্টের সংখ্যা রিটার্ন করে যারা সেটি রিসিভ করেছে। যদি শূন্য ক্লায়েন্ট রিসিভ করে, পাবলিশার রিট্রাই করতে পারে। সিস্টেম যেখানে এটি একটি স্ট্যাটিক নম্বর সাবস্ক্রাইবারের বা যেখানে "কমপক্ষে এক সাবস্ক্রাইবার" যথেষ্ট সেটি মেসেজ লস প্রিভেন্ট করবে। সিস্টেম যেগুলো এই ক্রাইটেরিয়া মিট করে না, তাদের জন্য আরেকটি, যদিও কম রবাস্ট, অপশন রয়েছে।

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

তৃতীয় অপশন যা আমি প্রেজেন্ট করব এই রেস কন্ডিশন মিটিগেট করার জন্য হলো একটি লক মেকানিজম বিল্ড ইন করা। এটি নিশ্চিতভাবে সবচেয়ে কমপ্লেক্স রুট কারণ এটিকে একটি মেকানিজম বিল্ড বা এমপ্লয় করা লাগে যা পাবলিশারদের পাবলিশ করা থেকে বাধা দেয় যতক্ষণ না ক্লায়েন্ট কানেক্ট হয়। বেসিক প্রসেস হলো কিছু ফর্ম অফ শেয়ার্ড লোকেশন (যেমন Zookeeper, একটি ডেটাবেস, Consul, ইত্যাদি) যেখানে সাবস্ক্রাইবাররা রেজিস্টার করে যে তারা রিসিভ করার জন্য রেডি এবং পাবলিশাররা ভ্যালিড এবং রেডি সাবস্ক্রাইবার চেক করে মেসেজ পাবলিশ করার আগে। আরও কমপ্লেক্সিটি অ্যাড করতে সাবস্ক্রাইবারদের "আনসেট" করতে হবে তাদের সেলফ এই মেকানিজমে যখন তারা TCP কানেকশন হারায়।

ইसे কল আউট করা দরকার যে এটা সব ট্রিগারড ফেইলওভার জন্য। এটি কাজ করবে কারণ মাস্টার নন-রেসপন্সিভ তাই কোনো মেসেজ সেটি যাবে না। ইনিশিয়েটেড ফেইলওভার সিনেরিওতে (যা হতে পারে সিস্টেম মেইনটেনেন্সের সময়) আপনার সেরা বাট্রেসিং ইফেক্ট হলো প্রথম এবং দ্বিতীয় অপশন দুটোই এমপ্লয় করা, এবং এক্সেপ্ট করা যে মেসেজ লস হতে পারে। কতটুকু মেসেজ লস সম্পূর্ণভাবে আপনার পাবলিশিং শিডিউলের ওপর নির্ভর করে। আপনি যদি গড়ে প্রতি কয়েক মিনিটে একটি মেসেজ পাবলিশ করেন আপনার আসলে লস উইন্ডো এনকাউন্টার করার খুব ছোট চান্স রয়েছে। যত বড় পাবলিশিং ইন্টারভাল তত ছোট রিস্ক। অন্যদিকে আপনি যদি প্রতি সেকেন্ডে সैंकড হাজার মেসেজ পাবলিশ করেন আপনি নিশ্চিতভাবে কিছু লস করবেন। ম্যানেজড প্রক্সি সিনেরিওতে এটি নির্ভর করবে কত দ্রুত ফেইলওভার কমপ্লিট হয় আপনার প্রক্সিতে। ObjectRocket-এর Redis প্ল্যাটফর্মের জন্য এই উইন্ডো ১.৫ সেকেন্ড পর্যন্ত।

অসwegen ইন্টারভালের ওপর একটি অপ্রোচ, যা লিমিটে ফেইল করে, হলো সাবস্ক্রাইবাররা চেষ্টা করুন রিকানেক্ট করার ইন্টারভাল আপনার পাবলিশিং ইন্টারভালের 1/3d। তাই আপনি যদি প্রতি মিনিটে একটি মেসেজ পাবলিশ করেন, তাহলে আপনার সাবস্ক্রাইবার কোড/কনফিগার করুন কমপক্ষে প্রতি ২০ সেকেন্ডে রিকানেক্ট করার জন্য এবং আপনার পাবলিশার প্রতি এক বা দুই মিনিটে। যেন পাবলিশিং ইন্টারভাল ৩ সেকেন্ডের কাছে আসে এটি হার্ডার হয় অর্জন করা একটি ফেইলওভার রিকানেক্ট প্রসেস (লুকআপস, TCP হ্যান্ডশেক, AUTH, SUBSCRIBE, ইত্যাদি) সহজেই কয়েক সেকেন্ড টোটাল করতে পারে।

BLPOP এবং বন্ধুরা

এটি আমাদের নিয়ে আসে কীভাবে ব্লকিং লিস্ট কমান্ডগুলো অপারেট করে এই কন্ডিশনগুলোর আন্ডারে। খবর এখানে পাবলিশিং-র চেয়ে ভালো। এই কেসে আমরা ডেটা স্ট্রাকচার মডিফাই করছি যেগুলো রেপ্লিকেটেড। এরপরে, কারণ এগুলো ডেটা স্ট্রাকচার মডিফিকেশন, আমাদের রিকানেক্টের অর্ডারের কারণে লост মেসেজের সেম লেভেল রিস্ক নেই। প্রডিউসার যদি কনসিউমারের আগে রিকানেক্ট করে তবে এক্সপেক্টেড বিহেভিয়রে কোনো চেঞ্জ নেই। প্রডিউসার আইটেমটি লিস্টে পুশ করবে (অথবা পপ এবং পুশ) এবং একবার কনসিউমার কানেক্ট হলে ডেটা সেখানে থাকবে। এক এক্সেপশন ছাড়া।

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

একজন ওয়ার্কার BRPOPLPUSH করছে সেটির কেসে, রেজাল্ট হবে এমন যে আইটেমটি যেটি মুভ করা হচ্ছে সেটি "ব্যাক" থাকবে এর আসল পজিশনে ফেইলওভারের পর। BLPOP কেসে রেজাল্ট আসলে সেম হবে। ফেইলওভার কমপ্লিট হওয়ার পর আইটেমটি আবার কিউড দেখাবে। আপনার আইটেমগুলো যদি ইডেমপটেন্ট জবস হয়, এটি কোনো ইস্যু নয়। নন-ইডেমপটেন্ট জবসের কেসে আপনি কত ডিফেন্সিভ কোডিং করবেন সেটি নির্ভর করবে একটি জব ডাবল রান বা আইটেম ডাবল প্রসেসড হওয়ার ইফেক্ট ওপর ফ্যাক্টর ইন করে আপনি কত ঘন ঘন মডিফিকেশন করছেন এবং এটিই সেই সিনেরিও এনকাউন্টার করার লikelihоড। এটাও নোট করা উচিত যেহেতু এটি শুধু ঘটে ইনিশিয়েটেড ফেইলওভার ইভেন্টে এটি কিছুটা অপারেশনাল কন্ট্রোলে থাকা উচিত এবং আমি পরামর্শ দেব যেন মেইনটেনেন্স করা হয় এমন সময়ে আপনার সিস্টেম সবচেয়ে কম ইউজে থাকে মিনিমাইজ বা এমনকি এলিমিনেট করতে এই পসিবিলিটি।

ট্রিগারড ফেইলওভার কেসে ডেটা লসের কোনো এক্সপেক্টেশন নেই। একটি ট্রিগারড ফেইলওভার ঘটে যখন মাস্টার আনরেসপন্সিভ, তাই মাস্টারে কোনো মডিফিকেশন হচ্ছে না। যাইহোক, এই প্রতিটি সিনেরিওর মত এখানেও TCP রিকানেক্ট হ্যান্ডল করার বিষয়টি রয়েছে যা যেকোনো ফেইলওভার সিনেরিওতে ম্যান্ডেটরি।

ক্লায়েন্ট রিকানেকশনস

উভয় ফেইলওভার সিনেরিওতে, ট্রিগারড বা ইনিশিয়েটেড, ক্লায়েন্টকে ডিটেক্ট এবং রিকানেক্ট করতে হবে — either Sentinel লুকআপের পর বা একই অ্যাড্রেসে সংক্ষিপ্ত উইন্ডো। ObjectRocket Redis-এর কেসে যা একটি ম্যানেজড প্রক্সি লেয়ার ব্যবহার করে ক্লায়েন্ট শুধু রিকানেক্ট করবে। আসল ফেইলওভার প্রসেস নিজে টেক করতে পারে অপ টু টু সেকেন্ড কমপ্লিট হতে। তাই ক্লায়েন্ট কোড সেটি অ্যাকাউন্ট করতে হবে। আদর্শভাবে একটি ইমিডিয়েট রিট্রাই হওয়া উচিত নেটওয়ার্ক ব্লিপ হ্যান্ডেল করতে যেখানে একটি কানেকশন সিম্পলি ড্রপ হয় কোথাও রুটের সাথে। যাইহোক এটি এক্সকোম্পানি করা উচিত একটি ব্যাক অফ অ্যালগরিদম সাথে রিট্রাইস সহ সার্ভার রিস্টার্টের মত কেসের জন্য (যে হয় স্ট্রান্ডঅ্যালোন Redis রিস্টার্টে বা প্রক্সি রিস্টার্টে)।

রিকানেক্টের ওপর যেকোনো সাবস্ক্রাইবারকে রি-সাবস্ক্রাইব করতে হবে কারণ রিকোয়েস্ট চ্যানেল এবং নতুন TCP কানেকশনের লিংক স্থাপন করতে হবে। যেহেতু Redis PUBSUB চ্যানেল তৈরি হয় যখন কখনো একটি সাবস্ক্রাইবার বা পাবলিশার চেষ্টা করে সেগুলো অ্যাক্সেস করতে, চ্যানেল "রিক্রিয়েট" করার কোনো প্রয়োজন নেই।

এটি আমাদের নিয়ে আসে কীভাবে এটি করবেন। উত্তর অত্যন্ত নির্ভরশীল ক্লায়েন্ট লাইব্রেরি যা ব্যবহার করা হচ্ছে এবং কীভাবে সেটি ডিসকানেক্ট হ্যান্ডেল করে। একটি আদর্শ সিনেরিওতে কানেকশন কনফিগারেবল হবে অটোমেটিক রিট্রাই জন্য এক أل্টিমেট ফেইলওভার রিটার্নড যদি বাউন্ডরিজ মেট হয়। এ পর্যন্ত আমি কয়েক লাইব্রেরি টেস্ট করেছি কীভাবে সেগুলো ডিসকানেক্ট হ্যান্ডেল করে এবং এটি ড্রামেটিক্যালি ভেরিয় করে। এখানে আমি একটি কমনটি ডিসকাস করব: redis-py।

প্রথম ভালো খবর হলো redis-py ডিসকানেক্ট হলে রিট্রাই করার দিক দেখাচ্ছে। দুর্ভাগ্যক্রমে এটি ইমিডিয়েটলি রিট্রাই করে, এবং এটিই টু কুইক টু রিলায়াবলি রিকভার কানেকশন ফেইলওভার চলাকালীন। மேலும் এমন দিক থেকে কোনো উপায় নেই এটি কনফিগার করার। ফলস্বরূপ আপনার কোডকে ফেইলড রিকানেক্ট আটেম্পট ক্যাচ/ডিটেক্ট করতে হবে এবং রিকানেক্ট নিজে ম্যানেজ করতে হবে।

প্রথম আমরা কিছু স্ট্যান্ডার্ড redis-py পাবলিশার এবং সাবস্ক্রাইবার কোড ব্লক পরীক্ষা করি:

### Publisher example code
r.publish(channel,message)

### Subscriber example code
p = r.pubsub()
p.subscribe(channel)
for item in p.listen():
    # do stuff with message (item)

এটি ফেরি স্ট্রেটফরওয়ার্ড। যাইহোক, যখন ইমিডিয়েট রিট্রাই সাবস্ক্রাইবারের for-লুপে ফেইল হয় আপনি একটি redis.ConnectionError এক্সেপশন থ্রোন পাবেন। ট্রিকি বিট হলো এটি ঘটে "ইনসাইড" for item in p.listen() লাইন। তাই সেটি প্রপারলি ক্যাচ করতে আপনাকে পুরো for স্টেটমেন্টকে একটি try/except ব্লকে র‍্যাপ করতে হবে। এটি প্রাব্লেম্যাটিক বেস্ট এবং অপ্রয়োজনীয় কোড কমপ্লেক্সিটি লেড করে।

একটি অল্টারনেটিভ রুট হলো নিচেরটি করা।

### Publisher example code
p = r.pubsub()
p.subscribe(channel)
while True:
    try:
        message = p.get_message()
    except redis.ConnectionError:
        # Do reconnection attempts here such as sleeping and retrying
        p = r.pubsub()
        p.subscribe(channel)
    if message:
        # do something with the message
    time.sleep(0.001) # be nice to the system :)

এই মেথডে আমরা get_message() ডিরেক্ট কল করি যা আমাদের এক্সেপশন ক্যাচ করতে দেয় সেটি পয়েন্টে এবং 'p' অবজেক্টের কানেকশন রি-এস্টাবলিশ করতে। স্লিপ করার পরিমাণ, যদি থাকে, আপনার কোডের রিকোয়ারমেন্টের ওপর নির্ভর। অবশ্যই আপনার সাবস্ক্রাইবার যদি একস্পেক্ট করে একটি নির্দিষ্ট সংখ্যক মেসেজ হ্যান্ডেল করতে এবং for-লুপ ভালো কাজ করে, সেটি এখনও কাজ করবে। পাবলিশারদের জন্য কোডটি সিম্পলার কারণ এটি সাধারণত একটি ইটারেটরে রান করা হয় না।

### Publisher example code
while True:
    try:
        rcvd = r.publish(channel,message)
        if rcvd >0:
            break
    except redis.ConnectionError:
        # handle reconnect attempts

এই মেথডে আপনার কন্ট্রোল রয়েছে কি, কখন, এবং কত ঘন ঘন রিট্রাই করবেন। এটি ক্রিটিক্যাল ট্রান্সপারেন্টলি ফেইলওভার ইভেন্ট প্রপারলি হ্যান্ডেল করার জন্য। নোট করুন এটি একই জিনিস হবে যদি কোড Sentinel ডিরেক্টলি ব্যবহার করত বা এমনকি যদি প্রশ্নে থাকা Redis সার্ভার রিস্টার্ট হত। তাই আসলে সকল পাবলিশিং কোড এই বেসিক মেকানিজম ফলো করা উচিত।

ব্লকিং লিস্ট কমান্ড যেমন BLPOP-এর জন্য, ক্লায়েন্ট রিকানেকশনের অর্ডার স্ট্রিক্টলি ইম্পোর্ট্যান্ট নয় কারণ ডেটা পারসিস্টেড। উপরে বর্ণিত try/except মেথডটি দরকার হবে কানেকশন রি-এস্টাবলিশ করার জন্য যখন কমান্ড এক্সিকিউশন রেজাল্টে একটি "redis.ConnectionError" এক্সেপশন থ্রোন হয়।

redis-py স্পেসিফিক্যালি ObjectRocket Redis প্ল্যাটফর্মের বিপরীতে এই টেকনিকগুলো ব্যবহার করে একটি রিট্রাই উইন্ডো ৩ সেকেন্ড ধরে নিশ্চিত করে যে ট্রিগারড ফেইলওভারের জন্য কোনো ডেটা লস এক্সপেক্টেশন নেই, এবং প্রায় ১.৫ সেকেন্ড পটেনশিয়াল মেসেজ লস নন-স্টপ পাবলিশারদের জন্য ইনিশিয়েটেড ফেইলওভার время যেমন ভার্টিক্যাল রিসাইজ ইনস্ট্যান্স সময়।

যদিও কোড উদাহরণগুলো redis-py-স্পেসিফিক, বেসিক টেকনিকগুলো যেকোনো ক্লায়েন্ট কোডের সাথে ব্যবহার করা উচিত যেটি সার্ভার রিকানেক্ট হ্যান্ডেল করতে হবে এবং PUBSUB কমান্ড বা ব্লকিং লিস্ট অপারেশন ব্যবহার করে। এই জ্ঞান দিয়ে আপনি এখন এই টেকনিকগুলো ইমপ্লিমেন্ট করতে পারেন একটি হাইলি অবেইলেবল Redis পড ব্যবহার করতে এবং জানতে পারেন আপনার অ্যাপ্লিকেশন ফেইলওভার হ্যান্ডেল করতে পারে আপনার অপস টিমকে রাতের মাঝপথে জেগিয়ে ছাড়া।

  1. রেডিস লিস্ট অপারেশন মাস্টার করুন: লিস্ট মান পরিচালনার কী কমান্ডসমূহ

  2. Mac Terminal মास্টার করুন: মূল কমান্ড ও ইনসাইডার ট্রিকস – ২০২৪ সংস্করণ

  3. Discord কমান্ডের সম্পূর্ণ গাইড: দক্ষতা ও মডারেশন বাড়ান

  4. উইন্ডোজ ১১ রান কমান্ডে দক্ষ হন: চিট শিট