Table of Contents
דפוס Singleton הוא אחד דפוסי העיצוב המוכרים ביותר בהנדסת תוכנה, לעתים קרובות הציג מוקדם בקריירה של מפתח.זה מבטיח כי בכיתה יש בדיוק מקרה אחד ומספק נקודת גישה גלובלית של גישה לדוגמה זו.בתהליכים יחיד-מכונה יישומים, דפוס זה הוא כלי פשוט לניהול משאבי טבע משותפים כגון אובייקטים, שירותי אחסון, או בריכות.
מהו ה- Singleton Pattern?
מוגדר באופן פורה על ידי האנג' של ארבעה (GoF) ב "תבניות עיצוב: אלמנטים של תוכנה ממוקדת אובייקטים הניתנים להגדרה", דפוס ה- Singleton "מבטיחים לכיתה יש רק מקרה אחד, ומספק נקודת גישה גלובלית של גישה אליו" דפוס זה מבוצע בדרך כלל באמצעות שיטה סטטית אשר מחזירה את המקרה, בין אם נוצר בשקיקה בכיתה או lazily על גישה ראשונה.
בבסיסו, דפוס ה- Singleton מתייחס לשלוש דאגות:
- (FLT:0) גישה לדוגמה ייחודית של ההרחבה 1 (ה) – כל נתיבי הקוד מתייחסים לאותו אובייקט, ביטול הסיכון של עותקים רבים של המדינה הביקורתית.
- (FLT:0) ,Reduced Namespace זיהום FLT:1, משתנים גלובליים הם לעתים קרובות מיואשים, אבל Singleton מציע נקודה גלובלית מובנת שניתן לנהל ולבדק.
- (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
ביישום הנדסי מבוזר, עקרונות אלה חלים, אבל היקף "גלובל" הוא כעת לכל תהליך או לצומת. A Singleton בתוך Java Virtual Machine, למשל, מספק מקרה אחד לכל החוטים בתוך ה-JVM, אבל JVMs אחרים על מכונות אחרות יהיו מעורבים במקרים שלהם.
היתרונות של דפוס Singleton ביישומים הנדסיים
כאשר הוא מיושם בגבולות של תהליך יחיד, דפוס ה- Singleton מציע כמה יתרונות ברורים שהופכים אפילו יותר בולטים כאשר המערכת היא חלק אדריכלות מבוזרת גדולה יותר.למטה אנו מרחיבים על כל תועלת עם דוגמאות קונקרטיות והקשר הנדסי.
1.להבטיח יציבות בתוך תהליך ולהפחית את ד"ר
ביישום מבוזר, כל צומת פועל עותק משלו של התוכנה, לעתים קרובות עם שטח הזיכרון שלה. ערכים קונפדרציה - מחרוזת חיבור בסיס נתונים, דגלים תכונה, נקודות שירות - יכול בקלות להיות בלתי עקבי אם כל מודול לטעון את הגרסה שלו עצמו. על ידי שימוש במנהל הגדרות חד-טון, כל רכיב על אותו צומת ניגש לאותו אובייקט תצורה.אם התצורה מעודכנות (למשל, דרך תופעה חדשה), אשר מופעלת, כך, כך, כך, כך, כך, כך, כך, כך, כך, כך, כל רכיב על ידי כך, כך, כך, כך, כך, כל רכיב על ידי כך, כך, כך, כך, כך, כך, כך, כך, כל רכיב על ידי כך, כך, כך, כך, כל רכיב על ידי כך, עם כל רכיב על ידי כך, כל רכיב על ידי כך, כל רכיב על ידי כך, כך, כך, כך, כך, כך, כך, כך, כך, כך, כך, כך, עם כל רכיב על ידי שימוש בהגדרת המערכת, כך, כך, כך, עם כל רכיב על ידי כך, כך, כך, למשל, כל רכיב על ידי שימוש בהגדרה, כך, כך, כך, כך, כך, כך, כך, כך, כך
שקול מיקרו-שירות המחבר אשכול של העתקי מסד נתונים. מחלקה של חיבור Singleton מנהלת את הבריכה על פני כל הבקשות לטיפול חוטים.ללא Singleton, כל מטפל הבקשה יכול ליצור בריכה משלו, המוביל לחיבורים מופרזים ותצוגה בלתי עקבית של אשר העתק הוא הראשי.המנהל הבודד מרכזי ניהול בריכה, וכאשר בשילוב עם מנגנון בדיקה בריאותית, יכול להיכשל באופן החסד להיכשל על פני זה ללא צורך באופן עצמאי כדי לזהות את חוט זה.
2.צמצם את השימוש במשאבים על ידי חיסול Duplicates
יצירת מקרים רבים של אובייקטים במשקל כבד עולה זיכרון ו CPU overhead. במערכות מבוזרות, כל מקרה נוסף על כל צומת מכפיל את העלות. A Singleton מונע את השכפול הבזבזני של אובייקטים כמו קטבים משותפים, אספסוף מדדים, או לקוחות API מרחוק.
לדוגמה, שירות קריטריונים של ggregregation אשר אוסף ויצוא נתונים למערכת ניטור (למשל, Prometheus או Datadog) צריך לרוץ כמו Singleton לכל תהליך.אם כל רכיב מיידי את כתב המדדים שלו עצמו, המערכת תייצר תנועה רשת מחוספסת וייתכן overload backend.
3.סימבס Synchronization and Concurrency Management
בתוך תהליך אחד, Singleton יכול לשמש נקודת סינכרוניזציה טבעית.שיטות על ה- Singleton ניתן לסנכרן כדי להגן על מדינה משותפת של mutable. בעוד שזה דפוס מובנת היטב בתכנות מרובות, זה הופך אפילו יותר יקר במערכות מבוזרות שבו חוטים מרובים עשויים להיות טיפול בקשות כי חייב לתאם גישה למשאב משותף, כגון cache מקומי או שיעור מוגבל.
נחשב למגבלה מופץ של שיעור המיושמת באמצעות דלי טוקן בודדטון.כל אחד מהצומת מחזיק את הדלי שלו, והטון מבטיח שכל החוטים על אותו צומת חולקים את אותו דלי קדמיון.הטון ברמה הצומת מקטין את התוכן על שירות הגבלת קצב מרכזי (אשר יהפוך לצוואר בקבוק) תוך מתן שימוש הוגן על פני המקבץ בשילוב עם סינכרון תקופתי.
4.שיפור יכולת שמירה על ידי פיתוח שינוי
כאשר Singleton מצליח לדאוג חוצה-טווח כמו logging, ביקורת או תצורה, כל השינויים בדאגה זו הם מקומיים לכיתת ה- Singleton. ביישום מבוזר, זה אומר שעדכון פורמט הכניסה, הוספת שדה ביקורת חדש, או שינוי האופן שבו תצורה מוחזרת דורש שינויים במקום אחד בשירות, אשר לאחר מכן מפיץ לכל החוטים באמצעות שירות זה.
לדוגמה, מסלול עולמי של Singleton שיוצר מזהה ייחודי של בקשות ניתן לשנות כדי לכלול תג חדש עבור גרסת פריסה.כל רכיב שמקבל את מזהה עקבותיו של ה- Singleton מיד הטבות מן השינוי.ללא ה- Singleton, מהנדסים יצטרכו לצוד כל מקום שמזהה מיידית גנרטור מזהה עקבות, המוביל לעדכונים ולא עקביים על פני העקבים המופץ.
יתר על כן, ריכוזיות מפשטות משימות מבצעיות.אם ה- Singleton נועד לתמוך בהפסקת החסד או בהגדרה מחדש (למשל, סגירת חיבורי מסד נתונים ישנים), המערכת יכולה לקרוא שיטה אחת על ה- Singleton במהלך קרועת יישומים ולא להרעיש מעל עשרות אובייקטים.
דרישות עבור מערכות Distributed
בעוד היתרונות משכנעים, יישום יחידון ביישום הנדסי מבוזר דורש תשומת לב זהירה לאתגרים אדריכליים ועיצוביים רבים. Ignoring אלה יכולים להוביל לבעיות חמורות כגון שחיתות נתונים, התנהגות בלתי צפויה, או זרמים במערכת.
פרס Singleton לעומת דיסטריוט אמיתי
רוב המימוש של תבנית ה- Singleton מוגבל לתהליך יחיד (או יחיד JVM, CLR וכו ') זה מקובל לחלוטין וממליץ על משאבים מקומיים לכל צומת: מנהל לרכיבה של תהליכים, גוף מקומי בתוך דלקתי, או כבל יחיד של מיכלי, או כבל יחיד של שרת יחיד, עם זאת, כאשר המטרה היא בדיוק מקרה אחד של אובייקט על פני כל אשכול - לדוגמה, תיאום ייחודי של תאומים או יחיד, או יחיד של שרת יחיד, או יחיד, או יחיד, לא יכול להיות בעל מסך יחיד של שרת יחיד של שרת יחיד של תא יחיד, או יחיד, או יחיד, או יחיד של תאבוני, או יחיד, אם אתה יכול להיות בעל מסך יחיד של שרת יחיד.
גישה משותפת היא להשתמש בבחירות מנהיג: כל אחד מהצדדים מנסה לרכוש מנעול מבוזר או להפוך ל"מנהיג" המנהיג יוצר את מקרה הטון; צומת אחרים פועלים כעמודים או בקשות קדימה למנהיג.אם המנהיג נכשל, עוד צומת משתלט ויוצר מקרה חדש, דפוס זה מבטיח כי בכל רגע נתון רק אחד לא מחזיק את המדינה הסמכותנית של יחידטון, אבל הוא מציג רשת קואונדנטיה עם המאפיין יחידיקט עצמו, כלומר, הלוגיקה, עם המאפיין פשוט, הלוגיקה, עם הלוגיקה, המאפיין את הלוגיקה, המאפיין את המאפיין עצמו, המאפיין את הלוגיקה, כלומר, כלומר, המאפיין את המאפיין את המאפיין את המאפיין את המאפיין את הלוגיקה, כלומר, עם הלוגיקה, עם המאפיין את המאפיין את המאפיין הלוגיקה, כלומר, הוא יכול להיות בעל מורכבותו של עצמו.
המונחים: safety and Concurrency Within the Node
אפילו בתוך תהליך יחיד, בטיחות חוט היא רבת ערך.שימוש בטכניקות מוכחות כגון Singleton מבוסס aum (ב- Java), בונה סטטי (ב- C#), או טכנאי עצלן בטוח חוט עם מנעול כפול מבודק. במערכות מבוזרות, ה- Singleton עשוי גם להיות גישה מחוטפים מרובים אשר מטפלים ב- I/O, כך להיות מלחמה של חסימה בתוך מבנים חד-קליים או חסימתיים.
עדכון בנושא: Handling Configuration Update
הקונפדרציה המנוהלת על ידי Singleton לעתים קרובות צריך להיות רענון בזמן ריצה ללא הפעלת השירות.ה Singleton יכול להירשם לתצורה של שינויים אירועים (למשל, מחנות מבוזרת כמו Spring Cloud Config או וכו ') כאשר שינוי מתרחש, החלפת חד-אטומית החלפת הייצוג הפנימי שלה בעוד כל הקוראים ממשיכים לראות תמונה עקבית.
בדיקות ו-Mocking
Singletons הם קשה לשמצה לבדוק כי הם מציגים תלות נסתרת והמדינה הגלובלית. ביישום מבוזר, הבעיה היא מוגברת כי ה- Singleton עשוי להיות תלוי בשירותים חיצוניים (למשל, מאגר חיבור מסד נתונים או שירות תיאום מרחוק) כדי להפחית את זה, לתכנן את ה- Singleton כדי לקבל מפעל חד-משמעי או ספק באמצעות בדיקות של תלות אם אפשרי, גם אם חד-טון עצמו הוא טעון באופן קבוע, כדי לספק בדיקה מתאימה (למשל, שימוש ב-פעמי) עבור טיפול יחידני, שימוש ב-פעמי, שימוש ב-מתאים).
חסרונות ו"התמדה אחת"
אם אתה באמת צריך רק מקרה אחד של מעמד על פני כל הצומת, אתה חייב להשתמש מנעול מבוזר כי לאכוף את ההדרה הדדית. יישום טיפוסי משתמש שירות מנעולים (למשל, Redis Redlock, שומר גן החיות phemeral node) כדי להבטיח כי רק אחד לא יכול ליצור את המקרה.היישום הבודדון ינסה לרכוש את המנעול על סטארט אפאפ; אם הוא מוצלח, יוצר את הדוגמה, אם לא לחכות או לא יעזור (לאר) כדי לשלוט על ידי אדפטפטפטפטפטפטפטפטפטפטפט (אונד) או לא יכול להשתמש בתבנית זו (לאורטי) או לא יכול להשתמש בתבנית זו).
עם זאת, להיות מודע לפרשת ה-CAP: בנוכחות חלוקת רשת, מנעול מבוזר אינו יכול להבטיח במקביל עקביות וזמינות. הבנה עמוקה של סובלנות היישום שלך לחוסר עקביות חיונית. עבור יישומים הנדסיים רבים, שילוב של יחידות לעיבוד ועקביות בסופו של דבר באמצעות תורים הודעה או נתונים משוכפלים קונפליקטים (CRDTs) הוא מעשי יותר מאשר הטלת יחיד גלובלי נוקשה.
חלופות ותבניות משלימה
דפוס ה- Singleton אינו הכלי היחיד לשמירה על מצב עקבי במערכות מבוזרות.במקרים רבים, אדריכלות מודרנית להימנע בכוונה מסינגלונים הגלובליים כדי לשפר את יכולת הדרגתיות והבידוד הפגום.
המונחים:
מסגרות כמו אביב (Java) או Guice מציעים שעועית בקנה מידה (היקף של גלילטון) המספקות את אותו ייחודי למעבד אבל ללא שיטת סטטית גלובלית FLT:1.זה מעודד חיפוש מפורש של תלות והופך את הבדיקה לקלה יותר כי מקרה חדש יכול להיווצר עבור כל מבחן. בהקשר מיקרו-שירותי, כל שירות יכול להיות זריקות תלותיות משלו, ואת "ההיקף" הוא באופן טבעי.
שירותים ללא מדינה
התבנית הניתנת לדרגה ביותר היא לעשות שירותים:0 (ללא תנאי) 1 (שירות ללא מדינה אינו מסתמכ על כל אובייקט בודד שלטון המחזיק המדינה בבקשות; במקום זאת, כל המדינה מאוחסנים באופן חיצוני: במאגר נתונים, מטמון מבוזר (כמו Redis), או מעבד זר מבוזר (כמו Apache קפקא) כל בקשה נושאת את כל ההקשר הדרוש (למשל, זיהוי זה מבטל את הצורך בדרגה מוגבלת של שימוש ב-Redis, במקום ל- Redis, לא ניתן ל- Redis).
שיטות ניהול המדינה
כאשר נדרש מצב עקבי מעבר לצומת, שקול דפוסים שתוכננו במיוחד עבור מערכות מבוזרות:
- (ב) [ה]: [המנהיג], [ה], [ה], [ה], [ה], [ה],] [ה], [ה], [ה]]], [ה], [ה]], [ה], [ה]]], [ה']
- (FLT:0)Quorum / ConsensusFIRLT:1) השתמש באלגוריתמים כמו רפס או פאקסוס (באמצעות שירותים כמו וכו ', Consul) כדי להסכים על ערך יחיד.
- (FLT:0) אפילו SourcingFLT:1 - כל שינוי במדינה נרשם כאירוע ביומן בלתי-מוגדר.שירותי יכולים לבנות מחדש את מדינת הטון שלהם על ידי משחק אירועים, הבטחת עקביות ללא חיים בסומטם יחידטון.
- (ב) [15] ,0 (ב"ד) ,ב"ד (ב"ב) ,ב"ד) , כמו רדיס יכול להחזיק עותק אחד של תצורה שכל השירותים קוראים, פועלים ביעילות כאובייקט יחידני.
דפוסים אלה מספקים לעתים קרובות ערבויות עקביות חזקות יותר מאשר סינגלטון פשוט והם מתאימים יותר עבור יישומים הנדסיים קריטיים.
Real-World Use Cases and Trade-offs
כדי לקרקע את הדיון, שקול שני תרחישים מנוגדים:
(FLT:0Case 1: צינור עיבוד נתונים בקנה מידה גדול.Build.ph.ilLT) 1 כל עובד נודה משתמש ב- Singleton כדי לנהל מאגר של חיבורי מסד נתונים.הבריכות היא מקומית לצומת, כך ש- per-מעבד Singleton הוא הנכון.
(FLT:0Case 2: מנהל מנעול מבוזר עבור מערכת בקרת ייצור.FLT:1 מכונות מרובות צריך להסכים על איזה חלק של ציוד הוא פעיל.שימוש דפוס חדטון לכל תהליך להיכשל, כי כל תהליך יהיה מקרה "סמכותי" משלו כאן, אחד מבוזר מיושמת באמצעות שומר גן החיות הוא הכרחי, אבל הוא מציג שקיפות ומורכבות הצוות חייב להחליט אם יש צורך להגדיל את הביצועים או התיאום מספיקים.
דוגמאות אלה ממחישות כי דפוס ה- Singleton אינו טוב או רע באופן אוניברסלי; התאמתו תלויה בהיקף "הדוגמה האחת":0 באין תהליך, הוא כלי מוכח ופשוט מעבר לתהליכים, הוא דורש תיאום מבוזר ועיצוב זהיר.
מסקנה
דפוס Singleton נשאר כלי עיצוב יקר להבטיח מצב עקבי ביישומים הנדסיים מבוזרים, בתנאי שהיקפו הוא מובן כראוי. Per-מעבד Singletonsייעל ניהול משאבים, להפחית את הזיכרון מעל הראש, ולפשט שליטה במטבע - כל הגורמים הקריטיים באדריכלות המיכלית המודרנית ומיקרו-שירות.הם אידיאליים עבור מנהלי תצורה, שירותים, בריכות, ושמיכות מאובטחות כי חייב להיות עקבי בתוך שום דבר לא צריך להיות ייחודי בעולם.
עבור תרחישים הדורשים מקרה אחד על פני מערכת מבוזרת, דפוס ה- Singleton חייב להיות מורחב עם כלים מבוזרים כגון בחירות מנהיג, מנעולים מבוזרים, או פרוטוקולים קונצנזוס.במקרים אלה, המאמץ ההנדסי גבוה יותר, חלופות כמו עיצוב ללא מדינה, מיקור אירועים, או כיבים מבוזרים עשויים להציע יכולת טובה יותר וגמישות מחדש.