Best Practices for Using the Pink Factory Pattern in Cloud Service SDKs

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

המורכבות העולה של יישומים מודרניים – לעתים קרובות מתפשטת על פני AWS, Azure ו-Google Cloud בו זמנית, או נודדת ביניהם לאורך זמן – דורשת גישה עיצובית שמפשטת פרטים ספציפיים של ספקים, בעוד דפוסים כמו שיטת המפעל ו-Google ונהנים להתמודד עם יצירה חד-משמעית, דפוס המפעל ה-Pracleektextextatives, מתווה על ייצור משפחות שלמות של מוצרים מתואמת.זה הופך את ה- SDKs שצריכים לנהל משאבים קשורים כגון מכונות אחסון וירטואליות, , תצורה, תצורה, תצורה, תצורה של שיטות הפעלה, אז , אז תצורה הטובה ביותר.

הבנת תבנית המפעל הפשטנית ב-Cloud Contexts

בליבתו, תבנית המפעל הפשטנית מספקת ממשק ליצירת משפחות של חפצים קשורים או תלויים מבלי לציין את המעמדות הבטניים שלהם.ב- SDK בענן, זה בדרך כלל אומר מפעל מופשט יחיד המגדיר שיטות כמו FLT:0;0,FLT:1, ו-FLT:2 [המפעל הבטון] כל מפעל קונקרטי – אחד עבור Azure, אחד עבור GCP – מיישם שיטות אלה כדי להחזיר את הספק הנכון – האובייקטים לא תלויים רק בממשקים של המוצר המופשט, ולא רק על הממשקים.

הפרדה זו היא קריטית כי ספקי ענן שונים באופן משמעותי ב- API שלהם, מנגנוני אימות, מודלים של תמחור ותכונות.לדוגמה, AWS EC2 מקרים להשתמש בקבוצות אבטחה, בעוד Azure Virtual Machines משתמשים בקבוצות אבטחה ברשת (NSGs) שניהם משרתים את אותה מטרה (כללי אש) אבל יש ממשקי תצורה שונים.תבנית המפעל ה-Aexistra מסתירה הבדלים אלה מאחורי ממשק משותף, ומאפשרת לוגיקה להישאר ספקיתניים.

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

הפרקטיקה הטובה ביותר ליישום

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

Define Clear, ספק-Agnostic Interfaces

המוצרים המופשטים חייבים להיות מעוצבים מנקודת המבט של התחום של היישום שלך, לא ה- API של ספק הענן. להימנע מדלפת מושגים ספציפיים של ספק כגון "תפקידי IAM" או "VPC peering" לשמות הממשק. במקום זאת, השתמש במונחים גנריים: (FLT:3 במקום FLT:4) ממשק צריך ללכוד את ההתנהגויות החיוניות: ליצור, לקרוא, למחוק, ואולי להתחיל / להחלפת משאבים עבור שיטות הפעלה; במקום לקבל: לדוגמה:

  • (ב) ויקרא י"ד:5 ;5 ;5 ).
  • (ב) ויקרא י"ד: "וַיָּבְהִיא" (בראשית י"ד)
  • (ב) ויקרא י"ד: "בְּבְהִיתִיא" (בראשית י"ד)

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

2.הפעלת מטרות כתאים דקים

כל מפעל קונקרטי (למשל, FLT:14), צריך להיות דק, מחריב את העבודה האמיתית לשיעורי SDK ספציפיים ספק-קופן.זה מונע את המפעל מנפיחות עם לוגיקה עסקית.לדוגמה, כפל 16:16 יכול לעטוף את הממשק ה-SDD של ה-AWS ותרגם את האחריות שלך ל-LTF:19 מפעל ה-Automate רק כדי להתאים את הפונקציות האלה.

פרט חשוב נוסף הוא כי מפעלים קונקרטיים צריכים להיות חסרי מדינה ו-Wi-Safe. הם נוצרים בדרך כלל פעם ושימושיים בכל יישום.אם אתה צריך תצורה (כמו אזור או אישורים), לעבור את זה דרך הבונים או להשתמש בשיטה במפעל אשר מגדיר את לקוחות ה- SDK הבסיסית.

  • (FLT:20) יוצר לקוחות של AWS SDK פנימיים.
  • (FLT:21) עושה את אותו הדבר עבור Azure.

על ידי שמירה על המפעלים התמקדו באסיפה, אתה מקל עליהם לבדוק - אתה יכול מידל מיידית מפעל עם לקוחות לעגו של SDK (הספקת לך להזריק אותם).

שימוש בזריקת התלות להחלטת המפעל

רכיבי היישום שלך לעולם לא צריך מידידית ישירות מפעל קונקרטי.במקום, להשתמש הזרקת תלות (DI) כדי לספק את המפעל המתאים בזמן ריצה.זה יכול להיעשות באמצעות מיכל DI (Spring, Guice, Dagger) או באמצעות חיפוש ידני שורש הרכב.ה מיכל DI פותר ממשק של FLT:22 ליישום קונקרטי על בסיס הסביבה או המשתנים: דוגמה:

(ב) ,ב"ה, בפרשת [[המאה ה-21]]

גישה זו יש כמה יתרונות: היא מפצה את הלקוח מלוגיקה של יצירת מפעלים; היא מאפשרת לך להחליף מפעלים על ידי שינוי קו תצורה יחיד (למשל, FLT:25); והיא מפשטת בדיקות - אתה יכול להזריק מפעל לעג אשר מחזיר שירותים מזויפים.כאשר אתה מזרקת מפעל, גם להזריק ממשקי המוצר המופשטים במידת האפשר (למרות שמסגרות רבות של שיטת הזרקת מפעלים).

עיצוב להפחתה עם הספק-החומרים

ספקי ענן מתפתחים במהירות – AWS משחרר שירותים חדשים כמו Lambda, SQS ו-SNS; Azure מציגה את Azure Functions and Service Bus; GCP מוסיף פונקציות ענן ו-Pub/Sub, המפעל המפואר שלך חייב להיות בלתי ניתן לזרז מבלי לשבור קוד קיים.אחת טכניקה מוכחת היא להגדיר את המפעל המופשט כממשק שניתן להרחיב באמצעות הרכב או היררכיה.

גישה נוספת היא להשתמש בתבנית המפעל הפשטנית עצמה בשילוב עם דפוס Prototype או הBuild עבור שירותים אופציונליים.לדוגמה, אם ספק אין שירות מסוים (למשל, AWS יש תור הודעה מנוהל, אבל ספק קטן יותר עשוי לא), המפעל יכול לזרוק שירות מוגדר היטב FLT:29 או להחזיר אובייקט שאינו מעדן.

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

5. Encapsulate ספק-Specific Configuration and Lifecycle

● ערכות ענן דורשות תצורה כגון מפתחי API, אזור, תהלוכות, מדיניות retry, ו- logging המפעל ה-AWSFLT:32 אשר צריך לבודד את התצורה הזו ולנהל את מחזור החיים של לקוחות SDK בסיסיים.לדוגמה, המפעל הבטון שלך יכול להחזיק התייחסות ל-AWSFLT:32 שיוצר ו- caches נמוך ברמת ה- API (למשל, אישורים, לעומת AzureF).

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

מפעל יישום יחיד או אובייקט סקוטי

מכיוון שמפעלים קונקרטיים מנהלים משאבים יקרים (קשרי HTTP, צ'יפים, בריכות חוט), הם צריכים בדרך כלל להיות בודדים בתוך היקף נתון (הפצה או בקשה) עם זאת, ייתכן שתצטרכו מקרים מרובים אם אתם מתקשרים עם חשבונות ענן שונים או אזורים בו זמנית.עבור תרחיש זה, להשתמש במפעל של מפעלים: FLT:37 מחזירה FLT:38 לחשבון נתון / רגולציה זה יכול גם לנהל קלאבילי.

בעת שימוש במכלי DI, הגדר את המפעל כסינגלטון או אבטיפוס כנדרש.לוודא שכל מפעל ספציפי למינוי או ספציפי לאזור נהרס כאשר לא צריך עוד להימנע מדלפות משאבים. SDKs מודרניים רבים (כמו AWS SDK v2) כבר מנהלים את בריכות הלקוחות של HTTP משלהם, אבל עדיין חכם לסגור מפעלים באופן מבוקר.

7. Handle Cross-Cutting Concerns in the Factory Layer

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

באופן דומה, טיפול בשגיאה וטרנספורמציה של חריגים ספציפיים ספק (למשל, FLT:40 לעומת .FLT:41) ניתן לרכז את המפעל יכול להחזיר את יישום המוצר כי לתפוס חריגים ספק ולתרגם אותם לקוד משותף (FLT:42 אז קוד היישום שלך תופס רק FLT:43, מה שהופך אותו להכרחי לשינויים ספק.

היתרונות של שימוש בתבנית המפעל הפשטנית ב-Cloud SDKs

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

  • (FLT:0)Provider Agnosticism:FreaLT:1 , קוד היישום שלך לעולם לא יבוא מחלקה ספציפית ספק.זה הופך הגירה, למשל, AWS ל- Azure חומר של שינוי יישום המפעל ותצורה - ללא ספק אפס שינויים בשכבה העסקית.זה בעל ערך במיוחד עבור מוצרי SaaS שצריכים לתמוך בעננים מרובים מהקופסא.
  • (FLT:0) משפחות אובייקטים עקביות:FLT:1 ערובה כי אובייקטים מאותו מפעל לעבוד יחד מבטלים באגים אינטגרציה.לדוגמה, מקרה מקביל שנוצר על ידי אותו מפעל המספק רשת מבטיחה כי הרשת הווירטואלית קיימת באותו אזור וחשבון. coherence זה לעתים קרובות חסר בקוד רב-פרודקי.
  • (FLT:0) הסתברות מוכחת: FLT:1 אתה יכול לבדוק את כל ההיגיון העסקי על ידי מתן מפעל ללעג שחוזר אובייקטים מזויפים .לא יותר מבחנים אינטגרציה נגד נקודות קצה ענן אמיתיות עבור כל מבחן יחידה.זה מאיץ באופן דרמטי צינורות CI ומאפשר בדיקה תרחישים של כישלונות בקלות.
  • (FLT:0)Simplified Onboarding:FreaLT:1 חברי צוות חדשים רק צריכים להבין את ממשקים מופשטים ואת תבנית מפעל יחיד לתרום.הם לא צריכים ידע עמוק על כל קווי ה- SDK של ספק ענן.
  • (FLT:0) הפרדה ברורה של חששות: FLT:1 המפעל ושיעורי המוצר יוצרים גבול ברור בין תשתית ענן ולוגיקה עסקית.זה תואם עקרונות עיצוב מונחה דומיין והופך את זה קל יותר להקצות בעלות - מהנדסי ענן יכולים להתמקד במודולים במפעל, בעוד מפתחי יישומים עובדים על שכבת העסקים.
  • (FLT:0Scalability for Multi-Cloud:FearLT:1) אם הארגון שלך מחליט לאמץ ספק ענן חדש, אתה פשוט ליישם קבוצה חדשה של מפעלים קונקרטיים.

היתרונות האלה אינם תיאורטיים.מספרי SDKs כמו ההרחבה:0 (Google Cloud Java CustomerFreas) ו-FLT:2AWS SDK עבור Java v2earFLT 3 תבניות של מפעלים (לעתים קרובות בשילוב עם בנינים) כדי לאפשר הגירה קלה בין גרסאות או לספקי אימות שונים.

דוגמה אמיתית למניעה

בואו נלך דרך דוגמה קונקרטית: יישום ענן היברידי שצריך לנהל מכונות וירטואליות ומחסנים נפוחים ברחבי AWS ו- Azure.We'll להגדיר ממשק מפעל מופשט:

« « « « « « « « .

(ה) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

עכשיו דמיינו את מנהל הפריסה של היישום שלכם:

(ב) .

אם תוסיף תמיכה ב- GCP, רק תכתבו את הקוד המנהלי של הפריסה נשאר ללא שינוי.

מלכודות פוטנציאליות וכיצד להימנע מהם

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

  • (FLT:0) Over-Abstraction:FLT:1 להיזהר לא להסיר תכונות ספציפיות ספק כי היישום שלך באמת צריך.לדוגמה, אם אתה תלוי בסוגי הייעוד הספציפיים של AWS Lambda (אפילוט, מבקשות, בקשתך חייבת לתמוך בהם - אשר לא יכול למפות את פונקציות Azure. במקרים כאלה, ייתכן שתצטרך שיטות אופציונליות או תצורה המאפשרת לספק זה ללא שימוש ספציפי בחוזה.
  • (ב) [15] ,התנדבות בין-פניות: [13] [13] [13] [13] ,המנעו להוסיף שיטות רבות למפעל הפשטני שלכם.כל שיטה יוצרת נטל תחזוקה על כל יישום קונקרטי.במקום זאת, מוצרים הקשורים לקבוצה לגורמי משנה נפרדים (למשל, FLT:59, FLT:60) ויש להם את המפעל הראשי להחזיר את אותם בעלי-הספקים.
  • (ב) ,0) מורכב קונפדרציה: (FLT:1 , מפעלים קונקרטיים יכולים להיות מורכבים אם כל אחד דורש אישורים שונים, אזורים או פרוקסים. השתמש דפוס בונה עבור כל מפעל קונקרטי לספק ברירת מחדל סבירה בעת מתן מחדלים סבירים, כמו גם, לשקול תצורה מאוחדת DTO שניתן לסווג קובץ JSON/YAML config, כמו:2F: Google.
  • (FLT:0)Performance Overhead:FLT:1 כל קריאה למערכת במפעל עשויה ליצור מקרים חדשים של מוצרים חדשים.אם יצירה היא יקרה (למשל פתיחת חיבור לרשת), לשקול צ'ינג או בריכות של מקרים בתוך המפעל.
  • (FLT:0) עריכת ללא Mocks: ההרחבה 1 (בשיתוף התבנית), עדיין צריך בדיקות אינטגרציה עבור כל מפעל קונקרטי ומוצר. מפעל לעג יכול לאמת כי ההיגיון העסקי שלך קורא את השיטות הנכונות, אבל זה לא יכול לתפוס באגים בהתנהגות ה- SDK של ספק הענן בפועל.תוכנית עבור חבילת בדיקות אינטגרציה שפועלות נגד משאבי ענן אמיתיים (בד בחשבונות מבחן מבודדים).

על ידי אימוץ המלכודות האלה, אתה יכול לעצב את המפעל הפשטי שלך להיות חזק מבלי להיות מורכב מדי.

מסקנה

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

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

(ב) ◄ .

  • (ב) ⁇ (בספרים) - תוצאות של תוכנת עופרת עצמית (The Classic GoF)
  • ^ Martin Fowler: 1841 FactoryFLT1 (כניסה לדיגיטלית)
  • (FLT:0)AWS SDK for Java - Credentials andZoneFLT 1:1 (הופנה מהדף השימוש במפעל)

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