שיטות הטובות ביותר עבור מודלים סטריטור בתבנית Mvc עבור Scalability
מבוא
המודל-View-Controller (MVC) דפוס היה אבן הפינה של פיתוח יישומים באינטרנט במשך עשרות שנים. עם זאת, כאשר יישומים גדלים המורכבות וביקוש המשתמש עולה, צוותים רבים מגלים כי המודלים שלהם - השכבה האחראית על נתונים ולוגיקה עסקית - באופן ברור להפוך צווארי בקבוק.מודלים מובניים מובילים להפיכה הדוקה, לוגיקה כפולה, וקוד שמנוגד לשינוי.
הבנת תבנית MVC
תבנית MVC מפרידה יישום לשלושה רכיבים קשורים:
- (ב) ,0)Model:cioFLT:1 , נהל נתונים, כללי עסקים ולוגיקה עקשנות.זהו מקור האמת היחיד לתחומי היישום.
- (FLT:0)View:veFLT:1) Renders את ממשק המשתמש, בדרך כלל על ידי קריאת נתונים מהמודל (או ייצוג ממוקד מצגת של זה).
- (ב) ,0)Controller:FLT:1 Handles User קלט, מתזמר אינטראקציות בין המודל לתצוגה, ומעדכן את המדינה בהתאם.
בעוד שהנוף והבקר חשובים, המודל הוא המקום שבו רוב המורכבות האינטלקטואלית שוכנת.מודל בנוי היטב מאפשר את היישום להסתגל לדרישות חדשות, לטפל בתנועה מוגברת ולתמוך בממשקים מרובים (למשל, אינטרנט, API, נייד) ללא שינויים קלאסים.
עקרונות מרכזיים למודלים סקאלה
לפני צלילה לדפוסים ספציפיים, חיוני לנסח כמה עקרונות יסוד:
- (ב) אחריות:0 (ב) 1FLT:1 לכל מודל או מחלקה צריכה להיות סיבה מוגדרת אחת לשינוי.
- (FLT:0) ,השוואה של חששות: 1 ; היבטים שונים של היישום (פרסיוני, אימות, הודעה וכו ') צריך להיות מיושם בשכבות נפרדות, מעודנות באופן רופף.
- (הופנה מהדף DRY): לוגיקה מדויקת בדגמים מרובים או בקרים מובילה לסיוטי תחזוקה.
- (FLT:0) דחייה: FLT1 מודולים ברמה גבוהה צריך להיות תלוי על מופשטים (פניות), לא יישום קונקרטי.זה מאפשר החלפת מסדי נתונים, ספקי צ'ינג או שירותים חיצוניים ללא לוגיקה עסקית.
עיצוב Domain-Driven (DDD)
העיצוב של אריק אוונס Domain-Driven נשאר אחד הגישות היעילות ביותר למודולריות מודל.DDD מעודד מפתחים לארגן מודלים סביב תחומי הליבה העסקיים ולא חששות טכניים.
שפה בלתי נמנעת
הקמת אוצר מילים משותף משותף של מפתחים, מומחי דומיין ובעלי עניין. השתמש באותם תנאים בקוד, תיעוד ושיחות.לדוגמה, יישום מסחר אלקטרוני צריך להיות FLT:0 מעמד המשקף התנהגות סדר עולמי אמיתי, לא גנרית (FLT:1).
המונחים:
יישומים גדולים מורכבים ממספר תת-דומיינים.DDD ממליץ להגדיר גבולות ברורים בין ההקשרים - למשל, מודלים נפרדים לניהול סדר, מלאי ומשלוח. בתוך כל ההקשר, מודלים יכולים להיות אופטימליים עבור התחום הספציפי הזה ללא דליפת מושגים על פני גבולות.בידוד זה הוא המפתח עבור קבוצות פיתוח דרוג באופן עצמאי.
« « פרוטסטנטים
מכלול הוא אשכול של אובייקטים דומיין שטופלו כיחידה אחת.הישות השורשית מבטיחה עקביות.לדוגמה, מכלול (FLT:2 מצטבר) עשוי לכלול בתוכו את ה-FLT 3 ו-FLT:4 ישויות, הכל נגיש דרך שורש ההזמנה.
לצליל עמוק יותר, התייחס ל-DDDIREL:0.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.
אדריכלות שכבת
אדריכלות שכבתית מפרידה עוד יותר חששות על ידי איבריזציה של המודל ל tiers לוגיים נפרדים:
- (ב) ,0)Domain Layer:FLT:1 מכיל ישויות עסקיות, אובייקטים בעלי ערך ושירותים דומיין.
- (FLT:0)Application Layer:FLT:1 Orchestrates להשתמש במקרים, לתאם אובייקטים דומיין ולנהל עסקאות.
- (ב) ⁇ :0 [Infra Structure Layer: FLT:1] יישום ההתמדה, הודעות, שיחות API חיצוניות, ודאגות טכניות אחרות.
- (ב) ,0) שיעור ההשתתפות: 1FLT:1 מפקחים והשקפות אשר אינטראקציה עם שכבת היישום באמצעות ממשקים.
הפרדה זו מבטיחה כי שינויים בטכנולוגיית מסד הנתונים, אסטרטגיה של צ'ינג, או מסגרת UI אינם מפורקים באמצעות ההיגיון העסקי הליבה.זה גם הופך את יחידת הבדיקה לקלה יותר - ניתן לבדוק את ההיגיון של דומיין ללא לעג מסדי נתונים.
שירותים ושירותים
שני דפוסים הם בעלי ערך במיוחד לשמירה על מודלים נקיים ומשתנים:
המונחים:
מאגר משקף את לוגיקה הגישה לנתונים, ומספק ממשק דמוי אוסף ב-memory לאובייקטים דומיין.במקום לשאילתות מסד נתונים של מסד נתונים לאורך כל הבקרים, אתה קורא FLT:5 זה מאפשר החלפת מקור הנתונים (למשל, מ- MySQL ועד PostgreSQL או אפילו חנות לא-mory לבדיקה) עם השפעה מינימלית.
שירות שכבת
שירותים מכילים לוגיקה עסקית שאינה שייכת באופן טבעי לישות יחידה.לדוגמה, FPLT:6 עשוי לתאם אימות, תמחור, בדיקות מלאי בעת ביצוע הזמנה. שירותים תלויים במאגרים וגופים דומיין, אך נשאר אגנוסטי של מסד הנתונים.הפרדה זו גם מקלה שימוש חוזר על פני בקרים, רקע, ו APIs.
לקריאה נוספת, ראה (ב) את תיאור תבנית ה-Repository של ה-Repository.
אובייקטים להעברת נתונים (DTOs) ו- View Models
הצגת מודל התחום המלא שלך לשכבה או ללקוחות API חיצוניים יוצרת הפיכה הדוקה ולעתים קרובות חושפת פרטים פנימיים מיותרים.במקום זאת, השתמש ב- DTOs כדי לעצב נתונים בדיוק כפי שנדרש.
- (ב) שינויים בגופים דומיין אינם שוברים באופן אוטומטי לקוחות API.
- (ב) ניתן לתקן את שדות רגישים (למשל, תעודות פנימיות, תזמון ביקורת)
- (ב) ניתן להתאים את ה-DTOS רק לשדות הנדרשים על ידי נקודת מוצא מסוימת, הפחתת גודל המשכורות.
מודלים של תצוגה משרתים מטרה דומה לשכבה המצגת, המכילה רק את הנתונים שהתצוגה צריכה להפוך (בדרך כלל לצד לוגיקה תצוגה כמו תאריכים מעוצבים או סךים מקובעים).
אופטימיזציה של מסד נתונים עבור Scalability
אפילו ארכיטקטורת המודל הנקיה ביותר תכשל אם גישה למסד הנתונים אינה יעילה.אסטרטגיות מפתח כוללות:
מדד
אנליסט שאילתות ויוצר אינדקסים על עמודות המשמשות ב-FLT 7 (FLT:8, ו-FLT:9 סעיפים. Over-indexing יכול להאט כותב, כל כך מדד ומפקח.
המונחים: Caching
השתמש בחנויות זיכרון כגון Redis או Memcached כדי לטמון את התוצאות של שאילתות יקרות.אישום סיבוך מתאים לתחום שלך (זמן מבוסס, מונח על אירועים, או ידני).
צילום: Lazy Loading
לעולם אל תטען נתונים גדולים לזיכרון. השתמש בדמיון מבוסס או מלמטה.ב-ORMs, מאפשר טעינה עצלה עבור יחסי ילדים, אך היזהרו מבעיות שאילתה N+1 - במידת הצורך, השתמש בטעינה להוטה (למשל, FLT:10 ב ActiveRecord או FLT:11 ב-SQL).
עצלות נגד אכילה
בחירת אסטרטגיית הטעינה הנכונה היא קריטית לביצועים:
- (ב) [15] ⁇ : ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (FLT:0) כתב אישום: FLT:1 טוען את כל מערכות היחסים הדרושות לפני שאילתה אחת. השתמש כאשר אתה יודע את הנוף או השירות יהיה צורך בנתונים קשורים.
גישה פרגמטית היא לחדל טעינה להוטה עבור מסלולים ידועים ולהשתמש טעינה עצלה רק עבור אגודות לעתים רחוקות לגשת.פרופיל שאילתות מסד הנתונים שלך תחת עומס ריאלי כדי למצוא את האיזון הנכון.
תכנון ל- Horizontal Scaling
כאשר היישום שלך גדל מעבר לשרת יחיד, שכבת המודל חייבת לתמוך בתפוצה:
- (FLT:0) מודלים ללא תנאי: 1FLT להימנע מאחסנת נוכחות משתמשים או מידע ספציפי בקשה במקרים מודל. השתמש הזרקת תלות כדי לספק שירותים ללא תנאי.
- (FLT:0) ייצוב יעיל:FIRLT:1 מודלים שינסו ברחבי הרשת (למשל, באמצעות JSON API) יש לתכנן עבור סידוריזציה מהירה / deserialization. השתמש ב- DTOs ולא גרף אובייקטים מורכב עם הפניות מעגליות.
- (FLT:0Database Sharding:FLT:1hil) עבור נתונים גדולים מאוד, חלוקת נתונים על פני מסדי נתונים מרובים.שכבת המאגר שלך צריכה להפשט את ההיגיון המפחיד, באופן אידיאלי עם אסטרטגיה מחוסמת המבוססת על השורש המצטבר.
- (FLT:0) שקיפות כללית: FIRLT:1 במערכות מבוזרות, להימנע מעסקאות מבוזרות המנעול משאבים על פני שירותים. במקום זאת, לאמץ בסופו של דבר עקביות באמצעות דפוסים מונעים אירועים תורי הודעות.
שיטות נוספות
« « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « «
השתמש במיכל הזרקת התלות כדי לפתור את השרידים ואת תלות השירות.זה מודל בנייה מיישומים קונקרטיים והופך אותו טריוויאלי להחליף רכיבים לבדיקה או דרוג.
חוסר יכולת
בכל פעם שניתן, עיצוב עצמים כחסרונות.שיעור בלתי משתנה (FLT:12) מקטין באגים הקשורים למטבעה ומטבע מבוזר.
בדיקה בIsolation
בדיקות יחידה עבור שירותים ולוגיקה דומיין לא צריך מסד נתונים או מסגרת המגפיים. השתמש בקבצי לעג או יישום תוך-זיכרון.בדיקות אינטגרציה יכולות לאמת התנהגות מתמשכת נגד מסד נתונים אמיתי, אך לשמור אותם ממוקדים.
שכבת Anti-Corruption Layer
כאשר משלבים עם מערכות מורשת או API חיצוני, בונים שכבת אנטי-שחיתות המתורגמת בין המודל שלך לבין המודל של המערכת החיצונית.זה מונע שינויים חיצוניים להדליפה לתוך התחום שלך.
מסמכים וקוד
מבני מודל הופכים לעתים קרובות לאופים לאורך זמן.לשמור רשומות החלטות אדריכלות (ADRs) ואכיפת עקביות באמצעות ביקורות קוד.מודל מנוהל היטב משלם דיבידנדים בעת ביצוע צוות חדש או שחזור של מודול חודשים מאוחר יותר.
מסקנה
מודלים של סטריטור עבור סקאלות דפוס MVC הוא לא תרגיל עיצוב חד פעמי אלא משמעת מתמשכת. על ידי המונה עקרונות כגון הפרדה של חששות, יישום DDD וארכיטקטורה שכבתית, וחוכמה באמצעות repositories, שירותים ו DTOs, אתה יוצר מודל שיכול לגדול עם היישום שלך אופטימיזציה נתונים גישה, בחירת אסטרטגיית טעינה נכונה, ותכנון אופקי להבטיח המשך יישום זה נשאר מדידה, כי הוא עדיין למדוד את היישום שלך, כולל החלטות אבטחה.
לצורך מחקר נוסף, כדאי ללמוד את הספר לעיצוב Domain-Driven Design Book (Felos) ו-FLT:2 Redis caching Patterns FLT:3.