תורים לעומת נושאים: בחירת דפוס ההודעות הנכון ב-Azure Service Bus
By Mirko Peters ·
ברוכים השבים לבלוג הנלווה לפודקאסט! בפרק האחרון שלנו צללנו לעומק היסודות של הודעות בענן. אם עוד לא הספקתם…
Automatically translated with AI from the original post. Read the English original

ברוכים השבים לבלוג הנלווה לפודקאסט! בפרק האחרון צללנו לעומק היסודות של מסרים בענן. אם עוד לא הספקתם להאזין, כדאי לבדוק את הפרק Azure Service Bus - Simply Explained. היום נרחיב על אחת ההחלטות הארכיטקטוניות המשמעותיות ביותר שתקבלו בבניית יישומים מבוזרים: הבחירה בין תורים (queues) לנושאים (topics) ב-Azure Service Bus. הבנה של ההבדלים הדקים בין שני דפוסי ההודעות האלה תעזור לכם לתכנן מערכות עמידות, מדרגיות וקלות יותר לתחזוקה.
מבוא ל-Azure Service Bus ולדפוסי הודעות
ככל שיישומים מודרניים עוברים מארכיטקטורות מונוליתיות לתכנונים מבוזרים מבוססי מיקרו-שירותים, הצורך בתקשורת אמינה הופך לקריטי. שירותים אינם יכולים להסתמך על קריאות HTTP סינכרוניות לכל דבר; כך נוצר צימוד הדוק, כשלים מדורגים וצווארי בקבוק בביצועים. כאן נכנסים לתמונה מתווכי הודעות בענן.
Azure Service Bus פועל כמתווך הודעות ארגוני מנוהל במלואו, המנתק בין יישומים ושירותים. מכיוון שהיצרנים שולחים הודעות בלי צורך לדעת מי הצרכן – או even אם הצרכן זמין כרגע – Azure Service Bus מבטיח זמינות גבוהה ואיזון עומסים חלק. עם זאת, ברגע שבחרתם להשתמש ב-Azure Service Bus, אתם נתקלים מיד בשאלת תכנון מרכזית: האם אני צריך תור או נושא?
מהו Azure Service Bus?
לפני שנצלול להבדלים בין תורים לנושאים, כדאי להבין מה Azure Service Bus עושה בפועל. בבסיסו, Azure Service Bus הוא מתווך הודעות ששומר הודעות בצורה מאובטחת במרחב שמות (namespace) עד שיישום מקבל מוכן לעבד אותן. הוא מספק תכונות חזקות כמו ערבויות אספקה של לפחות פעם אחת (at-least-once), ניהול סשנים, העברה למכתבים מתים (dead-lettering) ותזמון משלוח הודעות.
בסביבת הענן, Azure Service Bus מגשר על הפער בין רכיבים שונים ביישום שלכם. בין אם מדובר בעיבוד הזמנות מסחר אלקטרוני, טיפול בנתוני טלמטריה מהאינטרנט של הדברים (IoT) או תיאום אינטגרציות של מערכות תכנון משאבי ארגון (ERP), Service Bus מספק את העמידות וכוח העיבוד האסינכרוני הנדרשים כדי לשמור על זרימת הנתונים חלקה.
תורים לעומת נושאים: ההחלטה הארכיטקטונית המרכזית
ההבדל הבסיסי בין תורים לנושאים נובע מדפוס ההודעות שהם תומכים בו: נקודה-לנקודה לעומת פרסום/הרשמה (publish/subscribe). בחירה שגויה בדפוס עלולה להוביל לשכתוב ארכיטקטוני, לבעיות בשכפול נתונים או לצווארי בקבוק בהרחבה בהמשך הדרך.
תור מספק מודל תקשורת אחד-לאחד. כששולחים הודעה לתור, בדיוק צרכן אחד יקרא ויעבד את ההודעה. לעומת זאת, נושא מספק דפוס תקשורת אחד-לרבים. כשמפרסמים הודעה לנושא, היא מופצת למספר מנויים, ומאפשרת לכמה שירותים downstream עצמאיים לקבל ולעבד עותק של אותה הודעה בדיוק.
הבחירה בין שני הדפוסים תלויה לחלוטין בדרישות העסקיות שלכם. האם יש לכם עומס עבודה יחיד שצריך להתפזר בין מופעי עובדים לצורך איזון עומסים, או שיש לכם מספר מערכות שונות שכולן צריכות להגיב לאירוע עסקי אחד?
צלילה לעומק תורים של Service Bus
תורי Service Bus הם הסוס העובד של המסרים הארגוניים המסורתיים. הם מתוכננים לתרחישים שבהם משימה אחת צריכה להתבצע פעם אחת ורק פעם אחת על ידי מאגר עובדים.
כששולחים הודעה לתור, היא נשארת בו עד שמקבל שולף אותה. תורים אוכפים כברירת מחדל סדר אספקה מסוג FIFO (נכנס ראשון, יוצא ראשון). מה שהופך אותם לאידיאליים לארכיטקטורות מונעות פקודות, שבהן הסדר חשוב – כמו עיבוד תשלומים או ביצוע שלבים סדרתיים בתהליך עבודה.
יתרה מכך, תורים מצטיינים באיזון עומסים. אם היישום שלכם חווה קפיצה עצומה בתעבורה, בקשות נכנסות יכולות להצטבר בתור בבטחה, מבלי להעמיס על משאבי המחשוב של הצד האחורי. שירותי העובדים יכולים אז לשלוף הודעות מהתור בקצב יציב ובר-קיימא.
שליטה בנושאים ובמנויים
בעוד שתורים מטפלים במשלוח פשוט מנקודה לנקודה, נושאים (topics) פותחים את הדרך לארכיטקטורות פרסום/הרשמה (pub/sub). נושא משמש כנקודת קצה לשליחת הודעות, אך אינו יכול להחזיק הודעות בעצמו ללא מנויים.
כדאי לחשוב על מנוי (subscription) כעל תור וירטואלי המחובר לנושא. כאשר הודעה מפורסמת לנושא, עותק שלה נמסר לכל מנוי פעיל. כל שירות צורך יוצר מנוי משלו לנושא, וכך יכול לעבד את ההודעה באופן עצמאי משאר הצרכנים.
לדוגמה, נניח אירוע של הזמנה בפלטפורמת מסחר אלקטרוני. כאשר לקוח מבצע הזמנה, המערכת מפרסמת הודעה מסוג OrderPlaced לנושא. לשירות המלאי יש מנוי לעדכון רמות המלאי, לשירות החיוב יש מנוי לעיבוד התשלום, ולשירות ההודעות יש מנוי לשליחת אישור הזמנה בדוא"ל. כל שלוש המערכות מקבלות את האירוע בו-זמנית, מבלי להפריע זו לזו.
סינון הודעות וגמישות
אחת היכולות החזקות ביותר של נושאים ב-Azure Service Bus היא סינון הודעות. בתרחישי pub/sub רבים, מנוי אינו רוצה כל הודעה שמפורסמת לנושא, אלא מתעניין רק בתת-קבוצה ספציפית של נתונים.
Azure Service Bus מאפשר להגדיר כללים ומסננים על מנויים בעזרת תחביר דמוי SQL או מאפייני מתאם (correlation properties). לדוגמה, ניתן להגדיר מנוי כך שיקבל רק הודעות שבהן המאפיין Region שווה ל-NorthAmerica, או שבהן המאפיין OrderAmount עולה על סף מסוים.
יכולת הסינון הזו שומרת על תעבורת הרשת קלילה ומבטיחה שצרכנים במורד הזרם יעבדו רק את הנתונים הרלוונטיים עבורם, מה שמפחית באופן משמעותי עומס מחשוב מיותר.
טיפול בכשלים באמצעות תורי מכתים שלא נמסרו (Dead-Letter Queues)
ללא קשר לשימוש בתורים או בנושאים, מערכות מבוזרות נוטות לכשלים. מה קורה כאשר הודעה פגומה, מסד נתונים במורד הזרם יוצא משירות, או יישום קורס שוב ושוב בניסיון לעבד הודעה מסוימת?
Azure Service Bus מטפל בכך בצורה מתוחכמת באמצעות תורי Dead-Letter (DLQ). לכל תור ולכל מנוי של נושא יש תור משני משויך הנקרא dead-letter queue. אם עיבוד הודעה נכשל יותר מדי פעמים (חריגה ממספר מירבי של ניסיונות מסירה) או שהיא פגה, Service Bus מעביר אוטומטית את ההודעה ל-DLQ.
מנגנון זה מבודד "הודעות רעילות" (poison messages) כך שלא יחסמו את צינור העיבוד הראשי. מהנדסים יכולים לבדוק את ה-DLQ, לנתח את סיבת הכשל, לתקן את הבאג שבבסיס, ולאחר מכן להגיש מחדש את ההודעה לתהליך הראשי לעיבוד מוצלח.
שיטות עבודה מומלצות לתכנון יישומים מבוזרים
כדי להפיק את המרב ממימוש Azure Service Bus שלכם, חשוב מאוד לפעול לפי שיטות העבודה הארכיטקטוניות המקובלות:
- בידוד סביבות: השתמשו במרחבי שמות (namespaces) נפרדים של Service Bus לסביבות פיתוח, בדיקות וייצור, כדי למנוע התפשטות כשלים בין הסביבות.
- יישום Infrastructure as Code: הגדירו את התורים, הנושאים, המנויים והמסננים שלכם באמצעות תבניות ARM, Bicep או Terraform כדי להבטיח פריסות עקביות.
- קביעת מדיניות שמירה מתאימה: הגדירו את זמן החיים (TTL) של ההודעות ואת משכי הנעילה בהתבסס על הצרכים העסקיים בפועל, במקום להסתמך על מקסימומים ברירת מחדל.
- ניטור והתראות: השתמשו ב-Azure Monitor וב-Application Insights כדי לעקוב אחר מדדים כגון מספר ההודעות, הודעות dead-letter פעילות וזמן האחזור של השרת.
סיכום: בחירת הדפוס הנכון לארכיטקטורה שלכם
בחירת דפוס ההודעות הנכון ב-Azure Service Bus היא הבסיס לבניית יישומי ענן עמידים וסקלאביליים. השתמשו בתורים כאשר אתם צריכים מנגנון אמין מנקודה לנקודה בין אחד לאחד, לאיזון עומסים ולעיבוד משימות ברצף. בחרו בנושאים ובמנויים כאשר אתם צריכים מודל פרסום/הרשמה לשידור אירועים למספר מערכות עצמאיות.
כדי לשמוע עוד דיונים על ארכיטקטורת ענן, אבטחה ודפוסי פיתוח מודרניים, הקפידו להאזין לפרק המלא: Azure Service Bus - Simply Explained. שילוב נכון של דפוסי ההודעות האלה יבטיח שיישומי הענן שלכם יישארו חזקים, גמישים ומוכנים להתרחבות בכל עומס עבודה.