מבוא

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

הבנת תבנית ה- Singleton

מה זה Singleton?

Singleton הוא דפוס עיצוב בריא המגביל את הרגעה של מחלקה לאובייקט יחיד.It משיג זאת על ידי יצירת בונה פרטי וחשיפת שיטה סטטית (לעתים קרובות בשם FLT:0) אשר מחזירה את הדוגמה הבלעדית.התבנית משמשת בדרך כלל למשאבים שהם גלובליים מטבעם - כגון מנהלי תצורה, מדבקות, בריכות, בריכות, חוטים, ו caches מרובים - שבו יהיו מקרים של פסולת או התנהגות לא עקבית.

יישום קלאסי ב- Java נראה כך:

public class ConfigManager {
 private static ConfigManager instance;
 private ConfigManager() {
 // Load configuration data
 }
 public static ConfigManager getInstance() {
 if (instance == null) {
 instance = new ConfigManager();
 }
 return instance;
 }
}

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

Eager vs. Lazy Preization

לדוגמה לעיל שימושים (FLT:0lazy sloalization FIRLT:1): לדוגמה נוצר רק כאשר ביקש הראשון.זה מועיל כאשר יצירתו של הטון היא יקרה, ואתה רוצה להימנע מראש.

public class ConfigManager {
 private static final ConfigManager instance = new ConfigManager();
 private ConfigManager() { }
 public static ConfigManager getInstance() {
 return instance;
 }
}

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

המונחים: mit e-Safe Singleton

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

1. שיטת סינכרונכרו

התיקון הפשוט ביותר הוא להפוך את שיטת ה-FLT:4 ל-Synכרונית:

public static synchronized ConfigManager getInstance() {
 if (instance == null) {
 instance = new ConfigManager();
 }
 return instance;
}

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

2. Double-Checked Locking

מנעול כפול נבדק מפחית את התוכן מנעולים על ידי בדיקת המקרה הראשון ללא סינכרוניזציה, ולאחר מכן יצירת בלוק סינכרוני רק כאשר המקרה הוא אפס.עם דגמי זיכרון Java מודרניים (Java 5+), יש להכריז על השדה לדוגמה (FLT 7 כדי למנוע הוראה להזמין מחדש:

public class ConfigManager {
 private static volatile ConfigManager instance;
 private ConfigManager() { }
 public static ConfigManager getInstance() {
 if (instance == null) {
 synchronized (ConfigManager.class) {
 if (instance == null) {
 instance = new ConfigManager();
 }
 }
 }
 return instance;
 }
}

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

סטאט פנימי (בילי פוטון)

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

public class ConfigManager {
 private ConfigManager() { }
 private static class SingletonHelper {
 private static final ConfigManager instance = new ConfigManager();
 }
 public static ConfigManager getInstance() {
 return SingletonHelper.instance;
 }
}

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

4. Enum Singleton

באמצעות Java enum היא גישה חזקה מאוד.הוא מספק בטיחות סידורית והגנה מפני התקפות השתקפות:

public enum ConfigManager {
 INSTANCE;
 // fields and methods
}

Enums הם בלתי סבירים ו- JVM מבטיח מקרה אחד קבוע enum. עם זאת, כמה מפתחים מוצאים כיפות פחות גמישות אם ה- Singleton צריך להרחיב מעמד אחר (enums לא יכול להאריך שיעורים, אבל יכול ליישם ממשקים).

הגנה מפני Serialization and Reflection

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

  • יישום [ה]הבא [ה] ל[ה] [ה]] ל[ה] [ה] [ה]], [ה], [ה], [ה], [ה],]
  • לזרוק יוצא דופן בבן אם המקרה כבר קיים (הגנה מפני השתקפות).

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

היתרונות של דפוס הבודדון באפליקציות ענן

כאשר ייושמו נכון, Singleton מספק יתרונות קריטיים עבור מערכות מבוססות ענן:

אופטימיזציה

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

ניהול המדינה

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

נקודת גישה גלובלית

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

מקרים של שימוש אמיתי בעולם בהנדסת עננים

ניהול קונפדרציה

יישומים נורמטיביים לעתים קרובות למשוך תצורה ממקורות חיצוניים (למשל, חנות AWS Parameter, Azure App Configuration, HashiCorp Consul) A Singleton ConfigurationManager לטעון ו caches אלה, מרענן אותם מעת לעת או באמצעות גורמים Webhook.כל השירותים בתוך אותו תהליך חולקים את התצורה המצופה, צמצום שיחות רשת יקרות.

« « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « «

לוגר הם דוגמאות קלאסיות של Singleton. in cloud מבוזר tracing, מקרה יחיד של עקבות (למשל, OpenTelemetry) הוא בדרך כלל בשימוש על פני היישום כדי לקשור את הסבבים.זה נמנע יצירת קשרים מרובים ל-Fmetry backend ומבטיח זיהויי עקבות עקביים.

בריכה

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

שירות Locator

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

אתגרים ושיקולים במערכות דיסטריוט

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

סינגלטון: When a Local Singleton Is Not Enough

חלק מהמשאבים דורשים תיאום בכל המקבץ – לדוגמה, מנהל מנעול מבוזר או מחולל זהות ייחודי בעולם.במקרים כאלה, לא מספיק חדטון מקומי.יש גישה אחת להשתמש ב-FLT:0 מבוזרת SingletonFLT 1 מגובה על ידי מסד נתונים או חנות מבוססת קונצנזוס כמו וכו 'ד או שומר גן החיות'.תבנית ה- Singleton של היישום יכול לעטוף משאב מרוחק, אבל העיצוב חייב להתמודד עם כישלונות, זמן וכישלונות, וכישלונות, בחירות.

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

מנהיג הבחירות

עבור שירותי ענן שיש להם בדיוק מקרה פעיל אחד (למשל, לוח זמנים של עבודה רקע, אלגוריתמים של אלגוריתמים מובילים (כגון אלה בשירות Azure Kubernetes, AWS ECS, או באמצעות סוכנת גן החיות של Apache) משמשים.המנהיג הנבחר יכול לארח משאב בודדטון.התבנית הופכת: רק המיכל של המנהיג מיישם את האובייקט המקומי של ה- Singleton.

Cache או Database

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

תוצאות ו-Salability Implications

אחדטון בעל ביצועים נמוך יכול להפוך לצוואר בקבוק ביצועים.לדוגמה, אם שיטת Singleton של PF:13 נעולה מאוד, כל החוטים תור למעלה, צמצום דרך ספוט.תבנית ביל Pugh להימנע במידה רבה זה, אבל אם ה- Singleton מנהל משאב משותף (למשל, מאגר חיבור), תוכן על משאב זה עדיין יכול להגביל את יכולת הגדלה.

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

אתגרים ואלטרנטיבה

סינגלים ידועים לשמצה בביצוע בדיקות יחידה קשה כי הם מציגים את המדינה הגלובלית הנסתרת.קשה קודקוד (FLT:14 קורא להפוך את זה בלתי אפשרי להחליף לעג או מגמגמים.כדי לצמצם את זה, קבוצות רבות של הנדסת ענן לאמץ:0 פיזור (DI)FLT:1 מסגרות (למשל, אביב, גוגל Guice, NET DI) עם מסגרת ענן, ניתן לעתים קרובות להגדיר את ההפיכה לא מוגדרות (DItri) כדי לנהל את ההיקף יחיד (למשל, לדוגמה, הפיכה) ללא מסגרת זמן קצר יותר).

אלטרנטיבה נוספת היא דפוס (0)Monostate דפוס ההרחבה 1 (Monostate PatternFrought) אשר מאפשר מקרים רבים אך מניות המדינה באמצעות שדות סטטיים.בעוד זה נמנע מבדיקת בעיות של יחידטון, זה יכול להיות מבלבל כי ההתנהגות תלויה במצב משותף מוסתר מן המפתח.

Best Practices for Using Singletons in Cloud Applications

  • (ב) [15] עצלן עצלן (ב[[1924]]) [15]
  • (ב) ,0) , ⁇ (הופנה מהדף ויקרא י"א)
  • (FLT:0) אל תשתמשו יתר על המידה ב Singletons.FIRLT:1) , הזרקת התלות של מבחן. השתמש ב Singletons רק עבור מדינה גלובלית אמיתית (למשל, כניסה, תצורה, בריכות חיבור).
  • (ב) אם יש לשתף את ה- Singleton בכל מכולות, השתמש ברכז חיצוני (בסיס נתונים, מטמון, מערכת קונצנזוס).
  • (ב) [ה]האבים של נפתלי:0] ממורונים (ה', ניצולי בריכה, בקשה לגיבוי).
  • (ב) ,0) ,התקדשות של ה- Singleton ו-WiFire Safetyערבויות בטיחותיות: 1 בבסיס הקוד.

מסקנה

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

(ב) ◄ .

  • (ב) ,0) ,מספק את גורו: Singleton PatternveFLT 1
  • (ב) ויקרא יא"ד: "ה'" (ב"ד)
  • מרטין פולר: Inversion of Control Containers and theתלויות בזריקת דפוסים של ההרחבה 1
  • (FLT:0) Microsoft Azure Architecture: Leader PatternFLT 1
  • [01:0] מראיין: ⁇