তাই আজ, আমি Huey নামের একটি সেলারি বিকল্প সম্পর্কে কথা বলব, যেটি সেলেরির তুলনায় অনেক সহজ সেটআপের সাথে আসে এবং সেলেরির তুলনায় আকারে অনেক ছোট।
আমি কেন Huey চেষ্টা করার সিদ্ধান্ত নিয়েছি কারণ ডকুমেন্টেশন খুব বেশি না হওয়ায় কিছু সাধারণ কাজ করার জন্য মাঝে মাঝে সেলেরির সাথে কিছু সমস্যার সম্মুখীন হয়েছি।
যারা সেলেরি কী তা জানেন না বা আগে এটি ব্যবহার করেননি তাদের জন্য, Huey হল একটি অ্যাসিঙ্ক্রোনাস টাস্ক কিউ যা আপনাকে ব্যাকগ্রাউন্ডে নির্ধারিত কাজ বা দীর্ঘ-চলমান কাজগুলি সম্পাদন করতে দেয়।
আমরা নিম্নলিখিত প্যাকেজগুলি ইনস্টল করব:
নিম্নলিখিত ব্লগটি একটি GitHub রেপো সহ আসে যা আপনি ডেমো প্রকল্পটি পরীক্ষা করতে ব্যবহার করতে পারেন যা আমরা তৈরি করব।
টার্মিনাল খুলুন, এবং একটি ডিরেক্টরি তৈরি করতে নিম্নলিখিত টাইপ করুন; আপনি এই ধাপটি এড়িয়ে যেতে পারেন এবং ফাইল এক্সপ্লোরার থেকেই এটি করতে পারেন।
mkdir huey_demo
আমাদের প্রকল্প নির্ভরতা ইনস্টল করার জন্য প্রথমে একটি ভার্চুয়ালেনভ তৈরি করা যাক:
python -m venv venv
ভার্চুয়ালেনভ (লিনাক্স) সক্রিয় করুন:
source venv/bin/activate
সমস্ত নির্ভরতা ইনস্টল করতে টার্মিনালে নিম্নলিখিত কমান্ডটি টাইপ করুন:
pip install Django==4.0.4 redis==4.2.2 huey==2.4.3
এই নিবন্ধটি লেখার সময়, এই সংস্করণগুলি আমি এই সেটআপটি পরীক্ষা করেছিলাম, ভবিষ্যতে সর্বশেষ সংস্করণ অনুসারে যে কোনও আপডেটের জন্য গিথুব রেপোতে নজর রাখুন।
টার্মিনালে নিম্নলিখিত কমান্ডটি টাইপ করে জ্যাঙ্গো প্রকল্পটি তৈরি করুন:
django-admin startproject django_huey_demo
Django প্রকল্প ডিরেক্টরিতে ডিরেক্টরি পরিবর্তন করুন:
cd django_huey_demo
আমাদের প্রকল্পের অধীনে অ্যাপ তৈরি করুন:
python manage.py startapp demo
প্রজেক্ট settings.py
এ তৈরি অ্যাপটি অন্তর্ভুক্ত করুন, নিম্নলিখিত পরিবর্তনগুলি করুন:
INSTALLED_APPS = [ # Existing Apps "demo.apps.DemoConfig", # <== Add this line ]
settings.py
এ ডিবাগ মোড False
এ সেট করুন:
DEBUG=False
আমরা ডিবাগকে ফলসে সেট করছি যাতে আমরা দেখতে পারি Huey কীভাবে প্রোডাকশনে চলে, এই বিষয়ে পরে আরও।
এখন যেহেতু আমরা আমাদের প্রজেক্ট সেট আপ করে ফেলেছি, আজকে আমরা কী তৈরি করব তা আপনাকে নেওয়ার জন্য এটি একটি ভাল সময়।
আমরা Wordnik API থেকে প্রতিদিন "Word of the Day" আনব। তারপর আমরা আমাদের ডাটাবেসে একটি বাক্যে শব্দ, এর সংজ্ঞা এবং শব্দের উদাহরণ সংরক্ষণ করব।
আমরা Huey ব্যবহার করে একটি পর্যায়ক্রমিক কাজ সেট আপ করব যা দিনের শব্দটি আনবে এবং এটি সংরক্ষণ করবে।
শব্দটি সংরক্ষণ করার জন্য আমরা এর একটি জ্যাঙ্গো মডেল তৈরি করব।
আপনি API কী পেতে এই নির্দেশিকা অনুসরণ করতে পারেন।
আমাদের প্রকল্পের ইনস্টল করা অ্যাপগুলিতে Huey যোগ করতে হবে, তাই settings.py
ফাইলে নিম্নলিখিত পরিবর্তনগুলি করুন:
INSTALLED_APPS = [ # Existing apps 'huey.contrib.djhuey', # <== Add this line ]
সারিবদ্ধ কাজগুলি সম্পর্কে তথ্য সংরক্ষণ করার জন্য আমাদের Huey-এর জন্য Redis ইনস্টল করতে হবে যেমনটি আমরা সেলারিতেও করতাম। আপনার নির্দিষ্ট অপারেটিং সিস্টেমের উপর ভিত্তি করে রেডিস ইনস্টল করতে আপনি নিম্নলিখিত লিঙ্কটি উল্লেখ করতে পারেন।
আপনি যদি ডকার ব্যবহারে স্বাচ্ছন্দ্য বোধ করেন তবে আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:
docker run --name redis_huey -p 6379:6379 -d redis
ডিফল্টরূপে, Huey localhost:6379
এ চলমান Redis সার্ভারের সাথে সংযোগ করার চেষ্টা করবে। এটি উপস্থিত না থাকলে, এটি একটি ত্রুটি বাড়াবে৷
আপনার demo/models.py
ফাইলে নিম্নলিখিত কোড যোগ করুন:
from django.db import models class Word(models.Model): word = models.CharField(max_length=200) part_of_speech = models.CharField(max_length=100) definition = models.TextField() example = models.TextField() def __str__(self): return self.word
মাইগ্রেশন করুন:
python manage.py makemigrations demo
মাইগ্রেশন প্রয়োগ করুন:
python manage.py migrate demo
ডেমো অ্যাপ ডিরেক্টরিতে tasks.py
নামে একটি ফাইল তৈরি করুন। আমরা কেন আমাদের ফাইলের নাম tasks.py
রাখি তা হল আমাদের নিবন্ধিত অ্যাপগুলিতে উপস্থিত কাজগুলিকে স্বয়ংক্রিয়ভাবে আবিষ্কার করতে সাহায্য করার জন্য, যদি আমরা আমাদের ফাইলের নাম তা ছাড়া অন্য কিছু রাখি তবে আমাদের কাজটি ম্যানুয়ালি নিবন্ধন করতে হবে। আপনি যদি আরও জানতে চান তবে আপনি এখানে Huey ডকুমেন্টেশন দেখতে পারেন।
আমরা টাস্ক সংজ্ঞা লিখার আগে, আমাদের একটি অতিরিক্ত নির্ভরতা requests
ইনস্টল করতে হবে। আপনার টার্মিনালে নিম্নলিখিত টাইপ করে এটি ইনস্টল করুন:
pip install requests==2.27.1
এখন, কোড আসে:
import requests from django.conf import settings from huey import crontab from huey.contrib.djhuey import db_periodic_task from demo.models import Word @db_periodic_task(crontab(hour="18", minute="00")) def fetch_daily_word(): r = requests.get( f"https://api.wordnik.com/v4/words.json/wordOfTheDay?api_key={settings.WORDNIK_API_KEY}") data = r.json() Word.objects.get_or_create( word=data["word"], part_of_speech=data["definitions"][0]["partOfSpeech"], definition=data["definitions"][0]["text"], example=data["examples"][0]["text"] )
আপনার প্রকল্প সেটিংসে নিম্নলিখিত লাইন যোগ করুন:
WORDNIK_API_KEY = "api-key-here"
এই কোড ব্লকটি নেওয়ার জন্য অনেক কিছু হতে পারে, তাই আসুন একে একে একে একে একে একে একে একে একে একে দেখি:
হুই ডেকোরেটর
from huey.contrib.djhuey import db_periodic_task
এটি ডাটাবেসের সাথে কাজ করা জড়িত পর্যায়ক্রমিক কাজগুলি নিবন্ধন করার জন্য Huey দ্বারা সরবরাহ করা একটি ডেকোরেটর, এই ডেকোরেটর টাস্ক সম্পূর্ণ হওয়ার পরে স্বয়ংক্রিয়ভাবে ডাটাবেস সংযোগ বন্ধ করে দেয়, আরও বিশদ বিবরণের জন্য, আপনি এখানে উল্লেখ করতে পারেন।
ক্রন্টাব সময়সূচী
@db_periodic_task(crontab(hour="18", minute="00"))
আমরা আর্গুমেন্ট crontab(hour="18", minute="00")
আমাদের পর্যায়ক্রমিক টাস্ক ডেকোরেটরের কাছে পাঠাচ্ছি, এটি Huey কে প্রতিদিন সন্ধ্যা 6 টায় আমাদের টাস্ক চালাতে বলে। আপনি আপনার ক্রন্টাব সময়সূচী তৈরি করতে এই ওয়েবসাইটটি ব্যবহার করতে পারেন, আমি প্রতিবার এটি ব্যবহার করি।
Wordnik API কী
from django.conf import settings # Usage ## settings.WORDNIK_API_KEY
from django.conf import settings
হল আমাদের প্রজেক্ট সেটিংস থেকে যেকোনো ডেটা আমদানি করার আদর্শ উপায়, এটি এমন ক্ষেত্রে দরকারী যেখানে আমাদের বিভিন্ন পরিবেশের জন্য একাধিক সেটিংস ফাইল সেট আপ করা আছে তাই এটি আমাদের চিন্তা না করেই বুঝতে পারবে কোন ফাইল থেকে বাছাই করা হবে এটা এটি DJANGO_SETTINGS_MODULE
এনভায়রনমেন্ট ভেরিয়েবল থেকে আমরা কোন সেটিংস ফাইল ব্যবহার করছি তা খুঁজে বের করে। কিন্তু আপনি এই বিবরণ সম্পর্কে চিন্তা করতে হবে না.
তারপর আমরা আমাদের Wordnik API কলে কী ব্যবহার করি।
Wordnik API কল
r = requests.get( f"https://api.wordnik.com/v4/words.json/wordOfTheDay?api_key={settings.WORDNIK_API_KEY}")
এখানে, আমরা প্রমাণীকরণের জন্য আমাদের API কী পাস করার সময় Wordnik API-তে একটি GET অনুরোধ করতে অনুরোধ মডিউল ব্যবহার করছি।
ডাটাবেসে শব্দ সংরক্ষণ করা
data = r.json() Word.objects.get_or_create( word=data["word"], part_of_speech=data["definitions"][0]["partOfSpeech"], definition=data["definitions"][0]["text"], example=data["examples"][0]["text"] )
API প্রতিক্রিয়া পার্স করার পরে, আমরা আমাদের ডাটাবেসে শব্দ সংজ্ঞা সংরক্ষণ করছি। আমরা এখানে create
পদ্ধতির পরিবর্তে get_or_create
পদ্ধতি ব্যবহার করছি যাতে Wordnik API দ্বারা সেই শব্দটি পুনরাবৃত্তি হলে আমরা আমাদের ডাটাবেসে একই শব্দের একাধিক কপি তৈরি করতে না পারি।
Wordnik API প্রতিক্রিয়া
ওয়ার্ড অফ দ্য ডে এন্ডপয়েন্টের জন্য Wordnik API প্রতিক্রিয়া কেমন দেখায় তা এখানে। প্রতিক্রিয়ার কিছু অপ্রাসঙ্গিক অংশ সংক্ষিপ্ততার উদ্দেশ্যে ছাঁটাই করা হয়েছে।
{ "word": "stolon", "definitions": [ { "source": "ahd-5", "text": "A long thin stem that usually grows horizontally along the ground and produces roots and shoots at widely spaced nodes, as in a strawberry plant.", "note": null, "partOfSpeech": "noun" }, // More definitions here... ], "publishDate": "2022-05-08T03:00:00.000Z", "examples": [ { "title": "4.1 Nursery establishment", "text": "A stolon is a stem that grows along the ground, producing at its nodes new plants with roots and upright stems.", // Additional data here... }, // More examples here... ], // Additional fields here... }
আপনি আপনার টার্মিনালে নিম্নলিখিত কমান্ড টাইপ করে Huey কর্মী শুরু করতে পারেন:
python manage.py run_huey
আপনি উপরের কমান্ডে একাধিক পতাকা পাস করতে পারেন যা কনসোলে লগ ইন করা পরিবর্তন করবে, যেমন:
-v, --verbose
- verbose লগিং (DEBUG স্তর অন্তর্ভুক্ত)-q, --quiet
- ন্যূনতম লগিং-S, --simple
- সহজ লগিং বিন্যাস ("সময় বার্তা")
লগিং করার জন্য অন্যান্য বিভিন্ন বিকল্প দেখতে, এখানে ডক্স দেখুন।
আপনি টাস্কের মধ্যে কোন অপারেশন করছেন তার উপর নির্ভর করে Huey একাধিক টাস্ক ডেকোরেটর নিয়ে আসে।
আমি নীচে সংক্ষিপ্তভাবে ব্যাখ্যা করব যে সেগুলি কী করে।
এখানে সমস্ত ডেকোরেটরের জন্য আমদানি বিবৃতি রয়েছে:
from huey.contrib.djhuey import task, periodic_task, db_task, db_periodic_task
task
: একটি নিয়মিত কাজ।periodic_task
: যখন আপনি সময়সূচীর উপর ভিত্তি করে পর্যায়ক্রমে একটি টাস্ক চালাতে চান।db_task
: যখন আপনি আপনার টাস্কের মধ্যে DB অপারেশন করতে চান।db_periodic_task
: যখন আপনি একটি পর্যায়ক্রমিক টাস্কে DB অপারেশন করতে চান।আমি আপনাকে আরও কিছু উদাহরণ দেখাই কিভাবে আপনি আপনার কাজের সময়সূচী করতে ক্রন্টাব ব্যবহার করতে পারেন।
crontab(minute='*/3')
টাস্কটি প্রতি তিন মিনিটে চালানোর জন্য নির্ধারিত করবে।crontab(hour='*/3', minute='5')
একটি টাস্ক তৈরি করবে যা প্রতি তৃতীয় ঘণ্টায় 5 মিনিটে চলবে।crontab(minute='00', hour='10', month='*/2', day_of_week='*/5')
একটি টাস্ক তৈরি করবে যা সপ্তাহের প্রতি ৫ম দিনে, প্রতি ২য় মাসের এই সময়ে চলবে সকাল 10.00 টা. উদাহরণস্বরূপ, আপনি নিম্নলিখিত টাস্কটি tasks.py
ভিতরে সংজ্ঞায়িত করেছেন:
from huey.contrib.djhuey import task @task() def count(): for i in range(10): print(i)
এখন, আপনি যদি এই টাস্কটিকে কল করতে চান কিন্তু এটি 5 সেকেন্ড পরে চলতে চান তবে আপনি নিম্নলিখিতগুলি করতে পারেন:
count.schedule(delay=5)
delay
পরামিতি সেকেন্ডে মান নেয়, তাই আপনি যদি এটি 5 মিনিটের পরে কার্যকর করতে চান তবে 300 সেকেন্ড নির্দিষ্ট করুন।
ধরুন আপনি আমাদের বিদ্যমান টাস্কে নিম্নলিখিত যুক্তি যোগ করেছেন:
@db_periodic_task(crontab(hour="18", minute="00"), retries=2) def fetch_daily_word(): r = requests.get( f"https://api.wordnik.com/v4/words.json/wordOfTheDay?api_key={settings.WORDNIK_API_KEY}") if r.status_code != 200: raise Exception("Unable to fetch data from Wordnik API") ## Add this logic else: data = r.json() Word.objects.get_or_create( word=data["word"], part_of_speech=data["definitions"][0]["partOfSpeech"], definition=data["definitions"][0]["text"], example=data["examples"][0]["text"] )
সুতরাং, আমরা প্রতিক্রিয়ার স্ট্যাটাস কোড পরীক্ষা করার জন্য যুক্তি যোগ করেছি, এবং যদি এটি 200 ব্যতীত অন্য কিছু হয় তবে এটি 2 বার পর্যন্ত সেই কাজটি পুনরায় চেষ্টা করবে। কিন্তু এই পুনঃপ্রচার দুটি প্রচেষ্টার মধ্যে কোনো সময়ের ব্যবধান ছাড়াই ঘটবে। এখন, আপনি যদি এই কাজের একাধিক প্রচেষ্টা বিলম্বিত করতে চান? আমরা retry_delay
আর্গুমেন্ট পাস করে তা করতে পারি, এটি সেকেন্ডের মধ্যে মান গ্রহণ করে।
@db_periodic_task(crontab(hour="18", minute="00"), retries=2, retry_delay=10)
এটি একাধিক প্রচেষ্টার মধ্যে 10-সেকেন্ড বিলম্বের কারণ হবে৷
Huey একটি ডিফল্ট সেটিং সহ আসে যা জ্যাঙ্গোতে বিকাশের সময় Huey এর সাথে কাজ করা সহজ করে তোলে। সুতরাং, যখনই আপনার settings.py
ফাইলে DEBUG=True
উপস্থিত থাকবে, কাজগুলি নিয়মিত ফাংশন কলের মতোই সিঙ্ক্রোনাসভাবে চালানো হবে। এর উদ্দেশ্য হল পরীক্ষা তৈরি বা চালানোর সময় Redis এবং একটি অতিরিক্ত ভোক্তা প্রক্রিয়া উভয়ই চালানো এড়ানো। আপনি এখানে এই বিষয়ে আরও পড়তে পারেন .
এর জন্য, আমাদের settings.py
এ নিম্নলিখিত লাইন যোগ করতে হবে:
HUEY = {}
যাইহোক, আপনি যদি এই আচরণটি ওভাররাইড করতে চান তবে আপনি পরিবর্তে নিম্নলিখিত Huey কনফিগারেশন যোগ করতে পারেন:
HUEY = { "immediate": False }
DEBUG=True
থাকাকালীন আপনার যদি settings.py
এ উল্লিখিত উপরের কনফিগারেশন থাকে, Huey-এর জন্য আপনাকে Redis সেট আপ করতে হবে এবং run_huey
কমান্ড ব্যবহার করে Huey ওয়ার্কার চালাতে হবে।
সেলারি তুলনায় Huey সম্পর্কে কিছু পর্যবেক্ষণ হল:
run_huey
কমান্ড ব্যবহার করে শুধুমাত্র একটি পরিষেবা চালাতে হবে।