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

AWS-এ Sidekiq স্কেলিং: একটি প্র্যাক্টিক্যাল গাইড

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

আমরা কীভাবে স্কেল করি

আমাদের প্রসেসিং পাইপলাইন Sidekiq-র ওপর ব্যাপকভাবে নির্ভরশীল, যা আমাদের জন্য রক-সলিড (rock-solid) সাবিত হয়েছে। পাইপলাইনের অধিকাংশ কাজ একটি অটোস্কেলিং গ্রুপের ইনস্ট্যান্সগুলো হ্যান্ডেল করে। Sidekiq ব্যাকলগ বাড়লে, একটি CloudWatch অ্যালার্ম ট্রিগার হয়, যা এই গ্রুপে নতুন ইনস্ট্যান্স শুরু করে। ট্রাফিক কমলে এবং ব্যাকলগ গেলে, ইনস্ট্যান্সগুলো টার্মিনেট হয়।

স্টাইলেও স্কেলিং

এই সেটআপে একমাত্র সমস্যা হলো আমরা নিশ্চিত করতে চাই Sidekiq ওয়ার্কাররা ইনস্ট্যান্স টার্মিনেট হওয়ার আগে তাদের সारा কাজ শেষ করে ফেলে। Sidekiq জব রি-শিডিউল সাপোর্ট করে যেগুলো সমাপ্তির আগে টার্মিনেট হয়, কিন্তু আমরা এটা এড়াতে চাই—একটা জব রি-শিডিউল করে রিস্টার্ট করার চেয়ে কিছু একসেকেন্ড একসট্রা নিয়ে জবটি ফিনিশ করা ভালো। সৌভাগ্যবশত, Sidekiq-র আউটস্ট্যান্ডিং ফিচারের মধ্যে একটি হলো ওয়ার্কার প্রসেসকে বোঝাতে পারা যে বর্তমান জব সমাপ্তির পর নতুন জব গ্রহণ করা উচিত নয়, যাতে টার্মিনেশনের আগে ওয়ার্কার ড্রেইন করা সহজ হয়। চ্যালেঞ্জ হলো ওয়ার্কারদের জানানো যে ড্রেইনিং শুরু করতে হবে—এবং এর জন্য আমরা Lifecycle Hooks, CloudWatch Events + Lambda, EC2 Simple Systems Manager (SSM), এবং কিছু কোডের কম্বিনেশন ব্যবহার করি।

এই পোস্টের বাকি অংশে দেখাব কিভাবে আপনি আমাদের সেটআপ কপি করে ইনস্ট্যান্সগুলোর শান্তিপূর্ণ টার্মিনেশন পেতে পারেন।

প্রেরিকুইসাইটস

আপনার একটি অটোস্কেলিং গ্রুপ থাকতে হবে যার স্কেলিং পলিসি আপনার ডিফাইন করা নিয়ম অনুযায়ী ইনস্ট্যান্স টার্মিনেট করে। তার পাশাপাশি, আপনার ইনস্ট্যান্সগুলোতে SSM Agent রান করা থাকতে হবে এবং SSM অ্যাক্সেস সহ একটি রোল থাকতে হবে। এই ইনস্ট্যান্সগুলোর অটোস্কেলিং API-এর সাথে ইন্টারঅ্যাক্ট করার পারমিশনও থাকতে হবে। ইন্সট্যান্স রোলের জন্য একটি পলিসি ডকুমেন্ট:

কোড

এই আইটেমগুলো সেটাপ হলে, আপনি পিসগুলো জোড়া দিতে শুরু করতে পারেন। আমরা প্রক্রিয়ার শেষ থেকে শুরু করব—আমাদের স্ক্রিপ্টগুলো যা ইনস্ট্যান্সে থাকবে এবং Sidekiq ড্রেইনিং হ্যান্ডেল করবে—এবং পিছনে যাব। প্রথমে, ওয়ার্কারদের কোয়েট (quiet) করে তাদের কাজ শেষ হওয়ার জন্য অপেক্ষা করার রুবি কোড:

Sidekiq API ব্যবহার করে করেন্ট ইনস্ট্যান্সে চলমান Sidekiq প্রসেসগুলোর তালিকা পেয়ে, তাদের নতুন কাজ গ্রহণ বন্ধ করতে বলা, এবং তারপর সব প্রসেসে একটিভ জব না থাকা পর্যন্ত অপেক্ষা করা।

এখানে শেল স্ক্রিপ্টটি দেওয়া হলো যা ইনস্ট্যান্স টার্মিনেট করার সময় স্ক্রিপ্টটি ট্রিগার করবে:

এই স্ক্রিপ্টের মূল অংশ লাইন ৮ থেকে শুরু হয়। প্রথমে আমরা অটোস্কেলিং গ্রুপকে সিগন্যাল দিই যে আমরা লাইফসাইকেল হুকে কাজ করছি। এর একটি সাইড-ইফেক্ট হলো এটি একটি গার্ড—যদি এই ইনস্ট্যান্স অটোস্কেলিং গ্রুপ দ্বারা টার্মিনেশনের জন্য শিডিউল না করা থাকে, তবে এই কমান্ড ফেইল করবে, এবং ওয়ার্কার শাটডাউন স্ক্রিপ্ট ইনভোক হবে না। এই স্ক্রিপ্ট টার্মিনেশন শিডিউল না করা ইনস্ট্যান্সে কল হওয়া উচিত নয়, কিন্তু একটু ডিফেনসিভ হওয়া কোনো ক্ষতি করে না। :) ধরে নিই আমরা आगे বাড়ছি, আমরা ওয়ার্কারদের শাটডাউন করি, এবং তারপর অটোস্কেলিং গ্রুপকে টার্মিনেশন চালিয়ে যাওয়ার অনুমতি দিই। যদি আমরা সেই API কল না করি, তবে ইনস্ট্যান্স হুকের টাইমআউট অবশেষে (এতে পরে আসব) পর্যন্ত চলতে থাকবে।

SSM ডকুমেন্ট

এখন আমাদের কিছু দরকার যা এই শেল স্ক্রিপ্টটি ট্রিগার করবে। সেটি করে SSM Agent। এটি ব্যাকগ্রাউন্ডে চলছে, SendCommand-এর মাধ্যমে একটি Document আসার জন্য অপেক্ষা করছে যাতে তাকে বলতে পারা যায় কী করতে হবে। আমাদের Document এজেন্টকে টার্মিনেশন স্ক্রিপ্ট রান করার নির্দেশ দেয়:

আপনি EC2 কনসোলের Systems Manager Shared Resources সেকশনের নিচে Documents লিংকে ক্লিক করে, তারপর Create Document বাটনে ক্লিক করে, এবং সেই JSON কন্টেন্ট বক্সে ড্রপ করে আপনার Document তৈরি করতে পারেন।

Lambda ফাংশন

Document inplace থাকলে, একটি Lambda ফাংশন তৈরি করুন যা টার্গেট ইনস্ট্যান্সে ডকুমেন্টটি রান করবে যখন ইনস্ট্যান্স টার্মিনেট করার সময় হবে। এর জন্য কিছু কোড:

PrepInstanceForTermination-কে আপনার ডকুমেন্টের নাম দিয়ে রিপ্লেস করুন, বাকি কোড কপি-পেস্ট।

এই Lambda ফাংশনের কিছু পারমিশন দরকার (সাধারণ Lambda পারমিশনের পাশাপাশি), তার জন্য একটি IAM পলিসি ডকুমেন্ট:

আপনাকে আবার ডকুমেন্টের নাম রিপ্লেস করতে হতে পারে।

হুক এবং ইভেন্ট রুল

थোड़ा ধৈর্য ধारण করুন—প্রায় শেষ! আপনার দুটি কাজ বাকি: CloudWatch Event এবং Lifecycle Hook তৈরি করা। প্রথমে, ইভেন্ট:

CloudWatch ম্যানেজমেন্ট কনসোলে, সাইডবারে Events-এ ক্লিক করুন, তারপর Create rule বাটনে ক্লিক করুন। এটি আপনার তৈরি করা Lambda ফাংশনকে ট্রিগার করবে।

AWS-এ Sidekiq স্কেলিং: একটি প্র্যাক্টিক্যাল গাইড

বাম পাশে আপনি যে ইভেন্টটি ওয়াচ করতে চান সেটি এবং তার কোনো অ্যাডিশনাল বৈশিষ্ট্য (যেমন কোন অটোস্কেলিং গ্রুপ এই ইভেন্টটি ট্রিগার করবে) পিক করুন, এবং ডান পাশে রুলের টার্গেট পিক করুন—আমাদের কেসে, আমরা তৈরি করা Lambda ফাংশন। Lambda ফাংশন টার্গেটের জন্য ডিফল্টগুলো পরিবর্তন করার দরকার নেই।

এটা হলে, EC2 ম্যানেজমেন্ট কনসোলে ফিরে যান এবং সেই অটোস্কেলিং গ্রুপে নেভিগেট করুন যেটির ইনস্ট্যান্সগুলো আপনি ম্যানেজ করতে চান। Lifecycle Hooks ট্যাবে ক্লিক করলে আপনি একটি হুক তৈরি করতে পারবেন। আমাদের হুকটি দেখতে এরকম:

AWS-এ Sidekiq স্কেলিং: একটি প্র্যাক্টিক্যাল গাইড

Terminate হলো আমাদের আগ্রহের ট্রানজিশন, এবং আমরা চাই টার্মিনেশন যাতে आगे যায় (Default Result: CONTINUE) যদি কোনো কারণে আমাদের শেল স্ক্রিপ্টে API কল ৬০০ সেকেন্ড (Heartbeat Timeout)내ে না হয়। এর ফলে আমাদের ইনস্ট্যান্স এক বা অন্য উপায়ে টার্মিনেট হবে, যদিও Sidekiq ওয়ার্কাররা শেষ না করে, ১০ মিনিটের পর।

শেষ

আপনি পার করলেন! এখন আপনার কাছে একটি অটোস্কেলিং গ্রুপ আছে যা তার Sidekiq ইনস্ট্যান্সগুলোর মানবিকভাবে টার্মিনেট করতে পারে। উপভোগ করুন!

P.S.: awslabs-এর প্রতি কৃতজ্ঞতা, যারা এই পিসগুলো জোড়া দেওয়ার একটি সুপার হেলপফুল টিউটোরিয়াল লিখেছেন।

  1. জিপিইউ স্কেলিং বনাম ডিসপ্লে স্কেলিং: পার্থক্য ব্যাখ্যা

  2. Ubuntu 20.04-এ ফ্র্যাকশনাল স্কেলিং সক্ষম করার পদ্ধতি

  3. Ubuntu 19.04-এ কী নতুন? (কি নুতন?)

  4. রুবি এক্সেপশনে লোকাল ও ইনস্ট্যান্স ভেরিয়েবল লগ করুন দ্রুত ডিবাগিংয়ের জন্য