ארכיון יומי: 25 יולי, 2010

סליחה מתי להתחיל ?

קרונוס אל הזמן (להבדיל מקרונוס הטיטן – 2 יצורים שונים במיתולוגיה היוונית -> בלטינית נכתבים אחרת) נבחר בעולם היוניקס בשביל לשמור מתי יתבצעו משימות בזמנים שונים. התפקיד של cron ביוניקס הוא לאחסן את הפעולה שצריך לעשות ולהעיר אותה בזמן שצריך, אבל, הוא לא באמת אחראי על הפעולה עצמה, אלא רק להעיר את התהליך.

בתור כלי מערכתי כולל, למרות התחביר הבעייתי, cron במתכונתו עושה את העבודה בצורה יפה, אבל יש לו כמה חסרונות מאוד בולטים:

  • כאמור התחביר – קל מידי להתבלבל בתחביר ולגרום למשהו לקום בזמן לא נכון
  • קשה עד כמעט בלתי אפשרי לדבג בעיות באמצעותו
  • הוא לא יודע לתת מענה לזמנים פחות מדקה (אם צריך שכל 3 שניות נקבל את השינוי מהבורסה למשל, הוא לא מתאים עבורינו)
  • לא ניתן לבצע התנייה שפעולה מסויימת תפעל פעם ב5 דקות אבל רק אם פעולה אחרת הסתיימה (יש דרכים לעשות את זה, אבל cron לא תומך בזה, זה הכל חצוני)
  • לפעמים הסביבה שלנו (כלומר משתני הסביבה, נתיבים וכו') שונים לגמרי ב cron מאשר בשורת הפקודה ואנחנו מגלים שדברים לא עובדים

יש עוד הרבה בעיות, אבל אלו הבעיות שלדעתי כמעט כולם נתקלים בהם.

כאשר אנחנו רוצים להגדיר שתוכנה שלנו תבצע פעולה מסויימת בפרק זמן מסויים אשר אינו כללי מאוד אלא דורש הרבה מאוד התייחסות לפרטים שונים (נגיד פעולה אחרת הסתיימה קודם, יש רשומה ספציפית במסד הנתונים והרשימה עוד ממשיכה), השימוש ב cron הופך לסיוט והוא אינו מתאים בכלל, ובשביל זה, יש ברובי הרבה מאוד פתרונות.

יש פתרונות בהם קוד הרובי מתורגם אחד לאחד עבור cron כולל לוגיקה, ובכך חוסך מאיתנו לעבוד קשה עם cron, אבל הוא לא באמת פותר כלום, הוא רק מחביא את הבעיות.

יש ברובי גם כלים אשר נועדו להיות בעצם ניהול תורים עבור זמנים (הנמוך ביותר בהם הוא פר שנייה), אשר מריצים פקודות וקבצים אחרים (זה כל התפקיד, לשמור את שם הפעולה שצריך להריץ, לא לשמור את הפעולה עצמה כחלק הפקודה).

למשל בכלי אחד אפשר לעשות את הפעולה הבאה:

require 'stalker'
handler { |job| Stalker.enqueue(job) }

every 1.hour, 'apis.poll'
every 1.day,  'reports.email', :at => '00:00'

ואז מופעל השירות שיש לנו צורך בו כדוגמת apis.poll (זה שם הפעולה). במידת הצורך אפשר פיזית גם לתת block של קוד בנוסף. הלוגיקה עצמה, כאמור אבל צריכה להתיות במקום אחר, היות וכאן רק מאחסנים את שם הפעולה ומתי היא צריכה להתבצע.

זה לא נועד להחליף את cron, אלא להיכנס לתוקף מתי שcron אינו מתאים עבורינו. ואם אתם חוששים מביצועים, אז צריך להבין כי stalker עוזר לנו בכך שהוא מבצע פעולות בצורה מקבילה. הפתרון זמנים הזה ד"א נקרא clockwork.

וזה מה שיש לפינק פלויד להגיד בנושא.