הטמעת ארכיטקטורה מונחית-אירועים באמצעות AWS EventBridge

מערכות מפוזרות מחליפות ביניהן נתונים באיחור ובאובדנים — הזמנות, תשלומים והתראות מתפזרות בזמן. אנחנו מתכננים ומטמיעים חילופי אירועים ב-AWS כשירות מלא: מתרשים הזרימות ועד העברה לתמיכה ותחזוקה. בדיקות ידניות בין מערכות נעלמות, וזמני הטיפול בהזמנות מתקצרים.

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

ארכיטקטורה מונחית-אירועים ב-AWS: היכן נשברת הזרימה

שירותים שהתחילו כמודולים עצמאיים מתכסים במהירות בקריאות סינכרוניות: יצירת הזמנה מושכת תשלום, מחסן, התראות ואנליטיקה ישירות בתוך מטפל הבקשה. מקבל אחד שנפל עוצר את כל השרשרת, ובעומס שיא חלק מהאירועים לא מגיעים — המפרסם מקבל timeout, חוזר על הקריאה ומכפיל את הלחץ על שירות שכבר עמוס.

ניתוח של תקלה כזו נמתח על פני ימים, כי אין bus מרכזי וסכימת זרימות. לא ברור היכן האירוע אבד, האם המקבל עיבד אותו ובאיזה סדר הלכו הניסיונות החוזרים. הצימוד בין השירותים גדל באופן ריבועי: כל צרכן חדש דורש אינטגרציה נפרדת עם כל מפרסם, ותיקון החוזה הופך לתיאום בין צוותים.

ארכיטקטורה מונחית-אירועים הופכת את הסכימה הזו: המפרסם מפרסם אירוע פעם אחת, ה-bus לוקח על עצמו את הניתוב. ב-EventBridge כללי הסינון נבנים לפי מקור, סוג ותוכן האירוע — המקבלים לא יודעים זה על זה, וצרכן חדש מתחבר בכלל נפרד, בלי שינויים בקוד המפרסם.

אובדן אירועים עובר ממחלקת «לפעמים נעלם» לקטגוריית כשלים מנוהלים: ה-bus מבצע buffering לזרימה בשיא, חוזר על מסירה לפי לוח זמנים ומעביר הודעות שלא עובדו לתור נפרד לניתוח.

ארכיון האירועים מאפשר לשחזר את הזרימה לתקופה הנדרשת, ו-schema registry מקבע את פורמט ההודעה — שינוי לא תואם נתפס בעת הפרסום, ולא ברגע הכשל אצל המקבל.

מה נותן חילופי אירועים: אפקטים מדידים

האפקט של חילופי אירועים נבדק לא לפי מצגת, אלא לפי צ'ק-ליסט: זמן התגובה לאירוע עסקי, מספר השינויים בשירות-המקור בעת חיבור צרכן חדש, שיעור הכשלים שלא הגיעו למשתמש, וזמן השחזור של הזרימה לאחר כשל.

זמן תגובה לאירוע עסקי במקום ייצוא לילי

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

ניתוב אירועים ב-Amazon EventBridge מקצר את הפער לשניות: הפרסום ל-bus והמסירה למנוי קורים במחזור אחד, וכללי הסינון חותכים את המיותר לפני שהוא נכנס לתור הצרכן. אנחנו בודקים את האפקט לפי הזמן מפעולת הלקוח ועד השינוי במערכות המשיקיות — הוא יורד משעות ליחידות שניות.

צימוד רופף: הוספת צרכן בלי שינויים במקור

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

  • חוזה האירוע מתאר את הסוג, הגרסה וה-payload.
  • הניתוב והמסננים מוגדרים בצד ה-bus.
  • הודעות שלא נמסרו עוברות לתור ניסיונות חוזרים, ואינן אובדות בשקט.

יחד עם ייצוא בקבוצות נעלם סוג כשל נפרד — אי-סנכרון נתונים בין מערכות: האירוע או נמסר, או נרשם כשגיאה עם ניסיון חוזר.

סקירות בתעשייה מכנות את שיבוש החילופין בין מערכות אחת הסיבות היקרות ביותר להשבתה; אנחנו מודדים אותו לא בכסף, אלא בשיעור הפעולות שנתקעו בתוך שעה, ובזמן עד לשחזור הזרימה.

ארכיטקטורת הניתוב: אפשרויות ומגבלות

הבחירה במצב הניתוב קובעת מה יקרה לאירוע כאשר המקבל אינו זמין או דחה את ההודעה. להלן שלוש סכימות עובדות וההתנהגות שלהן בעת כשלים.

כללי בחירה וסינון לפי מאפיינים

כללי הניתוב מוגדרים באופן הצהרתי — לפי המקור והמאפיינים של האירוע. הסינון בצד ה-bus חותך תעבורה מיותרת לפני הקריאה למקבל, ולכן המנוי מקבל רק את הפרוסה שלו, ולא את כל הזרימה. מצבי המנוי שונים זה מזה: מסירה ממוקדת, שידור רחב וקריאה מתחרה, שבה כמה מופעים של השירות חולקים את הזרימה.

מה עושים עם הודעה שלא הצליחה להימסר

הבטחת מסירה אינה אומרת «תמיד נמסור» — היא אומרת שגורלו של כל אירוע ידוע. לאחר מיצוי הניסיונות החוזרים האירוע עובר לתור ההודעות שלא נמסרו, ומשם מריצים אותו מחדש באופן ידני או מנתחים את סיבת הכשל. בלי מעגל זה, כשל של מקבל הופך לאובדן נתונים שקט.

אפשרות מתי מתאימה מגבלות
מסירה ישירה מנקודה לנקודה מפיק אחד, צרכן אחד, זרימה מתונה אין חוצץ כאשר המקבל אינו זמין; צרכן חדש דורש שינויים אצל השולח
bus מרכזי עם כללי בחירה צרכנים רבים, לכל אחד הפרוסה שלו של האירועים נדרשת משמעת של סכימת האירועים; שגיאה בכלל חותכת בשקט את המנוי
היברידי: bus בתוספת תור הודעות שלא נמסרו תרחישים שבהם אובדן אירוע אינו קביל יותר רכיבים: נדרש נוהל לניתוח ולהרצה מחדש של התור

שלבי ההטמעה: מסכימת הזרימות ועד להעברה

מעבר לארכיטקטורה מונחית-אירועים ב-AWS מתחיל לא בהגדרת ה-bus, אלא במלאי הזרימות: תחילה מתעדים את המצב הקיים, אחר כך מתכננים את סכימת האירועים, ורק לאחר מכן מפעילים את הניתוב במעגל העבודה. ביקורת שהוחמצה עולה יותר מהמעבר עצמו — קשרים נסתרים בין שירותים צפים בעומס, כשהחזרה לאחור יקרה.

איך נראית ביקורת הזרימות

זה לא סקר בקרב המפתחים, אלא תיעוד (tracing): בודקים איזה שירות מפרסם אירוע, מי קורא אותו, ומה קורה במסירה חוזרת. התוצר — מפת זרימות עם הבעלים, התדירות והקריטיות של כל אירוע, בתוספת רשימת מנויים «מתים» ומסלולים כפולים שמנתקים לפני המעבר.

  1. מלאי של זרימות האירועים — מפה של מקורות, מנויים ובעלים, וגבולות הדומיינים.
  2. תכנון סכימות האירועים — חוזה אחיד, שדות חובה, ניהול גרסאות ותאימות לאחור.
  3. הגדרת ה-bus וכללי הניתוב — מסננים, תורי יעד, ניסיונות חוזרים, ותור ההודעות שלא נמסרו.
  4. הפרדת הרשאות — תפקידים נפרדים לפרסום ולמנוי, בידוד מעגלים, ואיסור על הרשאות רחבות.
  5. בדיקה בכשלים ובניסיונות חוזרים — מכבים מנוי, קוטעים את הקישור, משכפלים אירוע ובודקים כיצד המערכת משתקמת.
  6. העברה עם הדרכה — תיעוד, ניתוח תקלות, ומשמרת תורנות שלומדת לקרוא את מפת הזרימות.

בדיקות קבלה לפני ההפעלה

ההפעלה מוכנה כאשר ניסיון חוזר של אירוע אינו יוצר רשומה שנייה, הודעות שלא נמסרו חוזרות לעבודה, ושירות חדש מתחבר ל-bus בלי שינויים במאגרים של אחרים. בנפרד מריצים כשל של צומת: המערכת צריכה להתדרדר באופן צפוי, ולא לאבד אירועים בשקט.

קונפיגורציות, סכימות אירועים ונוהלי העברה

החבילה שנשארת אצל הלקוח לאחר ההפעלה היא תיעוד עבודה, ולא מצגת: לפיה משמרת התורנות מנתחת תקלה בלי המחבר של האינטגרציה. ב-bus מבוסס Amazon EventBridge הקונפיגורציה נשמרת בנפרד מהקוד של השירותים, ולכן אפשר לשנות את הניתוב וההרשאות בלי לשחרר גרסה של הצרכנים עצמם.

מדיניות גישה ותפקידי שירותים

  • קונפיגורציית ה-bus: כללי ניתוב, מסננים לפי סוג ומקור האירוע, וערוצים נפרדים לזרימות קריטיות ולרקעיות.
  • תיאור סכימות האירועים: הרכב השדות, גרסת החוזה וכלל התאימות לאחור — הוספת שדה אינה שוברת צרכנים קיימים.
  • מדיניות גישה: איזה תפקיד שירות מפרסם ומה קורא, הגבלה לפי ערוצים, הפרדת סביבות והרשאות נפרדות למנויי דיבוג.

תיעוד ונוהלי תמיכה

  • מפת זרימות: מי צורך את האירועים של מי, היכן נמצא ה-buffering ובאיזה קטע מופעל העיבוד החוזר.
  • נוהל עיבוד חוזר: מספר הניסיונות, המרווח ביניהם, התנאים להעברת אירוע לתור הלא-מעובדים וסדר ההפעלה מחדש הידנית.
  • סדר ניתוח הכשלים והוראות למשמרת התורנות: כיצד לנתק צרכן ולהריץ מחדש את הזרימה בלי לאבד אירועים.
  • תיעוד האינטגרציה: כיצד לחבר שירות חדש ואילו בדיקות לעבור לפני העלאה לסביבת הפרודקשן.

מקרה בוחן: כיצד יישרו את זרימת ההזמנות בין המערכות

מה היה קודם: התאמה ידנית וייצוא לילי

חנות מקוונת, מחסן וחיוב חיו על פלטפורמות שונות, והחילופין התנהלו בייצוא לילי ל-CSV. הזמנה יכלה להיתקע לשעות: אם הקובץ לא נאסף, על אי-ההתאמה למדו מהלקוח, ולא מהמערכת — התמיכה החלה לנתח לפני המהנדסים.

האובדנים הגיעו עד 4% מהפריטים בשבוע, וכל אי-התאמה הותאמה ידנית מול שתי טבלאות. בשיא המבצע הייצוא לא הספיק, וחלק מההזמנות חיכו לחלון הבא — ההשהיה הייתה תלויה בלוח הזמנים, ולא בעומס על השירותים.

מה קרה אחר כך: מדדים ומגבלות שנותרו

החלפנו את החילופין בקבוצות ב-bus אירועים: המערכת מפרסמת עובדה — «ההזמנה נוצרה», «התשלום אושר», «המשלוח נאסף» — והמנויים מקבלים אותה מיד. ה-bus היה AWS EventBridge עם כללי ניתוב ותור הודעות שלא נמסרו: האירוע או מגיע ליעד, או נכנס לניתוח, אבל לא נעלם בשקט.

המדדים אחר כך: שיעור האירועים שאבדו — 0 ברבעון לעומת 4%; זמן התגובה להזמנה — דקות במקום שעות; ניתוחים ידניים — 2 בשבוע במקום 30, וגם אלה בגלל נתונים מלוכלכים במקור, ולא בגלל המסירה.

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

במה נבדל חילופי אירועים מייצוא בקבוצות?

ייצוא בקבוצות עובד לפי לוח זמנים: המקור, פעם בשעה או פעם ביממה, יוצר פרוסת נתונים ומעביר אותה בשלמותה. חילופי אירועים בנויים אחרת — המקור מפרסם את עובדת השינוי ברגע שבו הוא התרחש, והמקבלים מושכים אותה בעצמם, בלי תשאול ובלי לוח זמנים משותף.

ההבדל בארכיטקטורה מורגש מיד בשלושה מקומות: השהיית התגובה, מחיר שינוי הסכימה וההתנהגות בעת כשל בצד המקבל.

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

מצב זמן אמת מקצר את ההשהיה לשניות: נוח להחזיק את ניתוב האירועים בין השירותים על bus מנוהל כמו AWS EventBridge, שבו כללי המנוי מוגדרים באופן הצהרתי, ולא בקוד בצד של כל צרכן.

שינוי בסכימת הנתונים פוגע בשני המצבים, אבל אחרת. במצב קבוצתי מספיק לתקן שאילתה אחת — כל הצרכנים יראו את מערך השדות החדש בבת אחת, אבל הם צמודים זה לזה: התיקון שובר את הדיווח עד שמתאמים אותו עם כולם.

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

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

המצב הקבוצתי נשאר בחירה סבירה במקום שבו התגובה אינה קריטית: התאמות לילה, אנליטיקה כבדה, ייצוא סדיר למחסן נתונים, חילופין עם מערכות שבאופן עקרוני אינן יודעות לקבל זרימה. הוא פשוט יותר לתפעול וצפוי יותר בעומס.

חילופי אירועים מנצחים במקום שבו תהליך עסקי נמשך דקות, ולא יממות, ובמקום שבו שינוי שאבד יקר יותר ממורכבות התשתית.

ספקות טכניים: אמינות, ניסיונות חוזרים, הרשאות

bus אירועים מוסר הודעה לפחות פעם אחת — הניסיון החוזר הוא המחיר של עמידות בפני נפילות של המקבל, ולא פגם. להלן חמש שאלות שצוותים שואלים אותנו ראשונות.

מה יקרה אם המקבל אינו זמין?

האירוע חוזר עם השהיה גדלה והולכת, עד שהמקבל עולה, ואז עובר לתור הלא-מעובדים. משם מחזירים אותו ידנית, והגידול של התור נראה בלוח הניטור.

איך לא לעבד אירוע פעמיים?

את המטפלים עושים אידמפוטנטיים לפי מפתח האירוע: ניסיון חוזר עם אותו מפתח מזוהה ואינו משנה מצב. את יומן המפתחות שהוחלו שומרים במקום שבו חשובה החלפת סטטוס או תשלום.

אפשר לחבר מערכת עובדת?

כן, בשכבת מעבר: ה-bus מקבל אירועים במקביל לזרימה הנוכחית, והמטפלים פועלים במצב תצפית. לאחר כמה ימים בלי אי-התאמות מנתקים את הזרימה הישנה.

איך להפריד גישה לזרימות נפרדות?

את ההרשאות תולים על כללי ה-bus ותפקידי האפליקציות: כל שירות מפרסם וקורא רק את סוגי האירועים שלו. סודות מנפיקים לשירות, ולא לצוות.

מי אחראי על ניתוח הכשל?

ארכיון עם חיפוש לפי מפתח וזמן מאפשר למצוא אירוע מסוים ולחזור עליו באופן ממוקד. מדדי ההשהיה ושיעור השגיאות מרכזים במסך אחד, כדי שהתורן יראה את הסטייה לפני העסק; את ניתוח התקלות מובילים אנחנו.

נדון בסכימת האירועים שלכם ונחזור עם תוכנית

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

מה לשלוח לצורך ההערכה:

  • רשימת מערכות המקור וצרכני האירועים, כולל שירותים חיצוניים ותורים;
  • דוגמה של אירוע אמיתי או ייצוא מהיומן — פורמט, מאפיינים, נפח ביממה;
  • צווארי בקבוק שכבר נראים לעין: השהיות, כפילויות, הודעות שאבדו, ניתוח ידני של כשלים;
  • דרישות להשהיית המסירה ולסדר העיבוד עבור זרימות קריטיות;
  • כללי הסינון והניתוב, הפרדת סביבות והרשאות בין המעגלים;
  • מצב התמיכה ב-bus: מי תורן וכיצד מגיבים לכשל של כלל או לאירוע מורעל.

בתגובה תקבלו מפת זרימות עם נקודות כשל וחוצצים, תוכנית שלבים — מהעברת המסלולים הראשונים ועד להוצאה משימוש של הישנים והעברת ה-bus לתמיכה — והערכה של לוחות זמנים. מכאן ההחלטה בידיים שלכם: אנחנו מוכנים להתחיל מהקטע שבו האפקט נראה הכי מהר.