ویژگی تصویر

ساخت کرون‌جاب (Cron Job) در Node.js — راهنمای کامل

  /  Node.js   /  ساخت کرون جاب (Cron Job) در Node.js
بنر تبلیغاتی الف
NodeJS - Node.js

کرون‌جاب‌ها وظایف زمان‌بندی‌شده‌ای هستند که به صورت منظم اجرا می‌شوند — مانند ارسال ایمیل‌های روزانه، پاک‌سازی فایل‌های موقت یا اجرای گزارش‌گیری. در این مقاله روش‌های مختلف ساخت و مدیریت کرون‌جاب در محیط Node.js را با مثال‌های عملی، بررسی مزایا/معایب و نکات عملی برای محیط‌های توزیع‌شده توضیح می‌دهم.

چرا از کرون‌جاب در Node.js استفاده کنیم؟

  • اجرای خودکار تسک‌های پس‌زمینه بدون نیاز به مداخله دستی.
  • قابل ادغام با اپلیکیشن‌های وب و سرویس‌های داخلی.
  • امکان زمان‌بندی پیچیده با قواعد cron یا قواعد برنامه‌ریزی سطح بالاتر.

روش‌های متداول برای زمان‌بندی در Node.js

  • استفاده از بسته‌های npm مثل node-cron یا node-schedule.
  • استفاده از job queue مثل Agenda یا Bull (برای پردازش توزیع‌شده و پشتوانه Redis).
  • استفاده از کران سیستم عامل (crontab) برای اجرای اسکریپت Node به صورت خارجی.

نمونه ساده با node-cron

const cron = require('node-cron');

cron.schedule('0 9 * * *', () => {
  console.log('Running a job at 09:00 every day');
});

این قطعه یک کرون‌جاب روزانه را هر روز ساعت 09:00 اجرا می‌کند. عبارت ‘0 9 * * *’ معادل سنسورها/فیلدهای استاندارد cron است: دقیقه، ساعت، روز ماه، ماه و روز هفته.

مثال عملی‌تر — ارسال ایمیل جمعه‌ها

const cron = require('node-cron');
const sendWeeklyReport = require('./mail').sendWeeklyReport;

cron.schedule('30 10 * * 5', async () => {
  try {
    await sendWeeklyReport();
    console.log('Weekly report sent successfully');
  } catch (err) {
    console.error('Failed to send weekly report:', err);
  }
}, {
  timezone: 'Asia/Tehran'
});

در این مثال تابع ارسال گزارش هر جمعه ساعت 10:30 به وقت تهران اجرا می‌شود. گزینه timezone مهم است تا زمان‌بندی با منطقه زمانی سرور سازگار بماند.

اجرای Node Script از crontab سیستم (مثال سرور)

# باز کردن crontab برای ویرایش
crontab -e

# اضافه کردن این خط برای اجرای اسکریپت هر روز ساعت 2 صبح
0 2 * * * /usr/bin/node /path/to/app/scripts/dailyTask.js >> /var/log/dailyTask.log 2>&1

این روش مناسب زمانی است که می‌خواهید تسک‌ها مستقل از چرخه فرایند Node اجرا شوند یا مدیریت فرآیندها را با سیستم‌عامل انجام دهید. توجه کنید مسیر node و دسترسی‌های فایل صحیح باشد.

مدیریت خطا، لاگینگ و دوباره‌تلاش (Retry)

همیشه کرون‌جاب‌ها باید با لاگینگ مناسب و مکانیزم ری‌تراِی محافظت شوند. برای تسک‌های حساس از ساختار try/catch، لاگ به فایل یا سرویس مانیتورینگ و در صورت نیاز از صف برای دوباره‌تلاش استفاده کنید.

کرون‌جاب در محیط چند-نمونه‌ای (Clustered) — جلوگیری از اجرای همزمان

در محیط‌هایی که چند نمونه (instance) از اپ اجرا می‌شوند، باید از اجرای همزمان یک کرون‌جاب جلوگیری شود. گزینه‌های معمول:

  • استفاده از قفل توزیع‌شده (Distributed Lock) با Redis یا دیتابیس.
  • اجرا دادن کرون‌جاب تنها روی یک نود مشخص (مثلاً worker خاص یا leader election).
  • استفاده از job queue مثل Bull/Agenda که خود رسیدگی به توزیع را انجام می‌دهند.

مثال قفل با Redis (پیشگیری از اجرای همزمان)

const cron = require('node-cron');
const Redis = require('ioredis');
const redis = new Redis();
const LOCK_KEY = 'lock:dailyJob';
const LOCK_TTL = 60 * 60; // 1 hour

cron.schedule('0 3 * * *', async () => {
  const acquired = await redis.set(LOCK_KEY, '1', 'NX', 'EX', LOCK_TTL);
  if (!acquired) {
    console.log('Job already running on another instance');
    return;
  }
  try {
    // do the job
  } finally {
    await redis.del(LOCK_KEY);
  }
});

در این کد قبل از اجرای تسک تلاش می‌کنیم قفلی در Redis بگیریم. اگر کلید وجود داشته باشد، به این معنی است تسک روی نود دیگری اجرا شده و از اجرای مجدد جلوگیری می‌شود. TTL برای جلوگیری از گیر افتادن قفل در صورت کرش استفاده شده است.

مقایسه سریع ابزارهای محبوب

ابزارمزایامعایب
node-cronسبک، ساده برای cron-syntaxمناسب برای اپ تک‌نود؛ بدون مدیریت توزیع‌شده
node-scheduleپشتیبانی از تاریخ‌ها و قواعد پیچیدهپیچیده‌تر؛ مشابه node-cron اما با قابلیت‌های بیشتر
Agenda / Bullصف و تأخیر، retries، persistence و توزیع‌شدهنیاز به Redis یا MongoDB؛ پیچیدگی بیشتر

نکات عملی و بهترین روش‌ها (Best Practices)

  • از timezone استفاده کنید تا زمان‌بندی برای کاربران نهایی صحیح باشد.
  • لاگ و مانیتورینگ برای کرون‌جاب‌ها فعال کنید (مثلاً Sentry یا Prometheus).
  • برای تسک‌های زمان‌بر از صف استفاده کنید و از نگهداری طولانی در فرآیند اصلی اجتناب کنید.
  • در محیط چندنودی از قفل توزیع‌شده یا leader election استفاده کنید.
  • گره‌های توسعه را طوری تنظیم کنید که کرون‌جاب‌ها در محیط توسعه غیرفعال یا با سرعت متفاوت اجرا شوند.

نتیجه‌گیری

ساخت کرون‌جاب در Node.js بسته به نیاز شما می‌تواند از یک خط ساده node-cron تا یک معماری پیشرفته با صف و قفل توزیع‌شده متفاوت باشد. انتخاب ابزار مناسب وابسته به مقیاس، نیاز به پایداری، و الزامات توزیع‌شده است. با رعایت نکات بالا می‌توانید کرون‌جاب‌های قابل اعتماد، قابل پایش و ایمن بسازید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: