# מערך שיעור: 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 מבסס את זה טוב יותר מכל הסבר תיאורטי.
