در دنیای توسعه نرم افزار، ما مجبوریم با کارهای تکراری، دستی و خسته کننده مواجه شویم. هیچ توسعهدهندهای دوست ندارد آنها را انجام دهد، اما در نهایت، باید اتفاق بیفتند. به کارهای تعمیر و نگهداری مانند تهیه نسخه پشتیبان، ارسال ایمیل در فواصل زمانی معین، فعال کردن اعلانهای Slack، بهروزرسانی پایگاههای داده، حذف وب، ایجاد گزارشهای مبتنی بر زمان از دادهها، ادغام با APIهای شخص ثالث … خیلی بیشتر فکر کنید.
اینجاست که به اصطلاح cron jobها وارد میشوند. Cron job راهی برای برنامهریزی کدهای خاص برای اجرا در یک فرکانس تکرارشونده یا در لحظات خاص در زمان است. برای خودکار کردن کارهای تکراری که باید در یک برنامه زمانی خاص انجام شوند، عالی است، مانند لیستی که به آن اشاره کردیم.
از فوریه 2023، کرون جاب برای پروژه Next.js شما نیز در دسترس هستند. در این مقاله، نحوه پیکربندی cron jobها را بررسی میکنیم، فرآیند نصب را برای افزودن آنها به پروژه Next.js خود بررسی میکنیم و نحوه استفاده از آنها را در استقرار Vercel توضیح میدهیم.
برای کمک به شما برای شروع سریعتر، ما نکات اضافی را برای پیکربندیهای فراتر از تنظیمات اولیه ارائه میکنیم. در نهایت، محدودیتهای فعلی و شناخته شده این ویژگی را که هنوز در دست توسعه است، در نظر خواهیم گرفت.
نحوه پیکربندی وظایف Vercel cron
برای پیکربندی فرکانس و زمان بندی یک کرون جاب، باید از یک سینتکس خاص به نام عبارات cron استفاده کنید. یک عبارت cron از پنج مقدار تشکیل شده است که بازه های زمانی مختلف را نشان می دهد. این موارد از دقیقه، ساعت، روز ماه، ماه تا روز هفته متغیر است:
# Cron expression syntax
# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (0 is Sunday, 6 is Saturday)
# │ │ │ │ │
# │ │ │ │ │
# │ │ │ │ │
# * * * * *
شما می توانید هر بازه را با استفاده از یک عدد از محدوده خاصی از مقادیر پیکربندی کنید. این مقدار آن بازه زمانی را در یک برنامه زمانی مشخص قفل می کند. علاوه بر این، از یک علامت عام (*
) نیز می توان برای اجرای یک کرون جاب در فرکانس مشخصی از آن بازه استفاده کرد.
به عنوان مثال، یک عبارت cron معمولی چیزی شبیه به:
42 10 * * 1
است.دو مقدار عددی اول منجر به شروع کرون جاب در ساعت 10:42 صبح UTC می شود. دو علامت عام ستاره به این معنی است که باید هر روز از ماه و هر ماه اتفاق بیفتد - بنابراین، اساساً هر روز از سال. در نهایت، مقدار نهایی آن را فقط به یک روز مشخص از هفته قفل می کند، که در مورد 1 دوشنبه است. بنابراین، در نهایت، این cron job هر دوشنبه در ساعت 10:42 صبح آغاز می شود.
همچنین می توان از چیزی به نام مقادیر مرحله با استفاده از /
استفاده کرد که بازه را برای تکرار در یک فرکانس خاص پیکربندی می کند. ترکیب آن در یک عبارت cron پیچیده تر چیزی شبیه به این خواهد بود:
42 10 */2 */3 *
این شبیه به عبارت cron قبلی است، اما تفاوت اصلی این است که اکنون هر دو روز از ماه و هر سه ماه یکبار اجرا می شود. در مجموع، هر سه ماه یکبار در ساعت 10:42 صبح شروع می شود.
ایجاد cron job در Vercel
برای شروع کار با کرون جاب ها در Vercel، اساساً تنها به دو چیز نیاز دارید:
در پروژه Vercel شما یک تابع بدون سرور یا Edge: هر بار که یک cron را راه اندازی کنیم، این کد اجرا می شود. برای اطلاعات بیشتر در مورد این توابع، تفاوت آنها و نحوه اجرای آنها، لطفاً به مستندات مربوطه مراجعه کنید.
یک فایل vercel.json
، اگر هنوز در پروژه خود ندارید. به طور کلی، اینجا جایی است که می توانید رفتار مربوط به Vercel پروژه خود را پیکربندی کنید، و هر چیزی که مربوط به cron jobs باشد را شامل می شود.
در فایل vercel.json، باید یک فیلد crons اضافه کنید که آرایه ای از اشیاء پیکربندی cron job را می پذیرد. هر شیء پیکربندی دقیقاً شامل دو فیلد مسیر و زمانبندی است.
فیلد اول مسیری است به سمت تابعی که می خواهیم اجرا کنیم. این مسیر همیشه باید با یک / شروع شود. فیلد دوم عبارت cron است که می گوید کرون جاب چه زمانی و چند وقت یکبار باید راه اندازی شود:
// vercel.json
{
"crons": [
{
"path": "/api/cron",
"schedule": "0 5 * * *"
}
]
}
این فایل vercel.json به عنوان نقطه اصلی پیکربندی شما برای هر چیزی که مربوط به کرون جاب ها است عمل می کند.
اگر می خواهید یک کرون جاب اضافه کنید، باید یک ورودی جدید در آرایه ایجاد کنید. اگر می خواهید یک موجود را به روز کنید، باید عبارت cron یا خود تابع را تغییر دهید. برای حذف یکی، باید ورودی آن یا تابع مربوطه را حذف کنید. سپس، همه چیز بعد از اینکه دوباره پروژه را مجدداً مستقر کردید، اعمال می شود.
داشبورد Vercel کرون جاب
در نهایت، دانستن در مورد داشبورد cron jobs نیز مهم است. می توانید آن را در صفحه تنظیمات پروژه Vercel خود، در فوتر به نام Cron Jobs پیدا کنید.
در این داشبورد، می توانید cron jobs را به طور کلی در پروژه خود غیرفعال و فعال کنید. اگر cron jobs را فعال کنید، می توانید تمام کرون جاب را که در این داشبورد پیکربندی کرده اید مشاهده کنید.
در آنجا، میتوانید چندین کار مانند بررسی تنظیمات آنها، راهاندازی دستی کارها، یا بررسی گزارشهای اجرای گذشته در صورت عدم موفقیت غیرمنتظره انجام دهید.
نکات اضافی
همانطور که می بینیم، شروع کار با cron job در Next.js یا سایر فریمورک های Vercel نسبتاً ساده و آسان است. اگر قبلاً توابع بدون سرور یا Edge را در پروژه خود تنظیم کرده اید، حتی یکپارچه تر ادغام می شود.
فراتر از آن، چند چیز دیگر وجود دارد که باید بدانید تا فراتر از راه اندازی اولیه به شما کمک کند.
ایمن سازی کرون جاب Vercel
در سناریوهای خاص، لازم است کرون جاب خود را ایمن کنید، به عنوان مثال، از استفاده عمومی جلوگیری کنید.
خوشبختانه، Vercel یک راه حل خارج از جعبه برای انجام این کار از طریق متغیر محیطی ویژه CRON_SECRET
ارائه می دهد. برای استفاده از آن، باید آن را به پروژه Vercel خود اضافه کنید. میتوانید آن را در بخشهای Environment Variables
تنظیمات پروژه Vercel خود پیدا کنید.
پس از افزودن آن، متغیر محیطی به طور خودکار در هدر Authorization
درخواست cron job شما همراه با پیشوند Bearer
قرار می گیرد. سپس کد تابع شما میتواند به آن دسترسی پیدا کند، آن را با کلید متغیر محیطی مقایسه کند و مطابق با آن عمل کند:
import type { VercelRequest, VercelResponse } from '@vercel/node';
export default function handler(
request: VercelRequest,
response: VercelResponse,
) {
const authHeader = request.headers.get('authorization');
if (authorization !== `Bearer ${process.env.CRON_SECRET}`) {
return response.json(
{ success: false },
{
status: 401,
},
);
}
return response.json({ success: true });
}
لطفاً توجه داشته باشید که در زمان نوشتن این مقاله، روشی که از طریق آن میتوان کرون جاب را در Vercel ایمن کرد حداقل یک بار تغییر کرده است: این کار با گنجاندن یک کلید در مسیر کرون جاب به عنوان پارامتر کوئری شروع شد، به تنظیماتی که ما انجام دادیم. در بالا توضیح داده اند.
در حالی که رویکرد فعلی، با استفاده از CRON_SECRET
، نسبتاً پایدار به نظر می رسد، این جنبه خاص ممکن است در معرض تغییر باشد.
ایجاد مسیرهای پویا برای کرون جاب ها
همچنین میتوان با گنجاندن قسمت پویا در مسیر cron job برای مسیرهای پویا کرون جاب ایجاد کرد:
{
"crons": [
{
"path": "/api/dynamic-cron-job/87DS8AD",
"schedule": "0 5 * * *"
},
{
"path": "/api/dynamic-cron-job/324JKHF",
"schedule": "0 5 * * *"
}
]
}
درست مانند مسیرهای پویا، باید به صراحت نشان دهید که فایل تابع مربوطه با استفاده از براکت ها پویا است. سپس آن تابع میتواند قسمت پویا مسیر cron job را انتخاب کرده و در کد خود از آن استفاده کند:
// /api/[dynamic-cron-job].ts
export default async function handler(req: NextRequest) {
const dynamicApiPart = req.nextUrl.pathname.split('/')[3];
// Use the dynamic part
}
حتی اگر مسیرهای پویا به این روش پشتیبانی میشوند، لازم است همه تغییرات موجود در فایل vercel.json
را از قبل بدانید و تعریف کنید. در دراز مدت، این تنظیم ممکن است به بهترین شکل ممکن مقیاس نباشد.
اجرای کرون جاب ها Vercel به صورت محلی
در نهایت، خوشبختانه اجرای cron job به صورت محلی نسبتاً ساده است. به دلیل نحوه راهاندازی cron jobها، تفاوتی با مسیرهای API در برنامه شما ندارند.
برای فعال کردن آنها در محیط محلی خود، تنها کاری که باید انجام دهید این است که یک درخواست به مسیر مربوطه آن نسبت به مسیر توسعه محلی خود ارائه دهید. اما متاسفانه cron job ها در سرورهای توسعه پشتیبانی نمی شوند.
محدودیت ها
راحتی داشتن کرون جاب و ساده بودن نسبی راه اندازی آنها در پروژه Vercel شما بسیار خوب است. در را برای ویژگی های اضافی در برنامه وب شما باز می کند که قبلاً امکان پذیر نبود در حالی که همه چیز را در یک پروژه نگه می دارد.
علیرغم این، محدودیتهای خاصی نیز برای اجرای (فعلا) کرون جاب در Vercel وجود دارد. در زمان نوشتن این مقاله، این ویژگی هنوز در مرحله بتا است. در حالی که هنوز در حال توسعه است، با چندین محدودیت پهنای باند همراه است.
تنها محدودیت سخت حداکثر 20 کار مجاز در هر پروژه است. مشخص نیست که آیا محدودیتهایی که در زیر به آنها خواهیم پرداخت، در نسخه GA بررسی میشوند یا اینکه دائمی هستند، بنابراین لطفاً این را در نظر داشته باشید.
ویژگی های سینتکس
به طور خاص برای عبارات cron، سینتکس از چند ویژگی که در سینتکس کاملاً تعریف شده پشتیبانی می شوند، پشتیبانی نمی کند.
اول، فقط مقادیر عددی پشتیبانی می شوند. دوم، روز ماه و روز هفته را نمیتوان با هم پیکربندی کرد: وقتی هر کدام روی یک مقدار خاص تنظیم میشود، دیگری باید روی *
تنظیم شود.
بزرگترین چیزی که باید در نظر داشته باشید این است که کرون جاب ها همیشه در منطقه زمانی UTC اجرا می شوند. اگر قصد دارید کرون جاب را در زمانهای خاص اجرا کنید، مهم است که آن را در نظر بگیرید.
ارتباط با توابع بدون سرور و edge
در حالی که، روی کاغذ، کرون جاب جدا از توابع بدون سرور و لبه Vercel است، در عمل، آنها در واقع بسیار شبیه هستند. در پایان، توابع در زیر هود مورد نیاز هستند زیرا کد مربوطه آنها همان چیزی است که cron job های ما را فراخوانی می کند.
این بدان معنی است که کرون جابز به طور ضمنی در استفاده و صورتحساب شما برای آن دستهها نیز حساب میشود. اگر قصد دارید به شدت آنها را با هم ترکیب کنید، ممکن است زودتر از آنچه انتظار دارید به محدودیت های خود برسید.
در کل، cron jobها دارای محدودیت مدت زمان هستند. این محدودیت ها مانند محدودیت های مدت زمان برای توابع بدون سرور و لبه است.
هزینه
اگرچه این مشکل در طول بتا نیست، بسته به اینکه در کدام برنامه Vercel هستید، محدودیتهای خاصی وجود دارد. برای طرح های Hobby، Pro و Enterprise، تعداد کرون جاب که مجاز خواهند بود به ترتیب دو، 40 و 100 هستند.
در نهایت، طرح Hobby دارای محدودیتهای اضافی است، زیرا کرون جاب را فقط میتوان یک بار در روز برنامهریزی کرد و زمانبندی را نمیتوان در سطح دقیقه، فقط در سطح ساعت تضمین کرد. بنابراین، اگر کاری را طوری پیکربندی کنید که در ساعت 15:00 اجرا شود، میتواند بین ساعت 15:00 تا 15:59 فعال شود. مجدداً، اگر نیاز دارید که کرون جاب خود را در یک زمان بسیار خاص راه اندازی کنید، این مهم است که به خاطر داشته باشید.
نتیجه
در این مقاله، یک ویژگی جدید هیجانانگیز را بررسی کردهایم که میتوانید از طریق Vercel به پروژههای Next.js خود، کرون جاب را اضافه کنید. همانطور که دیدیم، فرآیند راه اندازی نسبتاً ساده است، به حداقل تنظیمات نیاز دارد و فراتر از تنظیمات اولیه اولیه نیز امکان پذیر است.
اما علیرغم اینکه این ویژگی کاملا امیدوارکننده به نظر می رسد، هنوز هم برخی از هشدارها در مورد این ویژگی توسعه نیافته وجود دارد. در حالی که اینها در همه سناریوها یک معامله شکن نیستند، من قطعاً توصیه می کنم به نحوه تأثیر آنها بر موارد استفاده شما توجه کنید.