7 KiB
Executable file
فاز 4: Background Job Queue
خلاصه
این فاز سیستم Background Job Queue را با استفاده از RQ (Redis Queue) پیادهسازی میکند. این سیستم امکان اجرای کارهای زمانبر را در پسزمینه فراهم میکند و از blocking شدن API جلوگیری میکند.
قابلیتهای پیادهسازی شده
1. Queue Service (app/core/queue.py)
- مدیریت queues با RQ
- پشتیبانی از چندین queue با اولویتهای مختلف:
high: کارهای با اولویت بالاdefault: کارهای عادیemail: ارسال ایمیلreports: تولید گزارشexports: export دادههاlow: کارهای با اولویت پایین
- مدیریت job ها: enqueue, get, cancel, delete
- آمارگیری از queues
2. Job Manager بهروزرسانی شده (app/services/job_manager.py)
- سازگاری با QueueService
- پشتیبانی از memory-based jobs (fallback)
- تبدیل وضعیت RQ jobs به JobStatus
3. Background Jobs
- Email Job (
app/services/jobs/email_job.py): ارسال ایمیل - Report Job (
app/services/jobs/report_job.py): تولید گزارش - Export Job (
app/services/jobs/export_job.py): export دادهها
4. RQ Worker (rq_worker.py)
- Worker script برای اجرای jobs
- پشتیبانی از تمام queues با اولویتبندی
5. API Endpoints (adapters/api/v1/jobs.py)
GET /api/v1/jobs/{job_id}: دریافت وضعیت jobDELETE /api/v1/jobs/{job_id}: لغو یا حذف jobGET /api/v1/jobs/queue/stats: آمار queuesGET /api/v1/jobs/failed: لیست jobs ناموفق
نصب و راهاندازی
1. نصب Dependencies
cd hesabixAPI
source .venv/bin/activate
pip install -e .
2. راهاندازی Redis
Redis باید نصب و راهاندازی شده باشد. برای راهنمای نصب Redis، به docs/REDIS_SETUP.md مراجعه کنید.
3. راهاندازی RQ Worker
دستی:
cd hesabixAPI
source .venv/bin/activate
python rq_worker.py
با systemd (از طریق deploy.sh):
sudo systemctl start hesabix-rq-worker
sudo systemctl enable hesabix-rq-worker
4. بررسی وضعیت Worker
# بررسی وضعیت service
sudo systemctl status hesabix-rq-worker
# مشاهده لاگها
sudo journalctl -u hesabix-rq-worker -f
برای مشاهدهٔ همان لاگ از پنل ادمین (تنظیمات سیستم → لاگهای سرویسها) و محدودیتهای میزبان/Docker، به SERVICE_LOGS_ADMIN_API.md مراجعه کنید.
استفاده
Enqueue کردن Job
from app.core.queue import get_queue_service, QUEUE_EMAIL
from app.services.jobs import send_email_job
queue_service = get_queue_service()
# Enqueue کردن job
job = queue_service.enqueue(
send_email_job,
to_email="user@example.com",
subject="Test Email",
body="This is a test email",
queue_name=QUEUE_EMAIL,
timeout=300,
result_ttl=3600
)
if job:
print(f"Job ID: {job.id}")
بررسی وضعیت Job
from app.services.job_manager import JobManager
job_manager = JobManager.instance()
status = job_manager.get(job_id)
if status:
print(f"State: {status.state}")
print(f"Progress: {status.progress}%")
print(f"Message: {status.message}")
استفاده در API Endpoints
from app.core.queue import get_queue_service, QUEUE_REPORTS
from app.services.jobs import generate_report_job
@router.post("/reports/generate")
async def create_report(...):
queue_service = get_queue_service()
if not queue_service.enabled:
raise ApiError("QUEUE_DISABLED", "Queue service is disabled")
job = queue_service.enqueue(
generate_report_job,
report_type="sales",
business_id=business_id,
user_id=user_id,
queue_name=QUEUE_REPORTS
)
return {"job_id": job.id}
Queues و اولویتها
Worker به ترتیب اولویت از queues استفاده میکند:
high- کارهای با اولویت بالاdefault- کارهای عادیemail- ارسال ایمیلreports- تولید گزارشexports- export دادههاlow- کارهای با اولویت پایین
Monitoring
آمار Queues
curl -H "Authorization: Bearer YOUR_TOKEN" \
http://localhost:8000/api/v1/jobs/queue/stats
Jobs ناموفق
curl -H "Authorization: Bearer YOUR_TOKEN" \
http://localhost:8000/api/v1/jobs/failed?limit=10
Troubleshooting
Worker شروع نمیشود
-
بررسی کنید Redis در حال اجرا است:
sudo systemctl status redis -
بررسی تنظیمات Redis در پنل مدیریت سیستم
-
بررسی لاگهای worker:
sudo journalctl -u hesabix-rq-worker -n 50
Jobs اجرا نمیشوند
-
بررسی کنید worker در حال اجرا است:
sudo systemctl status hesabix-rq-worker -
بررسی کنید Redis در دسترس است:
redis-cli ping -
بررسی آمار queues:
curl -H "Authorization: Bearer YOUR_TOKEN" \ http://localhost:8000/api/v1/jobs/queue/stats
Jobs در queue میمانند
- بررسی کنید worker در حال اجرا است
- بررسی لاگهای worker برای خطاها
- بررسی failed jobs:
curl -H "Authorization: Bearer YOUR_TOKEN" \ http://localhost:8000/api/v1/jobs/failed
Best Practices
- Timeout مناسب: برای هر job یک timeout مناسب تنظیم کنید
- Result TTL: برای jobs با نتیجه بزرگ، TTL کوتاهتری تنظیم کنید
- Queue مناسب: از queue مناسب برای هر نوع job استفاده کنید
- Error Handling: در job functions خطاها را به درستی handle کنید
- Monitoring: به طور منظم آمار queues و failed jobs را بررسی کنید
مقیاسپذیری
برای مقیاسپذیری بیشتر:
- میتوانید چندین worker اجرا کنید
- میتوانید worker های جداگانه برای هر queue ایجاد کنید
- میتوانید از Redis Cluster برای مقیاسپذیری بیشتر استفاده کنید
Migration از BackgroundTasks
اگر از FastAPI BackgroundTasks استفاده میکردید، میتوانید به تدریج به RQ migrate کنید:
- Job های زمانبر را به RQ منتقل کنید
- Job های سریع را میتوانید در BackgroundTasks نگه دارید
- از QueueService برای enqueue کردن استفاده کنید