বেশিরভাগ অ্যাপ্লিকেশনকে ব্যাকগ্রাউন্ড জব (background jobs) দরকার পড়ে মেইলার্স (mailers), নিয়মিত ক্লিন-আপ (clean-ups), বা যেকোনো অন্য টাইম-কনসামিং অপারেশন যেটি ইউজারের উপস্থিতি দরকার করে না।
রেইলস ওয়ার্ল্ডে বেশ কিছু জেম জব কিউ (job queues) এবং ব্যাকগ্রাউন্ড প্রসেসিং সাপোর্ট করে — Delayed Job এবং Sidekiq দুইটি সবচেয়ে জনপ্রিয়।
এই পোস্টে, আমরা Delayed Job এবং Sidekiq-র ওপর বিস্তারিত নজর দিব, তাদের পারস্পরিক পারফরম্যান্স সহ।
চলুন শুরু করি!
Delayed Job-র একটি দ্রুত পরিচিতি
Delayed Job শপিফাই (Shopify) থেকে ডায়রেক্ট এক্সট্রাকশন এবং একটি টেবিল ব্যবহার করে সকল ব্যাকগ্রাউন্ড জব মেইনটেইন করে। এটি একটি খুব সিম্পল প্যাটার্ন ফলো করে। যেকোনো রুবি অবজেক্ট যেটি perform মেথড রেসপন্ড করে, সেটি জবস টেবিলে এনকিউ (enqueue) করা যায়।
এছাড়া, আপনি যদি স্পেশাল জব অবজেক্ট মেইনটেইন করার প্রয়োজন নেই (যদিও এটি টেস্ট্যাবিলিটি এবং লং-রানিং অপারেশনস এর স্পষ্ট পৃথকীকরণের জন্য অত্যন্ত রিকমেন্ডেড), এটি আপনাকে যেকোনো রুবি অবজেক্টের ওপর .delay.method(params) কল করার অনুমতি দেয়। এটি মেথডটিকে ব্যাকগ্রাউন্ডে প্রসেস করবে।
Delayed Job README সব সাধারণ ইউজেজ প্যাটার্ন চমৎকারভাবে ব্যাখ্যা করে।
অনেক টিম Delayed Job বেছে নেয় কারণ এটি সহজ এবং তাদের ইতিমধ্যে এক্সিস্টিং ডাটাবেস ব্যবহার করে। তাদের অন্যান্য রিসোর্স খরচ/মেইনটেইন করতে হয় না।
তবে, এটি আপনার ডাটাবেস টেবিলে স্পেস নিবে। আপনি যদি একই সময়ে অনেক জব কিউড রাখেন, তবে সেগুলো সমান করার জন্য আপনাকে বেশি ডিস্ক স্পেস দরকার হতে পারে।
Sidekiq-র একটি দ্রুত পরিচিতি
অন্যদিকে, Sidekiq Redis ব্যবহার করে তার ডেটা স্টোর হিসেবে সকল জব মেটাডেটা মেইনটেইন করতে। এর সাথে একটি স্পষ্ট সুবিধা আছে যা Delayed Job ব্যবহার করে রেগুলার ডাটাবেস সিস্টেমের চেয়ে অনেক দ্রুত। এছাড়া, প্রতিটি Sidekiq প্রসেস একাধিক থ্রেড স্পান করে জবগুলো আরও দ্রুত প্রসেস করতে।
Sidekiq-এ প্রতিটি ব্যাকগ্রাউন্ড জবের জন্য, আমাদের একটি স্পেশালাইজড ক্লাস দরকার যেটি Sidekiq::Worker কনসার্ন (concern) ইনক্লুড করে এবং perform মেথড রেসপন্ড করে। জবটি এনকিউ করতে, আমাদের আর্গুমেন্টসহ perform_async(arg1, arg2) কল করতে হবে ওয়ার্কার ক্লাসের ওপর।
Sidekiq 'Getting Started' গাইড এটা এবং অন্যান্য ইউজেজ প্যাটার্ন ভালোভাবে ব্যাখ্যা করে।
Delayed Job বা Sidekiq-র সাথে Active Job ব্যবহার
রেইলস ইতিমধ্যে একটি মেচিউর জব ফ্রেমওয়ার্ক প্রদান করে টপ-লেভেল ডিক্লারেশন এবং জব হ্যান্ডলিং-এর জন্য। Delayed Job এবং Sidekiq দুটোই ActiveJob-এর ইউনিফাইড API-এর মাধ্যমে জব রান করতে সাপোর্ট করে। শুধু ApplicationJob থেকে ইনহেরিট করুন এবং আপনার জব ক্লাসে perform_later কল করুন কনফিগারড কিউইং ব্যাকএন্ডে জব এনকিউ করার জন্য।
Active Job দিয়ে জব রান করার সুবিধা হল আপনার অ্যাপ্লিকেশন কোড ফ্রেমওয়ার্ক-অগ্নostic (framework agnostic) হয়, এবং Delayed Job থেকে Sidekiq-এ (বা তার বিপরীতে) সুইচ করা খুব সহজ হয়। ActiveJob::TestHelperও এনকিউড জব টেস্টিংকে হবায় করে তোলে।
তবে, Active Job যা এবস্ট্রাকশন প্রদান করে সেটিও একটি পারফরম্যান্স ওভারহেড নিয়ে আসে, কারণ জব ডেটা স্টোরে পুশ করার আগে র্যাপ (wrap) করতে হয়। Sidekiq দাবি করে ActiveJob প্রায় ২-২০ গুণ স্লোয়ার (slower) রেডিসে পুশ করার সময়, ~৩ গুণ প্রসেসিং ওভারহেড সহ।
Delayed Job বনাম Sidekiq
এখন আমরা Delayed Job এবং Sidekiq-র বেসিক্স জানি, চলুন তাদের পার্থক্য এবং প্রতিটি কী টেবিলে আনে সেটি গভীরে যাই।
ফিচারগুলো (The Features)
বেসিক অ্যাপ্লিকেশনগুলো için, Sidekiq এবং Delayed Job উভয়ই একটি ভালো ফিচার সেট প্রদান করে আউট অফ দ্য বক্স। এগুলো شامل: জব প্রায়োরিটি (job priorities) অ্যাসাইন করা, নেমড কিউস (named queues), এবং ফেইলയার্সে অটো-রিট্রাই (auto-retry on failures)।
Delayed Job বক্সের বাইরে ম্যাক্স রান টাইম কনফিগার করার একটি উপায় প্রদান করে (Sidekiq নয়)।
Sidekiq, অন্যদিকে, মিডলওয়্যার (Middleware) সাপোর্ট করে জব মেটাডেটা আপডেট করতে, জব কিউ করা বাদ দিতে, অথবা জব এক্সিকিউট করতে। Sidekiq বেশি কলব্যাক সাপোর্ট করে, যদিও কিছু হুক Delayed Job অ্যাপসের জন্য উপলব্ধ। কলব্যাকের বদলে, আপনি Delayed Job Active Job-র সাথে ব্যবহার করতে পারেন (নামে, রেইলসে বিল্ট-ইন before_enqueue এবং around_perform কলব্যাকস)।
Web UI আরেকটি ফিচার যা Sidekiq-র সাথে আউট অফ দ্য বক্স আসে। এটি জব এবং ওয়ার্কারস, বর্তমান এনকিউড এবং ডেড জব সম্পর্কে ঐতিহাসিক পরিসংখ্যান (historical statistics) প্রদান করে। আপনি কনসোলের মাধ্যমে না যেতে অপারেশন যেমন জব ডিলিট বা তাত্ক্ষণিক রান করতে পারেন।
Delayed Job-র ইনবিল্ট Web UI নেই, কিন্তু delayed_job_web Sidekiq-এর মত ফিচার সহ একটি বেসিক Web UI-তে অ্যাক্সেস দেয়।
পারফরম্যান্সে Sidekiq জয়ী (Sidekiq Wins at Performance)
পারফরম্যান্স-ওয়াইজ, Sidekiq Delayed Job কে খুব স্পষ্টভাবে হারিয়ে দেয়। Sidekiq-এর ওপেন-সোর্স বেঞ্চমার্ক অনুযায়ী, এটি প্রায় ৩০ গুণ দ্রুত Delayed Job চেয়ে। এর দুটি বড় কারণ:
- Redis ট্রাডিশনাল ডাটাবেসের চেয়ে (যেমন Postgres) ডেটা কোয়েরি করতে অনেক দ্রুত কারণ এটি মেমরিতে ডেটা স্টোর করে ডিস্কের বদলে।
- Delayed Job একটি সিঙ্গেল থ্রেড রান করে জব প্রসেস করতে, Sidekiq-এর চেয়ে যা একাধিক থ্রেড ব্যবহার করে।
যদিও কাগজে সব কিছু চমৎকার দেখাচ্ছে, পার্থক্যগুলো বেশি মেটার করে না যদি না আপনি বড় স্কেলে কাজ করেন (যেমন ১০k জব পার মিনিট)। একজাক্ট নম্বরও জবের গড় রান টাইমের ওপর ডিপেন্ড করে। জবের রান টাইম যত দীর্ঘ, Delayed Job-এর পারফরম্যান্স ওভারহেড তত কম মেটার করে।
আপনি যদি Delayed Job-এর পারফরম্যান্স নিয়ে চিন্তিত হন, আপনি কিছু পারফরম্যান্স অপ্টিমাইজেশন করতে পারেন। একজাক্ট ইনডেক্সগুলো আপনার জব সিস্টেমের পরিসংখ্যানের ওপর ডিপেন্ড করবে। উদাহরণস্বরূপ, আপনি যদি একাধিক কিউ ব্যবহার করেন এবং শুধু একটি মেজর চাঙ্ক জব পায়, কিউ কলামে একটি সিম্পল ইনডেক্স (add_index :delayed_jobs, :queue) উল্লেখযোগ্যভাবে পারফরম্যান্স উন্নত করতে পারে।
AppSignal-এ, Sidekiq ম্যাজিক ড্যাশবোর্ড অটোমেটিক্যালি জেনারেট হয় এবং এটি আপনাকে কিউ লেন্থ, কিউ ল্যাটেন্সি, জব ডুরেশন, জব স্ট্যাটাস, মেমরি ইউজেজ, ইত্যাদি মনিটর করতে সক্ষম করে।

ডিপ্লয়মেন্ট (Deployment)
Delayed Job এবং Sidekiq উভয়ের ওয়ার্কারসের জন্য সাদৃশ্য ডিপ্লয়মেন্ট স্ট্র্যাটেজি আছে। হেরোকু (Heroku) ব্যবহার করে, আপনাকে শুধু আপনার Procfile-এ এন্ট্রি যোগ করতে হবে জব প্রসেসর শুরু করতে এবং ওয়ার্কারস রান করতে।
Sidekiq-এর জন্য:
Delayed Job-এর জন্য:
মেমরি (Memory)
এখান থেকে জিনিসগুলো কিছুটা আকর্ষণীয় হতে শুরু হয়। Sidekiq-র একটি কনকারেন্সি (concurrency) অপশন আছে যা কন্ট্রোল করে সেটি কত থ্রেড রান করবে। Sidekiq বনাম Delayed Job বেঞ্চমার্কের অধিকাংশ Sidekiq-এর খুব হাই কনকারেন্সি ২৫ থ্রেড পর্যন্ত মেনশন করে, যা এর সুপার-ফাস্ট পারফরম্যান্সে অবদান রাখে।
তবে, রিয়েল সেটিং-এ, আপনাকে থ্রেডগুলো কিছুটা কনজারভেটিভ (conservative) লিমিট করতে হবে। একজাক্ট নম্বর ডিপেন্ড করে আপনার অ্যাপ্লিকেশন কতটুকু हेভি (heavy) এবং আপনি কী ধরনের জব পারফর্ম করেন। আমি প্র্যাকটিসে যা দেখেছি সেটি হল আপনি যদি ৫১২MB মেমরিতে (Heroku-তে standard-1x এর সমতুল্য) একটি ওয়ার্কার রান করেন, থ্রেডের সংখ্যা ২ থেকে ৫-এর মাঝপথে কোথাও থাকে ২৫ এর বদলে।
'Taming Rails memory bloat' মাইক পারহাম (Mike Perham), Sidekiq-এর ক্রিয়েটর, দ্বারা মেমরি ইস্যুস বিস্তারিত আলোচনা করে এবং পড়ার যোগ্য। আমি পুরো আলোচনায় নেমবো না, কিন্তু তিনি রিকমেন্ড করেন যে আপনি MALLOC_ARENA_MAX=2 সেট করুন সকল ওয়ার্কারসে যারা Sidekiq রান করে।
jemalloc ব্যবহার করা রেগুলার malloc-র বদলে সাহায্য করে। একজাক্ট পদ্ধতি প্ল্যাটফর্মের ওপর ডিপেন্ড করে, কিন্তু হেরোকুতে খুব সহজ। শুধু heroku-buildpack-jemalloc কে ফার্স্ট বিল্ডপ্যাক হিসেবে সেট করুন (heroku/ruby বিল্ডপ্যাকের আগে)।
Delayed Job সিম্পলার রিসোর্সেস ব্যবহার করে (Delayed Job Uses Simpler Resources)
আমরা আলোচনা করেছি, Delayed Job আপনার এক্সিস্টিং ডাটাবেস ইনস্ট্যান্সে রান করে। আপনাকে বাড়াতে হতে পারে:
- উপলব্ধ মেমরি
- ডিস্ক স্পেস
- ম্যাক্স কানেকশনস
জব লোড বা আপনি কত ওয়ার্কার রান করছেন তার ওপর ডিপেন্ড করে। কিন্তু একমাত্র রিসোর্স যা আপনার দরকার সেটি হল জব প্রসেসর।
অন্যদিকে, Sidekiq একটি Redis ইনস্ট্যান্স দরকার জব হ্যান্ডেল করার জন্য। আপনি যদি Redis ক্যাশ স্টোর হিসাবেও ব্যবহার করেন, রিকমেন্ড করা হয় আপনি একটি আলাদা ইনস্ট্যান্স ব্যবহার করুন "পারসিস্টেন্ট স্টোর" (persistent store) হিসেবে কনফিগার করা Sidekiq জবসের জন্য।
যেহেতু Redis তখন সেরা কাজ করে যখন সব কিছু মেমরিতে ফিট করে, আপনি যদি খুব বেশি জব থাকে (উদাহরণস্বরূপ, যদি Sidekiq কিছু সময়ের জন্য জবস প্রসেস করা বন্ধ করে দেয় অ্যাপ্লিকেশনে কোনো ইস্যুর কারণে), সেটি ক্লিয়ার করতে কিছু ডাউনটাইম লাগতে পারে। এটি বিশেষ করে কষ্টকর যদি আপনার Redis আপনার অ্যাপের সাথে একই সার্ভারে থাকে। তারা মেমরির জন্য কম্পিট (compete) করা শুরু করবে, লিডিং টু সোয়াপিং (swapping) এবং أخيرًا আপনার অ্যাপ্লিকেশন পারফরম্যান্স ধ্বংস করবে।
Redis সম্পর্কে একটি গুরুত্বপূর্ণ পয়েন্ট নোট করুন যে এটিকে maxmemory-policy noeviction দিয়ে কনফিগার করা উচিত Sidekiq-এর ডেটা সাইলেন্টলি ড্রপ (silent drops) এড়াতে। অন্যথায়, আপনি নিজেকে মিসিং জবস পাবেন যেগুলো পারফর্ম করা উচিত, কোনো ট্রেস ছাড়া।
একটি সাইড-নোট: Sidekiq-এ পেইড আপগ্রেডস
আপনি যদি এক্সট্রা ফিচারস দরকার, Sidekiq Pro এবং Enterprise ভার্সনসহ আসে।
Pro-র সবচেয়ে নটেবল অডিশন হল Batch Jobs যা প্যারালেলে রান করতে পারে, মনিটর করা যায়, এবং একটি গ্রুপ হিসেবে ইন্টারঅ্যাক্ট করতে পারে, সব জব হয়ে যাওয়ার পর একটি কলব্যাক ইনভোক করে। Pro-র ইনপ্রুভড রিলায়াবিলিটি ফিচারসও আছে যেন কোনো জব সাইলেন্টলি ড্রপ না হয়, এমনকি নেটওয়ার্ক সমস্যা চলাকালীন।
Enterprise ভার্সন আরও ফিচারসহ আসে। আপনি যদি কিছু খুঁজছেন যা একটি রেগুলার Sidekiq ইনস্টলেশন সমাধান করতে পারে না, পেইড Sidekiq ফিচারস এক্সপ্লোর করুন।
প্র্যাকটিসে, Sidekiq-এর ফ্রি ভার্সন এখনো চমৎকার কাজ করে। কিন্তু জানা ভালো যে পেইড অপশনগুলো আছে যেগুলো আপনি প্রয়োজন অনুযায়ী আপগ্রেড করতে পারেন, অন্য সলিউশনে সুইচ করার বদলে।
কমিউনিটি এবং ডেভেলপমেন্ট স্ট্যাটাস: Sidekiq-এর এজ (Community and Development Status: Sidekiq Has the Edge)
Sidekiq এবং Delayed Job উভয়ের পেছনে একটি বিশাল কমিউনিটি আছে। যেদবি, StackOverflow বা অফিসিয়াল ডকুমেন্টেশনে আপনার প্রশ্নের দ্রুত উত্তর পাওয়া সবসময় সহজ নয়।
ডেভেলপমেন্ট সাইডে, Delayed Job-এর জন্য জিনিসগুলো খুব উজ্জ্বল দেখা যাচ্ছে না। ডিসেম্বর ২০২১ এবং জানুয়ারি ২০২২-এ Delayed Job-এ কিছু মাইনর কাজ হয়েছিল, কিন্তু সেটি এগিয়ে যাচ্ছে না মেজর ডেভেলপমেন্টস तरफ। এটি মেইনটেন্যান্স-ওনলি মোড (maintenance-only mode) এ দেখাচ্ছে, এবং গিটহাবে অনেক ওপেন ইস্যু আছে।
বিপরীতে, Sidekiq এখনো এক্টিভ ডেভেলপমেন্ট আন্ডার, এবং এর ক্রিয়েটর ফুল টাইম এটিতে কাজ করছেন। খুব কম ওপেন ইস্যু আছে, এবং সেগুলো রেগুলারলি অ্যাড্রেস হয়।
সমাপন: Sidekiq নাকি Delayed Job? আপনার প্রয়োজনের ওপর নির্ভর করে
এই পোস্টে, আমরা রেইলস অ্যাপ্লিকেশন 위한 দুটি মেজর জব প্রসেসিং সিস্টেম — Sidekiq এবং Delayed Job — কভার করেছি, তাদের কিছু প্রস এবং কন্স (pros and cons) দেখিয়ে।
প্রত্যেকের জন্য ভিন্ন ইউজ কেস আছে। সব কিছু আপনার অপারেশনের বাজেট এবং স্কেলের ওপর ডিপেন্ড করে।
আপনার জন্য পারফরম্যান্স এবং লং-টার্ম মেইনটেইনযোগ্যতা (long-term maintainability) গুরুত্বপূর্ণ হলে, Sidekiq নো-ব্রেইনার (no-brainer)। অন্যদিকে, আপনার জন্য রানিং কস্ট (running costs) চিন্তার বিষয় হলে, Delayed Job আপনাকে সাহায্য করতে পারে।
আপনি Delayed Job বেছে নিন বা Sidekiq, আপনার প্রজেক্টের জন্য শুভকামনা এবং খুশি কোডিং!
👋 আপনি যদি এই আর্টিকেল পছন্দ করেন, আমাদের রুবি পারফরম্যান্স মনিটরিং চেকলিস্ট-এ অন্যান্য রুবি (অন রেইলস) পারফরম্যান্স আর্টিকেলস দেখুন।
P.S. আপনি যদি রুবি ম্যাজিক পোস্টগুলো প্রেস থেকে বের होतेই পড়তে চান, আমাদের রুবি ম্যাজিক নিউজলেটার সাবস্ক্রাইব করুন এবং একক পোস্টও মিস করবেন না!