הגדרת תור משימות עבור 1C-Bitrix
תארו לעצמכם: החלפת נתונים עם 1C נכשלת עקב פסק זמן, קמפיין דוא"ל ל-5000 מנויים חוסם בקשה, יצירת PDF עבור 20,000 מוצרים מפילה את השרת. לכל המשימות הללו יש דבר אחד משותף: לא ניתן לבצע אותן בבקשת HTTP. יש צורך בתור—מנגנון שמקבל משימה, מאחסן אותה, ומבצע אותה ברקע באמצעות תהליך נפרד. אנו עובדים עם Bitrix כבר למעלה מ-10 שנים והקמנו תורים כאלה עבור יותר מ-50 פרויקטים—כך זה נעשה.
תור משימות הוא רכיב קריטי עבור פרויקטים בעלי עומס גבוה. בלעדיו, כל תהליך ארוך חוסם בקשות משתמשים, ופסקי זמן מובילים לאובדן נתונים. תור שתוכנן כראוי פותר שלוש בעיות: מבטיח ביצוע, מאפשר עיבוד מקבילי של מאות משימות, ומספק מנגנון ניסיון חוזר לפעולות שנכשלו. ב-Bitrix קיימות מספר גישות: מסוכנים פשוטים ועד ברוקרים חיצוניים כמו RabbitMQ.
מנגנונים מובנים: סוכנים
סוכנים (CAgent) הם מערכת המשימות הדחויות המובנית של Bitrix. סוכן הוא פונקציה שנקראת לפי לוח זמנים. רישום:
CAgent::AddAgent( "MyClass::processQueue();", // PHP-код для выполнения "main", // модуль "N", // не периодический (N) или периодический (Y) 300, // интервал в секундах "", // дата первой проверки "Y", // активность "" // дата первого запуска ); סוכנים רצים בשתי דרכים:
- על בקשות (ברירת מחדל)—בכל בקשה, Bitrix בודק אם יש סוכנים שצריך להפעיל. בעיה: אם אין תנועה, סוכנים לא רצים. אם התנועה גבוהה, בדיקות הסוכנים מוסיפות עומס לכל בקשה.
- על cron—המצב המומלץ. הוסיפו רשומת crontab:
CAgent::AddAgent( "MyClass::processQueue();", // PHP-код для выполнения "main", // модуль "N", // не периодический (N) или периодический (Y) 300, // интервал в секундах "", // дата первой проверки "Y", // активность "" // дата первого запуска );. פרמטר ב-crontab:
'agents' => [ 'value' => [ 'use_crontab' => true ] ] למה סוכנים על בקשות הם רעים
סוכנים על בקשות הם הגורם העיקרי לירידה בביצועים בפרויקטים בינוניים. כל בקשת HTTP מבזבזת עד 10% מזמנה על בדיקה והפעלת סוכנים. עם 10,000 מבקרים ביום, זה מוביל ל-20,000 קריאות נוספות ל-*/5 * * * * /usr/bin/php /var/www/bitrix/modules/main/tools/cron_events.php בשעה. מעבר ל-cron מפחית את עומס השרת בעד 70% ומבטיח ביצוע גם עם אפס תנועה.
| שיטת ביצוע | תלויה בתנועה | עומס שרת | דיוק בלוח זמנים |
|---|---|---|---|
| על בקשות | כן | גבוה | נמוך |
| על cron | לא | נמוך | גבוה |
מתי סוכנים לא מספיקים
סוכנים הם חד-חוטיים. סוכן אחד רץ, האחרים ממתינים. אם סוכן ייבוא נתונים לוקח 10 דקות, כל הסוכנים האחרים (שליחת דוא"ל, חישוב מחדש של מטמון, החלפת 1C) מתעכבים. עבור פרויקטים עם עיבוד רקע אינטנסיבי, יש צורך בתור מלא.
תור מבוסס על בלוק HL
היישום הפשוט ביותר ללא תלות חיצונית:
-
בלוק HL
.settings.php—שדות:'agents' => [ 'value' => [ 'use_crontab' => true ] ](מחלקת handler),CAgent::CheckAgents()(JSON עם פרמטרים),QueueJob(ממתין/בתהליך/הושלם/נכשל),UF_HANDLER(מספר ניסיונות חוזרים),UF_PAYLOAD,UF_STATUS. - שליחת משימה—
UF_ATTEMPTS. השתמשו ב-D7 ORM—התקן עבור Bitrix. - Handler (סקריפט cron)—רץ כל דקה, בוחר N משימות עם סטטוס
UF_CREATED_AT, משנה ל-UF_PROCESSED_AT, מבצע, מסמןQueueJobTable::add(['UF_HANDLER' => 'ImportHandler', 'UF_PAYLOAD' => json_encode($data), 'UF_STATUS' => 'pending'])אוpending.
יתרונות: ניסיון חוזר (בהתבסס על processing), ניטור (שאילתת SQL לבלוק HL), עדיפויות (הוספת שדה done).
איך להגדיר תור בלוק HL: שלב אחר שלב
- צרו בלוק HL
failedעם שדות:UF_ATTEMPTS(מחרוזת),UF_PRIORITY(טקסט),QueueJob(רשימה: ממתין, בתהליך, הושלם, נכשל),UF_HANDLER(מספר שלם),UF_PAYLOAD(תאריך ושעה),UF_STATUS(תאריך ושעה). - הוסיפו אינדקס על
UF_ATTEMPTSלבחירה מהירה של משימות ממתינות. - כתבו מחלקת handler עם מתודה
UF_CREATED_ATשמחזירה true/false. - צרו סקריפט cron שבוחר כל דקה עד 10 משימות עם סטטוס ממתין, משנה אותן לתהליך, קורא ל-handler, ובהצלחה מסמן הושלם, בכישלון מסמן נכשל עם הגדלת מספר הניסיונות.
- הגנו על הסקריפט מפני ריצה מקבילית באמצעות flock.
ברוקרים חיצוניים: RabbitMQ, Redis
עבור פרויקטים בעלי עומס גבוה:
-
RabbitMQ—התחברות דרך
UF_PROCESSED_AT. יצרן ב-Bitrix מוסיף משימה לתור, צרכן—daemon PHP נפרד שמאזין לתור ומבצע משימות. תפוקה: עד 10,000 משימות בדקה. -
Redis—דרך
UF_STATUS/run($payload). פשוט יותר מ-RabbitMQ, מספיק לרוב התרחישים. אינטגרציה עם Bitrix: היצרן נרשם כ-handler לאירועים (לדוגמה,php-amqplib), הצרכן רץ דרך Supervisor.
השוואה: בלוק HL לעומת RabbitMQ לעומת Redis
| קריטריון | בלוק HL | RabbitMQ | Redis |
|---|---|---|---|
| תלות חיצונית | אין | שרת RabbitMQ | שרת Redis |
| תפוקה | עד 500 משימות/דקה | 10,000+ משימות/דקה | 5,000+ משימות/דקה |
| ניסיון חוזר | ידני | מובנה | דרך BLPOP |
| ניטור | שאילתות SQL | ממשק ניהול | שימוש ב-RedisMonitor |
לפי הבדיקות שלנו, תור בלוק HL מעבד משימות פי 3-5 מהר יותר מאשר סוכנים על בקשות, ו-RabbitMQ מהיר פי 2 מתור בלוק HL.
מה כלול בהגדרת תור
- העברת סוכנים מבקשות ל-cron עם התאמת מרווחים
- עיצוב בלוק HL או בחירת ברוקר חיצוני בהתאם לעומס שלכם
- פיתוח handler לתור עם ניסיון חוזר ורישום לוגים
- הגדרת Supervisor עבור צרכני RabbitMQ/Redis
- הפעלה אסינכרונית של תהליכים עסקיים (Bizproc) דרך התור
- ניטור: התראה כאשר מצטברים יותר מ-50 משימות שלא עובדו
- תיעוד תפעולי והדרכה לצוות שלכם
- 30 ימי תמיכה לאחר השחרור
למה אנחנו ואיך אנו מעריכים את הפרויקט
המהנדסים שלנו עובדים עם Bitrix מאז גרסה 10, השלימו מעל 50 פרויקטים לאופטימיזציה של תהליכי רקע. אנו מפחיתים את עומס השרת בעד 70%, ומאיצים את עיבוד המשימות פי 10. עלות הגדרת התור נקבעת לאחר ניתוח עומס. מקור: תיעוד רשמי של Bitrix
צרו קשר לייעוץ לגבי הפרויקט שלכם. אנו נעריך את העומס ונציע את הפתרון האופטימלי—בין אם בלוק HL או RabbitMQ. הזמינו ביקורת מקדימה כדי לקבל לוחות זמנים ועלות מדויקים לתרחיש שלכם. קבלו תוכנית אופטימיזציה מפורטת לתור—בחינם בשיחת ההיכרות.







