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

প্রক্রিয়া বিভাজন এবং Redis দিয়ে আপনার সিস্টেম দক্ষতার সাথে স্কেল করুন: হাই-পারফরম্যান্স মেসেজিং

লেখক: Pramono Winata

আপনি কখনো একটি একক প্রক্রিয়া হ্যান্ডল করার চেষ্টায় সমস্যায় পড়েছেন যা খুব বড় বা ভারী? যদি হয়, তবে আমি আপনাকে বুঝতে সাহায্য করতে পারি কীভাবে এটি আরও ভালোভাবে ম্যানেজ করা যায়।

এই আর্টিকেলে আমি শেয়ার করব কীভাবে আমি বর্তমানে একটি একক মেসেজ ম্যানেজ করছি যা একটি একক প্রক্রিয়ায় প্রসেস করা যায় না কারণ এটি খুব বড়। আমি এটিকে আলাদা আলাদা চাঙ্কে ভাগ করেছি, যার ফলাফল আলাদা আলাদা প্রক্রিয়া।

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

সমস্যা

ফটো Unsplash-এ Danielle MacInnes দিয়ে

শायद আপনার মনে প্রথম প্রশ্ন যা আসে সেটি হলো কেন আমাদের একটি একক প্রক্রিয়াকে একাধিক কনকারেন্ট প্রক্রিয়ায় ভাগ করতে হয়?

এই কাজ করার জন্য অনেক কারণ থাকতে পারে। আমার কেসে, আমি এটি করেছি কারণ মেসেজটি খুব বড় ছিল।

আপনাকে আমার পরিস্থিতি সম্পর্কে কিছু ধারণা দেওয়ার জন্য, আমি এই সিম্পল ডায়াগ্রাম দিয়ে ব্রিফ করছি:

আমি একটি ভালো ডায়াগ্রাম মেকার নই, কিন্তু এটি পয়েন্টটি বুঝাতে পারবে

শব্দে সিম্পল করতে গেলে, দুটি আলাদা সার্ভিস কল্পনা করুন, সার্ভিস A এবং সার্ভিস B, এবং তাদের মাঝপথে একটি pubsub সার্ভিস।

আপনি যদি নিশ্চিত ন হন pubsub সার্ভিস কী, শুধু এটি একটি ব্রোকার হিসেবে ভাবুন যা একটি সার্ভিস থেকে অন্য সার্ভিসে মেসেজ পৌঁছাতে সাহায্য করে।

সার্ভিস A একটি মেসেজ পাবলিশ করবে এবং pubsub-এর মাধ্যমে, সার্ভিস B সেটি প্রসেস করবে। প্রসেসিং শেষ হলে, এটি আরেকটি প্রক্রিয়া করবে মেসেজটি প্রসেসড হয়েছে বলে মার্ক করার জন্য।

সিম্পল কি না?

শুধু কয়েকটা কেসে যখন মেসেজটি খুব বড়, সেটি সফলভাবে মেসেজ পাবলিশ করতে পারবে না pubsub সার্ভিসের লিমিটেশনগুলোর কারণে।

ঠিক আছে, এটি আপনাকে আমার সম্মুখীন সমস্যাগুলোর একটি ওভারভিউ দিতে পারবে। তো আমি এই সমস্যাটি কীভাবে ফিক্স করলাম? পরের সেকশনে, আমি আমার সমাধান দিয়ে আপনাকে বলব।

আমার প্রথম অপ্রোচ

ফটো Unsplash-এ Dose Media দিয়ে

আমার মনে আসা প্রথম জিনিস ছিল pubsub সার্ভিসের হ্যান্ডল করতে পারা সাইজ বাড়ানো, যা একটি সিঙ্গল কনফিগারেশন চেঞ্জ দিয়ে করা যায়।

কিন্তু লাইফ তত সহজ হলে মজা থাকবে না ঠিক? যদি মেসেজ বড় হতে থাকে? কি আমরা pubsub-এর সাইজ বাড়ाते থাকব?

দেখতে পেলাম তা করলে অনেক স্কেলেবিলিটি ইস্যু হতে পারে। লং টার্ম সমাধানের জন্য ভালো নয়।

তারপর আমি আরেকটি সমাধান ভাবলাম যা আমি মনে করলাম সমাধান করতে পারে: আমি মেসেজটি একাধিক মেসেজে ভাগ করলাম এবং সেই পার্টগুলো আলাদা আলাদা প্রসেস করার চেষ্টা করলাম।

এখন, সিস্টেমটি এরকম দেখাচ্ছে:

আমার আপডেটেড সিস্টেম/প্রক্রিয়া

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

আমার কেসে, আমার মেসেজ আসলে আইটেমের একটি লিস্ট ধারণ করে তাই আমি প্রতিটি আইটেম দিয়ে এটিকে ভাগ করতে পারি।

মান লিন ১০টি আইটেম আছে। পূর্বে, এটি সব ১০টি আইটেম একই মেসেজে পাবলিশ করত। কিন্তু এখন মেসেজটি ভাগ করার পর, এটি সেই মেসেজকে ১০টি মেসেজে রূপান্তর করবে।

এটি একটি একক প্রক্রিয়াকে একসাথে একাধিক প্রক্রিয়ায় রূপান্তর করে। একটি একক পাবলিশ ১০টি পাবলিশে রূপান্তর হয় যেটি সেটি একক প্রক্রিয়াকে ১০টি প্রক্রিয়ায় রূপান্তর করে।

এটি আপনাকে আদর্শ নাও লাগতে পারে যখন আপনি এভাবে দেখেন, কিন্তু এটি সেরা সমাধান যা আমি খুঁজে পেরেছি এবং নিশ্চিতভাবে এটি কাজ করে।

শুধু এটিই কি, শুধু ভাগ করা?

নয় – মনে রাখুন সেই ফাইনাল অংশটি যেখানে এটি প্রক্রিয়াটি ফিনিশড হিসেবে মার্ক করে?
যদি হয়, তবে আপনি চিন্তা করতে পারেন কেন সেই অংশটি আমার নতুন ডায়াগ্রাম থেকে অনুপস্থিত।

চিন্তা করবেন না – আমি ভুলে গেছি এমন নয়। আমি ইচ্ছাকৃতভাবে এটিকে পরবর্তী অংশের জন্য বাদ দিয়েছি।

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

ফিনিশিং প্রক্রিয়া হ্যান্ডল কীভাবে করবেন

ফটো Unsplash-এ James Wainscoat দিয়ে

তো কীভাবে আমি সঠিকভাবে জানি প্রক্রিয়াটি ফিনিশ হয়েছে, যেহেতু সেই প্রক্রিয়াগুলো কনকারেন্টলি হচ্ছে?

আমি যে সমাধানটি ভাবলাম সেটি হলো প্রক্রিয়া করার প্রয়োজনীয় সংখ্যা সংরক্ষণ করা এবং প্রতিবার একটি প্রক্রিয়া ফিনিশ হলে এটি ডিক্রিমেন্ট করা। এইভাবে আমরা জানতে পারব শেষ প্রক্রিয়াটি ফিনিশ হয়েছে কিনা।

এটি শোনায় খুব সহজ, যতক্ষণ না আমাদের একটি विश्वস্ত জায়গা থাকে সেটি সংরক্ষণ করার জন্য।
আসলে এর জন্য প্রচুর অপশন আছে। उनमें से একটি হলো Redis, এবং আমি এখানে আমার সমস্যা সমাধানের জন্য সেটি ব্যবহার করছি।

আপনি যদি Redis-র সাথে পরিচিত ন হন, তবে এটি সাধারণত একটি ক্যাশ হিসেবে ব্যবহৃত হয় এমন একটি সার্ভিস।

আমরা আমাদের Redis মেকানিজম এইভাবে ম্যানেজ করব:

প্রক্রিয়া মার্ক করার জন্য Redis যোগ করা

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

আমার কেসে, যেহেতু আমি একটি লিস্ট পাবলিশ করছি, আমি সহজে আমার লিস্টের দৈর্ঘ্যকে আমার ইন্সিয়াল কাউন্টার হিসেবে রাখতে পারি। এবং কাউন্টারের জন্য, আমি প্রতিবার এক কমাতে পারি যখন একটি প্রক্রিয়া ফিনিশ হয়। তারপর আমি সহজে জানতে পারব আমার সব প্রক্রিয়া ফিনিশ হয়েছে কিনা শুধু আমার Redis কাউন্টার রেফার করে। যদি এটি ০-এ পৌঁছায়, এর মানে আমি নিরাপদে মার্ক করতে পারি যে আমার সব প্রক্রিয়া সম্পন্ন।

উপসংহার

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

উপরে বর্ণিত সমাধানটি সবসময় একটি সিলভার বুলেট হবে না যখন আপনার একটি খুব বড় মেসেজ প্রসেস করার সমস্যা আছে। অন্যান্য উপায়ও আছে যেমন আপনার মেসেজ স্ট্রিমিং করা, কিন্তু সেটি আরেকদিনের কথা।

আমার আর্টিকেল শেষ পর্যন্ত পড়ার জন্য ধন্যবাদ! আমি সারীরে আশা করি আপনি উপভোগ করেছেন এবং আমার আর্টিকেল আপনাকে আকর্ষণীয় এবং, সবচেয়ে গুরুত্বপূর্ণভাবে, উপকারী লাগল।

  1. HTML cancelable ইভেন্ট প্রোপার্টি

  2. পাইথনে ৮-পাজল সমাধানের জন্য প্রয়োজনীয় ধাপের সংখ্যা খুঁজে বের করার প্রোগ্রাম

  3. জাভাস্ক্রিপ্ট অবজেক্ট প্রপার্টি যোগ, অ্যাক্সেস এবং ডিলিট করার পদ্ধতি

  4. Tkinter Listbox-এ নির্দিষ্ট আইটেম সরাসরি মডিফাই করার পদ্ধতি