משך: 2.5 שעות אקדמיות (113 דקות).

מטרת השיעור: הסטודנטים ידעו להשתמש ב-RabbitMQ לחלוקת משימות בין workers, ולהסביר את ההבדל בינו לבין Kafka.

בסוף השיעור הסטודנטים צריכים: לפרסם ולצרוך הודעות מתור RabbitMQ, להשתמש נכון ב-Acknowledgment (ack/nack), ולהסביר מתי RabbitMQ מתאים יותר מ-Kafka ולהפך.

דגש קריטי: ההבדל בין RabbitMQ (תור עבודות, כל הודעה ל-worker אחד) לבין Kafka (יומן אירועים, שידור לכולם) הוא הציר המרכזי של השיעור — כל דוגמה צריכה לחזק אותו.


מהלך השיעור

חלק בשיעורמשךהערות ודגשים
פתיחה וחיבור5 דקותהזכירו את Kafka משיעור התקשורת — “מה אם רוצים שרק worker אחד יטפל בכל הודעה?”
הבעיה: מי מטפל במשימה10 דקותהדגימו קריאה חוסמת ל-Email Service, שאלו “מה אם יש 3 מופעים?”
הרעיון: Work Queue15 דקותתור + כמה workers מתחרים, כל הודעה ל-worker אחד בלבד
קוד: Producer15 דקותConnectionFactory, QueueDeclareAsync, BasicPublishAsync
קוד: Consumer + Acknowledgment20 דקותack מול autoAck — הדגישו את הסיכון ב-autoAck:true
עמידות (Durability)15 דקותdurable + Persistent — מה קורה בלעדיהם
RabbitMQ מול Kafka15 דקותטבלת השוואה חיה, קשרו לשיעור התקשורת הקודם
תרגול מודרך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 מבסס את זה טוב יותר מכל הסבר תיאורטי.