מבוא
כשמבצעים אוטומציה של משימות הטרוגניות, נוצרת תבנית נפוצה שבה עובד Python צריך להפעיל קונטיינרים שונים בהתאם לסוג המשימה. במקום לקודד כל קונטיינר, אנחנו יוצרים dispatcher אוניברסלי המונע על ידי תצורת YAML.
תצורת YAML עם סעיף Runners
כל ניתוב המשימות מוגדר בקובץ config.yaml. כל runner ממופה לתמונת קונטיינר, פקודה, ארגומנטי Podman ו-timeout. הוספת סוג משימה חדש דורשת רק הוספת ערך חדש בתצורה.
מנהל הקשר EphemeralContainer
מנהל ההקשר מטפל במחזור החיים המלא של הקונטיינר — מיצירה ועד הסרה. הוא מייצר שם ייחודי לכל הרצה, מעביר נתונים דרך stdin ומבטיח ניקוי בבלוק finally.
העברת JSON דרך stdin
נתוני המשימה מסודרים ל-JSON ומועברים דרך stdin של הקונטיינר. הקונטיינר קורא stdin, מעבד את הנתונים וכותב את התוצאה ל-stdout. גישה זו מבטיחה בידוד מלא ואוניברסליות.
לכידת תוצאות מ-stdout
תוצאת העיבוד מנותחת מ-stdout של הקונטיינר. Stderr משמש ללוגים ודיבאג. בקודי החזרה שאינם אפס, נזרקת חריגה עם תוכן stderr.
טיפול בשגיאות עם בלוקי finally
בלוק ה-finally במנהל ההקשר מבטיח הסרת קונטיינר גם במהלך חריגות. זה מונע דליפת משאבים.
אינטגרציה עם RQ
המשימה האוניברסלית ל-RQ היא טריוויאלית — היא מקבלת שם runner ונתונים, טוענת את התצורה ומפעילה את הקונטיינר המתאים.
סיכום
dispatcher קונטיינרים אוניברסלי הוא פתרון אלגנטי למערכות עם משימות הטרוגניות. תצורת YAML, מנהלי הקשר והעברת נתונים דרך stdin/stdout מספקים גמישות, אמינות ובידוד ביצוע מלא.