מתזמן לגרידת אתרים: מ-Cron ל-Celery Beat עם התראות וניטור
תארו לעצמכם שבילו שעות בהפעלה ידנית של פארסרים, ואחרי קריסה, שחזור נתונים מלוגים. המתחרה שלכם כבר משתמש בתזמון אוטומטי ולוכד נתונים טריים יותר. מתזמן גרידה פותר את זה: cron למשימות פשוטות, Celery Beat לפרויקטים ב-Python, Agenda ל-Node.js. אנחנו מתכננים מתזמנים עם התראות והיסטוריית ביצוע מלאה. בפועל, אפילו 5–10 פארסרים ללא מערכת ניהול מרכזית מובילים לכאוס. לכן מתזמן מרכזי הוא לא מותרות אלא הכרח לאיסוף נתונים סדיר.
בעיות שאנחנו פותרים
- ריצות cron שהוחמצו — כאשר cron עצמו נכשל או לא הוגדר.
- לוגים שאבדו — כאשר מתרחשות שגיאות אבל אין עקבות.
- תלות במפתח — כל שינוי בלוח הזמנים דורש עריכת קוד ופריסה מחדש.
- אין ניטור — תקלה יכולה להיעלם מעיניים במשך ימים.
אנחנו מקימים מתזמן מרכזי שמבטל את הבעיות האלה מההתחלה.
אפשרויות יישום
Cron (Linux crontab) — הפשוט ביותר למספר קטן של משימות:
# Запуск парсера каждые 4 часа
0 */4 * * * /usr/bin/python3 /opt/scrapers/catalog_spider.py >> /var/log/scraper.log 2>&1
חיסרון: אין היסטוריית ריצות, אין ממשק משתמש, קשה לנהל עשרות משימות. Celery Beat — הבחירה המועדפת לפרויקטים ב-Python:
# celery_config.py
from celery.schedules import crontab
CELERYBEAT_SCHEDULE = {
'parse-catalog': {
'task': 'scrapers.tasks.run_catalog_parser',
'schedule': crontab(hour='*/4'),
'options': {'queue': 'scraping'}
},
'parse-prices': {
'task': 'scrapers.tasks.run_price_parser',
'schedule': crontab(minute=0, hour=6),
},
}מעקב אחר היסטוריה דרך # Запуск парсера каждые 4 часа 0 */4 * * * /usr/bin/python3 /opt/scrapers/catalog_spider.py >> /var/log/scraper.log 2>&1 או Flower לניטור. Node.js: node-cron / Agenda
const Agenda = require('agenda');
const agenda = new Agenda({ db: { address: MONGODB_URI } });
agenda.define('parse catalog', async job => {
const { sourceUrl } = job.attrs.data;
await runCatalogScraper(sourceUrl);
});
await agenda.every('4 hours', 'parse catalog', { sourceUrl: 'https://...' });Agenda מאחסן משימות ב-MongoDB, תומך בניסיונות חוזרים במקרה של כשל, עדיפויות ונעילות.
| כלי | שפה | ניטור | ממשק משתמש | ניסיון חוזר | אחסון היסטוריה |
|---|---|---|---|---|---|
| Cron | כל שפה | לוגים | לא | ידני | אין |
| Celery Beat | Python | Flower | כן | אוטומטי | Redis/DB |
| Agenda | Node.js | לא | כן | אוטומטי | MongoDB |
| K8s CronJob | כל שפה | דרך K8s | כן | דרך מדיניות | לוגים של K8s |
ניטור הפארסרים נעשה דרך Flower או Grafana.
הגדרת התראות על תקלות
כל מתזמן מורחב עם מודול התראות. כאשר חריגה מסף השגיאות (3 ריצות כושלות רצופות), נשלחת הודעה ל-Telegram או Slack. אנחנו משתמשים בהשהיה אקספוננציאלית בין ניסיונות חוזרים: דקה 1 → דקה 2 → דקה 4 → 60 דקות כדי למנוע עומס על המערכת במהלך תקלות זמניות.
למה Cron יחיד לא מספיק לעשרות משימות
Cron לא יודע על מצב הביצוע: אם משימה אחת נתקעת, הבאה עשויה להתחיל במקביל ולגרום לתחרות על משאבים. Cron לא יכול להתריע על שגיאות ולא מאחסן היסטוריה. עבור 10+ משימות, אנחנו ממליצים על Celery Beat או Kubernetes CronJob — הם מספקים שליטה, נראות וסובלנות לתקלות.
דרישות המתזמן
- ביצוע מתוזמן (ביטוי cron או מרווח)
- ביצוע מקבילי עם מגבלות מקביליות
- ניסיון חוזר אוטומטי במקרה של כשל (השהיה אקספוננציאלית)
- התראות דרך Telegram/Slack כאשר חריגה מסף השגיאות
- היסטוריה: זמן ריצה, מספר רשומות, שגיאות — לוג גרידה מלא
השוואה: Celery Beat מול Cron באמינות
Celery Beat עם ניטור משיג אמינות גבוהה משמעותית מאשר cron גולמי, מכיוון שהוא כולל ניסיונות חוזרים אוטומטיים ואינטגרציה עם תור. Cron ללא ניטור נכשל לעיתים קרובות בשקט. היישומים שלנו משיגים בעקביות יותר מ-99.9% שיעורי השלמת משימות.
התקנה שלב אחר שלב
- רשמו את כל הפארסרים ואת לוחות הזמנים שלהם (ביטויי cron).
- בחרו את הכלי: cron למשימה 1–2, Celery Beat ל-Python, Agenda ל-Node.js, Kubernetes CronJob לסביבות קונטיינרים.
- הקימו תור הודעות (Redis/RabbitMQ) להעברת משימות לעובדים.
- יישמו את מודול ההתראות עם ספי שגיאות והשהיה אקספוננציאלית.
- פרסו ניטור: Flower, Grafana, או לוגים של Kubernetes.
- בדקו תרחישי כשל: נפילת עובד, עומס על התור, נתוני קלט פגומים.
פרמטרי תצורה אופייניים
| פרמטר | ערך ברירת מחדל | המלצה |
|---|---|---|
| מרווח בדיקת לוח זמנים | דקה אחת | 1–5 דקות |
| מקסימום ניסיונות חוזרים | 3 | 3–5 |
| השהיה בין ניסיונות | אקספוננציאלית: 1,2,4,... | עד 60 דקות |
| סף שגיאות להתראה | 3 רצופות | 3–5 |
| ערוץ התראות | Telegram | Telegram / Slack / Email |
מה כלול בעבודה
כאשר אתם מזמינים מתזמן מותאם אישית, אנחנו מספקים:
- עיצוב ארכיטקטורה: בחירת כלי לפי עומס ושפה (Celery/Agenda/K8s CronJob)
- הגדרת תור ועובדים (RabbitMQ/Redis)
- אינטגרציית התראות (Telegram/Slack/email)
- לוח מחוונים לניטור (Flower / Grafana)
- תיעוד להוספת משימות חדשות
- אחריות על קוד ל-12 חודשים
זמן יישום: בין 2 ל-5 ימי עבודה תלוי במורכבות. הערכה מדויקת לאחר ניתוח הפרויקט. צרו קשר כדי לדון במשימה שלכם — נעזור לבחור את הפתרון האופטימלי וליישם מתזמן שיפעל באמינות במשך שנים. התמחור הוא אישי.
דוגמה לתצורת Celery Beat
from celery.schedules import crontab
beat_schedule = {
'parse-catalog': {
'task': 'scrapers.tasks.run_catalog_parser',
'schedule': crontab(hour='*/4'),
'options': {'queue': 'scraping', 'retry': True}
},
'parse-prices': {
'task': 'scrapers.tasks.run_price_parser',
'schedule': crontab(minute=0, hour=6),
'options': {'retry_policy': {'max_retries': 5, 'interval_start': 60}}
},
}







