control-systems-and-automation
יישום אירוע Sourcing ו Cqrs באדריכלות ללא שרת
Table of Contents
מבוא לאירוע Sourcing ו-CQRS
אירוע Sourcing ו- Command Query אחריות Segregation (CQRS) הפכו לדפוסי יסוד לבניית מערכות מודרניות, מבוזרות.כאשר בשילוב עם ארכיטקטורות ללא שרת, דפוסים אלה אינם נפתחים באופן חסר תקדים, עמידות, וביקורתיות. מאמר זה מספק חקירה יסודית של מיקור אירועים ו- CQRS בסביבות ללא שרת, כיסוי מושגים ליבה, אסטרטגיות יישום מעשי, מלכודות נפוצות, ושיטות אמתיות, אמיתי בעולם הטוב ביותר.
אירוע: שינוי כנקודת מוצא של אירועים
אירוע Sourcing הוא דפוס של התמדה נתונים שבו כל שינוי במצב היישום נתפס כאירוע בלתי-משתנה.במקום לאחסן רק את המדינה הנוכחית, המערכת מתעדת יומן כרונולוגי של אירועים.המצב הנוכחי ניתן לשחזר על ידי Replaying אותם אירועים.גישה זו מספקת שביל ביקורת שלם, מאפשרת שאילתות זמניות (למשל, "מה היה המצב על תאריך נתון?"), וסימולציות.
בהקשר ללא שרת, החנות צריכה להיות מאוד יציבה, מדרגת ושפל אפשרויות נפוצות כוללות FLT:0AWS DMDMODBMLT:1,FLT:2Zonee Cosmos DBorive 3, או FLT:4 Google Cloud FirehouseFLT:5 דינמי, עם יכולת דרישה, מתאים באופן טבעי לגרסה מוגבלת של נתונים, כולל מספר מוגבל של טבלאות וניתן בדרך כלל לספק נתונים.
מרטין פיולר (Fowler's canonical canonical FLT:0article on Event SourcingFelo 1LT) נשאר התייחסות סופית להבנת קצבאות הדפוס.
מבנה אירועים ושema
כל אירוע צריך לכלול מינימום: סוג אירוע, מזהה מצטבר, מספר גירסה, ועומס עם הנתונים שמשתנים.שימוש במרשם סכימה (למשל, FLT:0 Google Cloud Schema RegistryFLT:1 או FLT:2AWSridge Schema הרישוםFLT) מסייע לשמירת יכולת לאחור ככל שתפתחו אירועים.
CQRS: ספרדית קורא מכתובים
CQRS (Command Query אחריות Segregation) מקלקל את המודלים המשמשים כדי לטפל בפקודות (טקסים) מאלה המשמשים כדי להתמודד עם שאילתות (קריאות) באדריכלות ללא שרת, זה אומר פריסת פונקציות נפרדות או שירותים: ניהול פקודות: תהליך ניהול פקודות כותב, לעתים קרובות יישום אירועים בחנות האירוע, בעוד שאילתאות קוראות ממודלים מקודמים לקריאה - טבלאות מטושטשות, חומרים או תצוגות, חיפוש, או אינדקסים.
[4] הפרדה זו מביאה יתרונות משמעותיים: כתיבת עומסי עבודה נותרים רזים וממוקדים בהתמדה וקיום אירועים, בעוד שניתן לכוון מודלים לקריאה לחידוש מהיר, כולל pre-joins, aggregations, ו- טקסט מלא יכולות חיפוש.שני הצדדים מתקשרים באמצעות מנגנונים סינכרונכרוניים כגון FLT:0event Flows F-1LT אוLTF:2mess:2mes, Azure SLTS, Azure, , , , , , .
המקור של גרג יאנג (FLT:0)CQRS מתעד את LT:1 מספק הקשר יסוד לתבנית.
שילוב אירוע Sourcing ו-CQRS ב- Serverless
כאשר נעשה שימוש יחד, Event Sourcing ו- CQRS יוצרים צמד חזק: פקודות לייצר אירועים מאוחסנים בתיק האירוע, ותחזיות (או מנויים) עדכון מקרי קורא באופן סינכרוני.פלטפורמות ללא תשלום מצטיינים בפרדיגמה זו המונעת על ידי אירועים כי הם ניהול תשתיות מופשטות וסולקו אוטומטית כל רכיב מבוסס על עומס.
להלן זרם מערכת הפעלה טיפוסי ללא שם:
- (ב) ,0 משתמשים (ב) פועלים ב-[[1924]], הם מהווים תפקיד פיקוד (למשל, AWS Lambda מאחורי שער ה-API).
- הפונקציה הפיקודית מאשרת את הקלט, מייצרת אירוע דומיין אחד או יותר, ומזמינה אותם לחנות האירועים (DynamoDB, Cosmos DB וכו ').
- לאחר עריכת האירועים, הפונקציה מפרסם הודעה (למשל, אמזון EventBridge, Azure Event Grid, או Google Pub/Sub) המציין כי אירועים חדשים זמינים.
- (FLT:0)Projection functionFLT:1) מנוי על זרם האירוע ועדכון מודל הקריאה (למשל, שולחן דינמו-DB מאומת, מדד אלסטיאוסקי, או מטמון כמו Redis).
- פונקציות קווירי משרתות בקשות קריאה ישירות מהמודל לקריאה, לעולם לא לשאול את חנות האירועים.
עיצוב זה מבטיח (FLT:0 â € encyFLT:1 ), בין הצדדים הכתובים והקריאה, המהווה את הליבה של CQRS. בתחומים עסקיים רבים, בסופו של דבר עקביות היא מקובלת ואפילו רצויה כי זה מאפשר גבוה יותר דרך לוח וכבדות נמוכה לקריאה.
המונחים: E-Commerce Order Management
שקול מערכת הזמנה.משתמש מציב הזמנה (מעודכן), אשר פולטת אירוע (FLT:0.0.) מיזם הקרנה קורא את האירוע ועדכונים מודל קריאה הזמנה הכולל את שם המוצר, כמות והמעמד הנוכחי. הקרנה נוספת עשויה לעדכן מודל של מלאי קריאה.אם המשתמש מבקש מאוחר יותר סדר היסטוריה, הפונקציה השאילתה קוראת ממודל הסיכום שנבנה מראש, הימנעות יקר או קורא מן המאורע הגולמי ממחסן.
יישום חנות אירועים במסד נתונים ללא Server
אפשרויות עיצוב עבור חנות האירוע להשפיע ישירות על ביצועי ועלות.עם דינמודי, גישה נפוצה היא להשתמש בטבלה אחת עם מפתח מורכב: FLT:1 (מפתח חלק) ו-FLT:2 (מפתח sort) זה מאפשר התחדשות מהירה של כל האירועים עבור מצטבר מסוים כדי לגרור את זרם האירוע כולו במשימת חלוקה אחת להבטיח כי פעולות כגון סימולציה (מחסוך) של המדינה יעילה.
עבור עומסי עבודה הדורשים שאילתות בין-אגגייט, שקול באמצעות מדד משני על סוג האירוע או פעמים דגימה.עם זאת, להימנע לסרוק את כל חנות האירוע; צרכים אלה משמשים טוב יותר על ידי מודלים ייעודיים לקריאה.
ב- Azure, קוסמוס DB מציע יכולות דומות עם רמות עקביות ניתנות להגדרה ואינדקס אוטומטי.האירוע של מרכז האדריכלות האזורי Sourcing PatternFLT:1 מספק הדרכה ספציפית לפלטפורמה זו.
מסחר ועוצמה
במקביל כותב לאותה אגצר חייב להיות מטופל בזהירות.שימוש ב-FLT:0 ⁇ concurrencylementFLT:1 (למשל, עדכון מותני עם בדיקה ב- DynamoDB) מבטיח שרק פקודה אחת מצליחה לגרסה מצטברת.במקרה של קונפליקט, ניתן לייחס מחדש את הפקודה לאחר קריאת האירועים האחרונים.
בניית מודלים עם פרויקטים
פרויקטים הם פונקציות לצרוך אירועים ועדכון אחד או יותר מודלים לקריאה.אין שרת, הם מיושמים ביותר כמו FLT:0event-oriented functionFLT:1 מופעל על ידי אוטובוס האירוע.כל פונקציה של הקרנה צריך להיות idempotent: אם אירוע מעובד יותר מפעם אחת (למשל, בשל retry), את המודל חייב לייצר את אותה תוצאה.
אסטרטגיות נפוצות לבניית מודלים לקריאה כוללות:
- (בקיצור:0) טבלאות טבלאות קדמוניות (DenormalizedטבלאותFLT:1) ב-DBdymoDB או ב- Cosmos DB שמשקף את דפוסי השאילתה (למשל, כל ההזמנות למשתמש).
- (FLT:0Search IndexsigsFLT:1) ב-Alstalisvis, Amazon OpenSearch, או Azure Search for full-text and Faceedשאילתות.
- (FLT:0) צפיות ממותרות 1FLT) באמצעות מסגרות הזרמת כגון AWS Kinesis Data Analytics או Azure Stream Analytics.
- (ב) [15] , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
כדי להימנע מהפיכה הדוקה, יש צורך בתחזיות ללא תנאי ומניעה אך ורק על ידי מטען האירוע.הם יכולים להוסיף, להסיר או לשנות מבלי להשפיע על הצד הפיקודי.
שקיפות ו SAGAs
אחד האתגרים הגדולים ביותר במערכת CQRS / ES הוא ניהול עקביות סופית ותיאום עסקאות עסקיות מרובות שלבים.משתמש רשאי להציב הזמנה, אבל המודל קורא עשוי לא לשקף את השינוי הזה כמה מאות אלפי שניות.עבור ציפיות משתמש סינכרוניות (למשל, הצגת דף אישור), מנהל הפקודה יכול להחזיר את האירוע מיד בעוד סקרי החזית של מודל קריאה או עדכון ערוץ אינטרנט.
עבור תהליכים רב-שלביים הדורשים עסקאות מבוזרות, דפוס ה-0SAGAFLT:1 הוא הפתרון המועדף.כל צעד באירועים של הסאגה הנפלטים, ותיקון אירועים נשמרים בחנות האירוע לצעדים שלא הושלמו באופן חלקי. פונקציות ללא מטרות ותזמורת יציבה (למשל, פונקציות AWS, פונקציות דורס, פונקציות עבודה של גוגל) יכולות ליישם באופן בלתי-מושל באופן חלקי.
טעויות ועוצמה בקנה מידה
סביבות ללא שרת כפופות לכישלונות טרנספורמטיביים ולמטרות משוכפלות (המכונים מטפלים באירוע) נועדו להתאמה. לאחסן את ה-FLT:0deduplication windowFLT:1 (למשל, באמצעות דינמוב"ד TTL או Redis להגדיר) אשר מתעדת תעודות זהות מעובדות.
כאשר צוולל נכשל לאחר עריכת אירועים בחנות, האירועים כבר נכתבו.במקרים כאלה, ייתכן שיהיה עליך ליישם את ה-FLT:0 compensating EventFLT:1 (למשל, FLT 3:3) כדי להחזיר את המדינה.
כמו כן, לשקול את ה-FLT:0 , תורים של ההרחבה של ההרחבה 1 (DLQs) לאירועים שנכשלים שוב ושוב בעיבוד. DLQs מאפשרים לך לבדוק ולחדש אירועים לאחר תיקון הבעיה, ללא אובדן נתונים.
ביצועים ואופטימיזציה של עלויות במערכות אירועים ללא שימוש
בעוד שסולמות ללא שרת באופן אוטומטי, מיקור אירועים מתוכנן ללא טיפול יכול לעלות גבוה. אזורי אופטימיזציה מרכזיים כוללים:
- (ב) [ה]התכנת]: [ה], כאשר האירועים המתכננים, קראו וכותבים במזומנים כדי למזער את בקשות מסד הנתונים.
- (FLT:0)Snapshots:FLT:1ir מעת לעת מחסנית תמונות של מדינות מצטברות כדי להימנע ממשחק יומן האירוע כולו על כל קריאה. Snapshots מאוחסנים באותו שולחן אירוע עם גרסה מיוחדת (למשל, מספר גרסאות שקדמו ל- "SNAP") לוגיקה המשחק מחדש לאחר מכן מתחילה מהתמונה האחרונה, צמצום זמן קריאה באופן דרסטי.
- (FLT:0)Caching:veFLT:1) Cache גישה לעתים קרובות למידע מודל קרא ברמת היישום (למשל, באמצעות ElastiCache או CloudFront עם תוכן דינמי).
- (FLT:0) חלוקת ההרחבה: 1FLT אם משתמשים במערכת פאב/סובב כמו EventBridge, אירועי מחיצה על ידי סוג מצטבר כדי לשלוט בקצב של ייעוד לפונקציות הקרנה.
דוגמה: Snapshot Strategy ב-DymoDB
חנות תמונה עם מפתח מחיצה = מצטבר וסוג של מפתח = "SNAP#FLT:0" היטל מכיל את המדינה המחודשת המלא.כאשר הוא מארגן מחדש את המדינה הנוכחית, השאילתה לאירועים עם מפתח גדול יותר מאשר גרסת ה-Sshot, צמצום מספר האירועים להליך.תדירות תמונה טיפוסית היא כל 50-100 אירועים או בהתבסס על זמן (למשל, כל 5 דקות).
בדיקה ודיון אירועים - מקור מערכות ללא Server
ארכיטקטורות מונחת אירועים דורש אסטרטגיות שונות מאשר מערכות CRUD מסורתיות. Units בדיקות יכול לאמת את נושאי הפקודה לייצר את האירועים הנכונים שניתנו בדיקות אינטגרציה צריך לאמת כי תחזיות לעדכן נכון מודלים קריאה כאשר אירועים פורסמו. כי פונקציות ללא שרת הן ללא מדינה, לשקול שימוש במחצבים מקומיים (למשל, AWS SAM מקומי, דינמוDB, ספריית בדיקות אירועיםBridge מקומית) כדי להפעיל בדיקות CI / קובצי Cookie.
התעלמות מבעיות הייצור של חומרת האירוע עצמה - ניתן לשחזר אירועים בסביבת פיתוח כדי לשחזר את הרצף המדויק שהוביל ל-Buck. Tools כגון FLT:0AWS X-RaycioFLT:1 או FPLT:2אזור המעקב אחר ההרחבה 3 מסייע במעקב אחר מטרות על פני שירותים.
מלכודות נפוצות וכיצד להימנע מהם
- (FLT:0) דומיינים של Inappropriate מודלים: ההרחבה 1 (לא כל רווח של התחום העסקי מ- Eventsourcing.אם אתה צריך CRUD פשוט ללא דרישות ביקורת, ייתכן כי ראש יתר לא יהיה מוצדק.
- (ב) אירועים גדולים:0 (בשורה התחתונה: 1) הובלת מטעני שכר גדולים (למשל, מסמכים שלמים) כאירוע אחד מקטין את הביצועים.
- (FLT:0)פרויקט סחף: 1 כאשר מודלים לקריאה הופכים לסנכרן בשל אירועים או באגים מפספסים, אתה צריך מנגנון משחק מחדש.
- (FLT:0) אבחון האבולוציה של סכימה: FIRLT:1 אירועים הם בלתי-מוגדרים, אבל שינוי הסכימות שלהם. השתמש במרשם וגרסה כל סוג של אירוע.
- (FLT:0)Cold מתחיל להשפיע על תחזיות: FLT:1 פונקציות Projection אשר מופעלות באופן בלתי צפוי עלול לסבול מחדירה קרה של התחלה.
דוגמה אמיתית לעולם Architectural
יישום מסחר פיננסי שנבנה על AWS Lambda, DynamoDB ו EventBridge מיקור אירועים לתעד כל סדר מסחר.פקדים טיפלו בהזמנות רכישה / מכירה ופלטו את הפקודות:5,FLT:6 ו- (FLT 7 אירועים. Projections עדכן טבלת דינמו-DB עבור תיק ההשקעות של המשתמש ו-Alilastalsearch עבור שוק ניתוח בזמן אמת.
הצוות הזה נמנע ממכשולים משותפים על ידי אכיפת גרסה קפדנית של אירוע צ'מה (באמצעות Apache Avro) ומימוש צינור משחק ייעודי שיכול לבנות מחדש את כל המודלים מאפס בתוך 30 דקות.
מסקנה
יישום אירועים Sourcing ו CQRS בארכיטקטורה ללא שרת נותן לצוותים פיתוח את היכולת לבנות מערכות מאוד מדרגיות, ביקורתיות, ושמירה על מערכות. על ידימינוף שירותים מנוהלים לחלוטין לאחסון אירועים, הודעות מחיקה, ו compute, אתה יכול להתמקד בלוגיקה עסקית בעוד הפלטפורמה מטפלת בדאגות הצלחה מפתח.