RU EN HE
אודות פרויקטים בלוג
← חזרה לבלוג
קונטיינריזציה ו-Podman

בניית Worker מרובה תורים עם RQ ו-Podman

מבוא

במערכות עם מקורות משימות מרובים — Jira, Asterisk, Telegram — יש צורך בעיבוד מרכזי דרך עובד יחיד. RQ (Redis Queue) מספק מנגנון אלגנטי של האזנה למספר תורים, שאנחנו משלבים עם שליחת קונטיינרים דרך Podman.

מבנה התצורה

כל ניתוב המשימות מוגדר ב-config.yaml. כל תור ממופה לתמונת קונטיינר ספציפית ופקודה. זה מאפשר גמישות מלאה — שינוי הקונטיינר המעבד דורש רק עדכון קובץ התצורה.

# config.yaml
queues:
jira:
image: localhost/jira-processor:latest
command: [“python”, process.py]
asterisk:
image: localhost/asterisk-handler:latest
command: [“python”, “handle_call.py”]
telegram:
image: localhost/tg-worker:latest
command: [“python”, “tg_task.py”]

RoundRobinWorker

העובד הסטנדרטי של RQ מעבד תורים לפי עדיפות — התור הראשון תמיד מקבל עדיפות. לחלוקת עומס שווה, אנחנו משתמשים ב-RoundRobinWorker מותאם אישית שמסובב את התורים אחרי עיבוד כל משימה.

פונקציית run_container_task

פונקציית השליחה המרכזית מקבלת נתוני משימה ומפעילה את הקונטיינר המתאים. הנתונים מועברים דרך stdin בפורמט JSON, והתוצאה נקראת מ-stdout. גישה זו מבטיחה בידוד מלא.

העברת נתונים דרך stdin/stdout

הבחירה ב-stdin/stdout להחלפת נתונים היא מכוונת. גישה זו מבטיחה בידוד מלא: הקונטיינר לא צריך גישה למערכת הקבצים או לרשת כדי לקבל את המשימה שלו. סריאליזציית JSON מבטיחה תאימות בין שפות ופריימוורקים שונים בתוך הקונטיינרים.

טיפול בשגיאות

לכל שלב יש מנגנוני טיפול בשגיאות משלו. RQ מספק ניסיונות חוזרים ברמת התור, הקונטיינר מבודד כשלים מהעובד הראשי, ו-subprocess.run עם timeout מונע תקיעות מבעיות בתוך הקונטיינר.

תבניות לוגים

לוגים מובנים עם הקשר משימה מאפשרים מעקב אחר כל נתיב העיבוד — מכניסה לתור ועד סיום בקונטיינר. אנחנו משתמשים בפורמט JSON ללוגים לניתוח ואגרגציה נוחים.

סיכום

עובד RQ מרובה תורים עם שליחת קונטיינרים הוא תבנית חזקה לעיבוד משימות הטרוגניות. תצורת YAML מספקת גמישות, Podman מספק בידוד, וה-RoundRobinWorker מבטיח חלוקת עומס שווה.