On this page
מערך שיעור: RabbitMQ
משך: 2.5 שעות אקדמיות (113 דקות).
מטרת השיעור: הסטודנטים ידעו להשתמש ב-RabbitMQ לחלוקת משימות בין workers, ולהסביר את ההבדל בינו לבין Kafka.
בסוף השיעור הסטודנטים צריכים: לפרסם ולצרוך הודעות מתור RabbitMQ, להשתמש נכון ב-Acknowledgment (ack/nack), ולהסביר מתי RabbitMQ מתאים יותר מ-Kafka ולהפך.
דגש קריטי: ההבדל בין RabbitMQ (תור עבודות, כל הודעה ל-worker אחד) לבין Kafka (יומן אירועים, שידור לכולם) הוא הציר המרכזי של השיעור — כל דוגמה צריכה לחזק אותו.
מהלך השיעור
| חלק בשיעור | משך | הערות ודגשים |
|---|---|---|
| פתיחה וחיבור | 5 דקות | הזכירו את Kafka משיעור התקשורת — “מה אם רוצים שרק worker אחד יטפל בכל הודעה?” |
| הבעיה: מי מטפל במשימה | 10 דקות | הדגימו קריאה חוסמת ל-Email Service, שאלו “מה אם יש 3 מופעים?” |
| הרעיון: Work Queue | 15 דקות | תור + כמה workers מתחרים, כל הודעה ל-worker אחד בלבד |
| קוד: Producer | 15 דקות | ConnectionFactory, QueueDeclareAsync, BasicPublishAsync |
| קוד: Consumer + Acknowledgment | 20 דקות | ack מול autoAck — הדגישו את הסיכון ב-autoAck:true |
| עמידות (Durability) | 15 דקות | durable + Persistent — מה קורה בלעדיהם |
| RabbitMQ מול Kafka | 15 דקות | טבלת השוואה חיה, קשרו לשיעור התקשורת הקודם |
| תרגול מודרך | 18 דקות | תרגיל 1+2 + פתיחת הפרויקט המסכם |
דגשים להעברת השיעור
- השלב הכי קריטי להבנה:
autoAck: falseולמה. הדגימו תרחיש קונקרטי — worker קורס באמצע עיבוד הודעה עם autoAck:true, ההודעה “נעלמה” לצמיתות. אותו תרחיש עם autoAck:false — ההודעה חוזרת לתור. - אל תתנו לזה להישמע כמו “עוד Kafka” — RabbitMQ ו-Kafka פותרים בעיות שונות. הדגישו: Kafka = “כולם רואים הכל” (broadcast/log), RabbitMQ = “מישהו אחד מטפל בכל דבר” (task distribution).
- קשרו במפורש לשיעור התקשורת הקודם — שם הוחלט “sync או async”, כאן מוסיפים ניואנס בתוך async: “שידור לכולם (Kafka) או חלוקת עבודה (RabbitMQ)?”
מושגים
Queue — תור הודעות שממתינות ל-worker פנוי. Producer / Consumer — שולח משימה / מעבד אותה. Acknowledgment (ack) — אישור מפורש שההודעה טופלה בהצלחה. Work Queue — תבנית של workers מתחרים, כל הודעה ל-worker אחד בלבד.
תרגיל חשיבה
שאלת פתיחה: “אם 3 workers רצים על אותו תור email-tasks, ו-worker אחד קורס תוך כדי עיבוד הודעה — מה קורה להודעה הזו?”
מהלך: הובילו את הסטודנטים למסקנה: אם autoAck היה false (המומלץ), RabbitMQ מזהה שה-worker התנתק בלי לאשר, ומחזיר את ההודעה לתור — worker אחר (מבין שני הנותרים) יקבל אותה וינסה שוב. אם autoAck היה true, ההודעה כבר נמחקה מהתור ברגע שנשלחה ל-worker שקרס — היא אבודה לצמיתות, גם שהמייל מעולם לא נשלח.
מה המרצה מראה בסוף: הדגימו live — הריצו 2 workers, שלחו כמה משימות, “הרגו” worker אחד (Ctrl+C) באמצע עיבוד הודעה, והראו שה-worker השני מקבל אותה מחדש תוך שניות. הניגוד החי בין autoAck:true ל-false מבסס את זה טוב יותר מכל הסבר תיאורטי.