Table of Contents
ארכיטקטורות מונחות אירועים מסתמכות על זרימת הנתונים האמינה והעקבית בין יצרנים וצרכנים.כאשר מערכות מתפתחות, המבנה של נתוני אירוע - הschema שלו - שינויים בלתי צפויים בתחומים חדשים מתווספים, שדות ישנים מפוטרים, ולפעמים מודלים שלמים של נתונים משתנים, ללא אסטרטגיה מכוונת לניהול שינויים אלה, מערכות מונחות אירועים יכולים להפוך לערעור, מהגרי שגיאות deserialization, אובדן נתונים, או הדבקה של שיטות פעולה שגויות באופן עצמאי, תוך שמירה על תפקוד של מערכת הפעלה זו.
הבנת אירועים
(הגרסה של אירוע היא הנוהג של זיהוי ועקב אחר גרסאות נפרדות של צ'מה אירוע כך שיצרנים וצרכנים יכולים לפעול יחד בשלבים שונים של האבולוציה.המטרה המרכזית היא להבטיח שניתן לפרש אירועים באופן נכון ללא קשר למתי הם הופקו או על ידי איזו גירסה של מפיק.זה דורש הן FLT:0backward compatanceFLT:1 (החדש יכול לקרוא אירועים שנוצרו על ידי יצרנים ישנים) ו-F2 LT אירועים חדשים (התיקים יכולים לקרוא:
ניתן ליישם את הגירסה ברמות שונות:
- (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (ב) ,0) ,4 , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (FLT:0) מהנתונים גרסה של 1FLT - מידע גרסה מאוחסן בראשי הודעות או מטא-נתונים המעטפות, בנפרד מהעומס.זה שומר על עומס השכר נקי, אך דורש מהצרכן לפצח את ראש לפני שתקראו את הגוף.
לכל גישה יש התאמות מסחר. Schema גירסה של ניהול סכימה ועושה בדיקות תאימות קל יותר, אבל זה לעתים קרובות דורש מחאות רישום בצקת זמן ריצה. Payloading הוא פשוט ליישם ולעבוד במערכות ללא מרשם, אבל זה יכול לנפח את המטען ודורש טיפול זהיר של שדות. Metadata שומרת על schload schema נקי אבל מוסיף מורכבות לשותפים של הצרכנים הראשוניים כדי לשלב את התרחישים הטובים ביותר.
אסטרטגיות ל- Schema Evolution
אבולוציה של שema היא מערכת כללים ושיטות ששולטות כיצד הסכימות משתנות לאורך זמן תוך שמירה על תאימות.אסטרטגיות הבאות מהוות את הבסיס של תוכנית אבולוציה חזקה של סכמה.
המונחים:
השתמש בשפה רשמית של schema ומכשיר אימות כדי לאכוף את כללי מבנה הנתונים.הבחירה הפופולרית ביותר היא (FLT:0)JSON SchemacioFLT:1, FLT:2Apache AvroFLT 3: ופרוטוקול Buffers (Probuf) שפות אלה מספקים מנגנונים בנויים לאבולוציה, כגון ערכי ברירת מחדל, שדות אופציונליים, והתאמה אישית אשר מבטיח כל מקרי שחיתות הצפויה.
חזרה Compatibility
שינוי סכימה תואם לאחור אם צרכן שנכתב עבור הschema החדש עדיין יכול לקרוא אירועים המיוצרים על ידי הסקה הישנה.הטכניקות הנפוצות ביותר כוללות:
- (ב) ,0) הוספת שדות אופציונליים (FLT:1) - שדות חדשים צריכים להיות אופציונליים עם ברירת מחדל הגיונית (למשל, FLT:2 או אפס ערך).
- (ה)התאמת ערכים חדשים של ⁇ 1 (FLT:1) ניתן להוסיף ערכים חדשים, כל עוד הם לא לשבור לוגיקה קיימת.צרכנים חייבים להתמודד עם ערכים לא ידועים בחסד.
- (ב) ,0) שדות מ"מ ללא יכולת הפיכה" 1 - שינוי שדה נדרש לאופציונלי תואם לאחור; הפוך הוא שינוי שובר.
- (ב) ,0) ,5 ,5 , 000 , ההרחבה של שדה (למשל, ההרחבה של ההרחבה 3: ,FLT:4, FLT:5 ;5 ; ; ההרחבה של ההרחבה) היא לעתים קרובות בטוחה, אך צריבה עלולה לגרום לאובדן נתונים.
המונחים: Compatibility
תאימות קדימה מבטיחה כי צרכנים מבוגרים יכולים לקרוא אירועים המיוצרים על ידי מפיק חדש יותר.זה קשה יותר להשיג כי הצרכן לא יודע על שדות זה לא תוכנן לצפות.אסטרטגיות כוללות:
- (ב) [ה] [ה]]: [הקוראים] צריכים להתעלם משדות לא ידועים במהלך ההתפלה.רוב הפורמטים של סכימה תומכים בכך: אפשרות של אבולו 7: אפשרות, Protobuf's [8] ושימור שדה לא ידוע, ו-JSON Schema's FLT:9 .
- (FLT:0) ערכי קודמו עבור שדות חדשים: מפיקים עשויים למפות שדות חדשים עם ערכי ברירת מחדל כאשר הצרכן לא יכול להשתמש בהם, אבל זה באמת דאגה תאימות לאחור.
- (FLT:0) ביטול שינויים מבניים (FLT:1) - שדות רנמינג, סוגים משתנים, או ארגון מחדש מבנים מזוינים בדרך כלל שוברים תאימות קדימה.
גרסה ב Metadata
מידע גרסה Embedding ב Headers או a bitper מקלקל את הגרסה מן ה- schema.תבנית נפוצה היא להשתמש ראשי תיבות של FLT:10 או משטח העטיפה של Apache Headers או שדה FLT:11 באובייקט המעטפה. גישה זו מאפשרת יצרנים וצרכנים להתמודד עם schema בשכבה מבלי לשנות את schload עצמו.
« « «
[הרישום] הוא שירות מרכזי המאחסן ומאמת את הצ'מות בגרסאות מרובות.הוא לאכוף את חוקי תאימות (למשל, אחורה, קדימה, מלא או אף אחד) ומספק דרך לצרכנים לאחזר את הצ'מה הנדרשת כדי לדחות בדיקות תאימות (FLT:0Confluent Schema RegistryFLT:1 הוא הנפוץ ביותר עבור מערכות מבוססות קפקא, אך הם מאפשרים רישום אוטומטי של Microsoft.
יישום גרסאות בפרקטיקה
מעבר מהתאוריה ליישום דורש בחירות קונקרטיות על פורמטים של סידוריזציה, כלי ותהליכים.הפרקטיקות הבאות הוכחו במערכות מונחות על ידי ציוד גבוה, מערכות מונחות אירוע הייצור.
בחירת פורמט Serialization
פורמט הסידורי קובע כיצד מוגדרים סכימות, כיצד הן מתפתחות, ומה תאימות מבטיחה לך להגיע.כאן השוואה בין שלוש האפשרויות המובילות:
- (FLT:0)Apache AvroFLT:1 - מיועד לאבולוציה של סכימה. תומך לאחור, קדימה, ומזגי תאימות מלאים. השתמש בפורמט בינארי קומפקטי עם קליטה חזקה. ובכן משולב עם Confluent Schema הרישום. Best for Java-centric קפקאs.
- (FLT:0)Protocol Buffers (Protobufíve)FLT:1 - תומך גם באבולוציה באמצעות מספרי שדה ושדות אופציונליים. יעיל יותר מאשר Avro עבור כמה עומסי עבודה. עובד טוב במערכות פוליגלובט עם כללי תאימות GRPC.
- (ה) [ה]ה' [ה'], [ה'], [ה'], [ה']'[ה]']'[ה']'[ה]']'[ה']'[ה']'[ה']'[ה']'[ה']'[ה']']'[ה']']'[ה']'[ה']']']'[ה'[ה']'[ה'[ה']']'[ה'[ה'[ה'[ה']'[ה']']']'[ה'[ה'[ה'[ה']']']']'[ה']']'[ה'[ה'[ה'[ה']']']']']'[ה'[ה']']'[ה']']'[ה']']'[ה'[ה']'[ה'[ה'[ה']']']'[ה']']'[ה'[ה']']'[ה'[
בארגונים רבים, הבחירה כבר מוגבלת על ידי תשתיות קיימות.אם אתה מתחיל טרי, Avro מציעה את הכלי הבוגר ביותר schema אבולוציית אבולוציה עבור הזרמת אירוע, בעוד Protobuf הוא מתחרה חזק לתקשורת מיקרו-שירותים.
שמירה על התאמות
ככל שמספר הגרסאות והגרסאות גדל, הוא הופך חיוני לתעד אילו גרסאות תואמות את אשר. A compatibility matrix מפות מפיק schema גרסאות לגרסאות של צ'מה צרכנית, מה שמדגיש כל הידוע במיומנות. matrix זה יכול להיות מוחזק כקובץ YML ב-schema repository שלך או שנוצר באופן אוטומטי על ידי מרשם schema זה משמש ככלי תקשורת עבור צוותים אוטומטיים של אמת ובדיקה.
לדוגמה, ממטריקס עשוי להקליט כי FLT:14 הוא תואם לאחור עם (FLT) 15 אבל לא קדימה תואם, כלומר צרכנים ישנים ישבור אם הם יקבלו אירועי v2. זה כוחות מתגבש: או כל הצרכנים משודרגים לפני כל יצרן מפרסם v2, או המפיק ממשיך לשלוח אירועים v1 עד שהצי הצרכני מוכן.
בדיקות תאימות אוטומטית
בדיקות ידניות עבור תאימות סכימה במהירות להיות בלתי ניתן למדידה. integrate schema אימות ואימות בדיקות לתוך צינורות CI /CD שלך. כל פעם מפיק משנה schema, הצינור צריך:
- לרשום את הschema החדשה נגד הרישום של סצמה עם מצב תאימות מוגדר.
- אם הרישום נכשל, להערים על הבנייה ודרוש מהקבוצה לתקן את הschema (או להתנגש במפורש בגרסת האירוע).
- הפעל בדיקות אינטגרציה עם צרכנים בפועל לממש את הschema החדשה כדי לתפוס בעיות במשרה מלאה.
- אם יצליח, לפרסם את הגרסה החדשה של סכימה יחד עם כניסה לשינוי.
כלי פגז (FLT:0) תוסף MavenueFLT:1 או (FLT:2 פגז תסריטים קליפים סלולריים FLT 3: (ועכשיו GitHub Actions) יכול להפוך את זה.
תקשורת ותיעוד
שינויים של שema הם חוזים API בלתי חוקיים.יש לתקשר בדיוק כמו כל שינוי API אחר.לשמור על שינוי עבור כל סוג אירוע, לא משנה מה השתנה, למה, ומה תאימות מבטיחה ליישם. השתמש בכלי תיעוד סכימה (למשל, Backשלב, אתר שנוצר מרישום הschema שלך) כך שצוותים יכולים לגלוש schemasschemass והיסטוריית שלהם כאשר שינוי הוא בבירור, להבטיח את כל הלקוחות החדשים, הם מציעים מראש, הם מספקים מראש, הוא מבטיח, הוא, הוא, הוא, הוא, הוא, הוא, הוא מבטיח, הוא, הוא גם חלון הגירה, הוא גם חדש, הוא, הוא מבטיח, הוא מבטיח, הוא, הוא, הוא, הוא מבטיח, הוא, הוא, הוא מבטיח, הוא גם חדש, הוא, הוא, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, כדי לאפשר את כל כך, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, כדי כי צוותים, 000
שינויים שוברים
למרות המאמצים הטובים ביותר להימנע מהם, שינויים פורצים לפעמים חייבים לקרות (למשל, שינוי שדה, שינוי סוג נתונים, ארגון מחדש אובייקטים מקוננות).
- (ב) [ה]הנושא המובא [ה] [ה] [ה] [ה] [ה] [ה] [ה] [ה] [ה]] [ה] [ה]]]] [ה]]], [ה], [ה], [ה] [ה],] בעוד צרכנים זקנים ממשיכים לקרוא מהנושא הישן, זוהי תשתית נקייה אך משוכפלה, ודורשים לצרכנים להירשם לשתי הנושאים במהלך הגירה.
- (FLT:0) גרסת הגרף (FLT:1) - שמור על אותו נושא אך להגדיל את מספר הגירסה העיקרי של האירוע.צרכנים חייבים לבדוק את הגרסה ולהחליט כיצד להתפלות.זה נמנע מהפצת נושא, אך מוסיף לוגיקה מתחום הצרכנים.
- (FLT:0) כותב מילולית: "בתקופה של מעבר, המפיק פולט את שני פורמטי האירוע הישנים והחדשים.זה משמש לעתים קרובות כאבן ממדרגה בעוד הצרכנים נודדים.זה מכפיל תנועה ומגביר מורכבות, כך שזה צריך להיות זמני.
כל דרך שתבחר, תמיד תתחברו לשינוי השבירה עם מדיניות ניתוק ברורה וגלגל מעקב.
שיקולים מתקדמים
כאשר הגירסה של אירוע ו-schema אבולוציה מתערבת עם מיקור אירועים, סביבות פוליגלובט, או חנויות אירועים מיוחדים, ניואנסים נוספים מתעוררים.
אירוע Sourcing and Schema Evolution
במערכות ממומנות, אירועים הם מקור האמת ולעולם אינם נמחקים או משתנים.האבולוציה של שema הופכת לדאגה עיצובית קריטית כי כל אירוע העבר חייב להישאר מפרש לנצח.הפרקטיקה המומלצת היא לאחסן אירועים בפורמט התומך באבולוציה של סכמה (למשל, אבורו או פרובוף עם פרויקט רישום) ותמיד להוסיף שדות עם חדלות מחדל במקום לשנות את ההתפתחות הקיימת, אם לא צריך להיות מחוסם דרך אירוע הגירה, אם לא צריך להיות מוקרן חדש.
תרגום של Polyglot Environments
כאשר יצרנים וצרכנים כתובים בשפות שונות, עליך להבטיח כי פורמט הסידורי והגדרה סכימה עקביים בשפות.אברו ופרובוף יש דור קוד חזק עבור שפות רבות, אבל כל שפה עשויה להתמודד עם שדות לא ידועים או ערכי ברירת מחדל מעט שונה.מבחן תאימות בין שפה בין-שפתית בתחילת הפיתוח. השתמש במרשם סכימה המספק אנליזה שפה-אגנוסטית (למשל, קונפורנטנטנטציה להגדרה).
גרסה עם Event Stores
מערכות כמו EventStoreDB או Apache קפקא (שמשתמשים בחנות אירועים) לעתים קרובות יש מנגנונים משלהם לניהול סכימה. EventStoreDB תומך בסוגי אירועים ותחזיות, אבל schema האבולוציה היא עדיין באחריותך. עם קפקא, הרישום של סכימה הוא הכלי העיקרי.עם זאת, כאשר משתמשים בקפאה כחנות אירוע ארוך טווח, לשקול הוספת מדיניות שמירה כי קומפקטיות או ארועים ישנים רק לאחר כל הצרכנים לא יכלו לעבור סיכון חדש.
מסקנה
אבולוציה אירועים וסכימה אינם אופציונליים בכל מערכת מונחה אירוע המצפה לחיות מעבר מחזור שחרור יחיד.על ידי אימוץ רשם סכימה, בחירת פורמט סידוריזציה הנכון, ובדיקת תאימות אוטומטית בדיקות, הצוותים יכולים לפתח את הנתונים שלהם schemas עם ביטחון. Backward וקידום תאימות להגן על הצרכנים מפני תקלות בלתי צפויות, בעוד תקשורת ברורה ופעולות מניעתיות לשמור על כולם תואמים את מערכת ההפעלה הראשונה שלך היא שינוי מוקדם יותר מאשר שינוי שירות אחד, כמו גם שינוי מוקדם יותר, כמו תכנון אחד, הוא טיפול חוזר.