מונוליטים ומיקרו-שירותים הם שתי גישות בסיסיות לבניית יישומים. יש אנשים הרואים בהם מורשת ומודרנית, בהתאמה. אבל זה לא ממש נכון. הבחירה ביניהם היא שאלה מורכבת מאוד, שלשניהם יש יתרונות וחסרונות.
רוב היישומים החדשים אינם צריכים להיות מיקרו-שירותים מההתחלה. זה מהיר יותר, קל יותר וזול יותר להתחיל כמונוליט ולעבור למיקרו-שירותים מאוחר יותר אם אתה מוצא את זה מועיל.
עם הזמן, ככל שיישומי מונוליט הופכים פחות ופחות ניתנים לתחזוקה, חלק מהצוותים מחליטים שהדרך היחידה לפתור את הבעיה היא להתחיל לשחזר את האפליקציה שלהם לשירותי מיקרו. צוותים אחרים מקבלים את ההחלטה הזו רק בגלל ש"שירותי מיקרו הם מגניבים". תהליך זה לוקח הרבה זמן ולפעמים מביא אפילו יותר הוצאות תחזוקה. לפני שנכנסים לזה, חיוני לשקול היטב את כל היתרונות והחסרונות ולהבטיח שהגעת למגבלות הארכיטקטורה המונוליטית הנוכחית שלך. וזכרו, קל יותר לשבור מאשר לבנות.
במאמר זה, אנחנו לא הולכים להשוות מונוליטים למיקרו-שירותים. במקום זאת, נדון בשיקולים, דפוסים ועקרונות שיעזרו לך:
הדבר הראשון שעליך לעשות הוא להסתכל על מבנה הפרויקט שלך. אם אין לך מודולים, אני ממליץ לך לשקול אותם. הם לא גורמים לך לשנות את הארכיטקטורה שלך למיקרו-שירותים (וזה טוב כי אנחנו רוצים להימנע מכל התחזוקה המתאימה) אלא לוקחים מהם יתרונות רבים.
בהתאם לכלי האוטומציה של בניית הפרויקט שלך (למשל, maven, gradle או אחר), אתה יכול לפצל את הפרויקט שלך למודולים נפרדים ועצמאיים. מודולים מסוימים עשויים להיות משותפים לאחרים, בעוד שאחרים עשויים להכיל אזורי תחום ספציפיים או להיות ספציפיים לתכונה, ומביאים פונקציונליות עצמאית ליישום שלך.
זה ייתן לך את היתרונות הבאים:
כפי שאתה רואה, המונוליט המודולרי הוא הדרך להפיק את המיטב משני העולמות. זה כמו להפעיל מיקרו-שירותים עצמאיים בתוך מונוליט בודד, אך הימנעות משירותי מיקרו בטחונות תקורה. אחת המגבלות שעלולות להיות לך - היא אי היכולת לשנות את קנה המידה של מודולים שונים באופן עצמאי. יהיו לך מופעי מונוליט רבים ככל הנדרש על ידי המודול הטעון ביותר, מה שעלול להוביל לצריכת משאבים מוגזמת. החיסרון הנוסף הוא המגבלות של שימוש בטכנולוגיות שונות. לדוגמה, אתה לא יכול לערבב Java, Golang ו-Python במונוליט מודולרי, אז אתה נאלץ להישאר עם טכנולוגיה אחת (שבדרך כלל, לא מהווה בעיה).
תחשוב על דפוס תאנה חנוק. הוא לוקח את שמו מעץ שעוטף ובסופו של דבר מחליף את המארח שלו. באופן דומה, הדפוס מציע להחליף חלקים מאפליקציה מדור קודם בשירותים חדשים בזה אחר זה, ולחדש מערכת ישנה מבלי לגרום לשיבושים משמעותיים.
במקום לנסות שיפוץ מסוכן, הכל בבת אחת, אתה מעדכן את המערכת חלק אחר חלק. שיטה זו מועילה כאשר מתמודדים עם מונוליטים גדולים ומורכבים שקשה להחליפם במאמץ אחד. על ידי אימוץ דפוס Strangler Fig, צוותים יכולים לבטל לאט את המערכת הישנה תוך טיפוח הצמיחה של המערכת החדשה, מזעור סיכונים והבטחת אספקת ערך מתמשכת.
כדי ליישם את דפוס התאנה החונקת, עליך לבצע שלושה שלבים:
אם תנקוט בשלושת השלבים האלה, תפרק בהדרגה מונוליט לשירותי מיקרו.
היתרונות העיקריים של השימוש בתבנית Strangler Fig הם:
בעת יישום דפוס Strangler Fig, עליך לתכנן את אסטרטגיית ההגירה בקפידה. זה כולל זיהוי אילו רכיבים להחליף תחילה, הבטחת אינטגרציה נכונה בין חלקים ישנים לחדשים ושמירה על מודלים עקביים של נתונים. הצוותים צריכים גם להקים ערוצי תקשורת ברורים ומערכות ניטור כדי לעקוב אחר ההתקדמות וההשפעה של כל החלפה.
כפי שדיברנו קודם, המעבר לשירותי מיקרו מביא יתרונות. עם זאת, זה גם הופך דברים רבים אחרים לקשים ויקרים יותר.
לדוגמה, צוותי QA ו-Dev עשויים להתמודד עם מצב שבו הם לא יכולים עוד לבדוק במכונות מקומיות מכיוון שהיכולת להפעיל מספר שירותי מיקרו באופן מקומי מוגבלת. לחלופין, היומנים שלך עשויים להיות פחות חכמים מכיוון שבמקום ששירות אחד יעבד זרימה אחת, מספר שירותים מעבדים אותו כעת. כתוצאה מכך, כדי להציג את רצף היומן המלא, עליך ליישם מכשור ומעקב מתאימים.
בואו נדון בכמה היבטים מכריעים שכדאי לכם לשקול ואולי לתכנן לפני שהשינוי בשירותי המיקרו שלכם מתחיל.
לשירותי מונולית ומיקרו יש דרישות תשתית מינימליות שונות.
בעת הפעלת יישום מונוליט, אתה יכול בדרך כלל לשמור על תשתית פשוטה יותר. אפשרויות כמו מכונות וירטואליות או פתרונות PaaS (כגון AWS EC2) יספיקו. כמו כן, אתה יכול להתמודד עם חלק גדול מהקנה המידה, התצורה, השדרוגים והניטור באופן ידני או עם כלים פשוטים. כתוצאה מכך, אתה יכול להימנע מהגדרות תשתית מורכבות ולהסתמך על מפתחים או מהנדסי תמיכה מבלי לדרוש מומחיות נרחבת ב-DevOps.
עם זאת, אימוץ ארכיטקטורת שירותי מיקרו משנה את הדינמיקה הזו. ככל שמספר השירותים גדל, גישה ידנית ומעשית הופכת במהירות ללא מעשית. כדי לתזמר, להרחיב ולנהל ביעילות מספר שירותים, תזדקק לפלטפורמות מיוחדות כמו Kubernetes או, לפחות, שירות קונטיינר מנוהל, המציג שכבה חדשה של מורכבות ודרישות תפעוליות.
תחזוקה של יישום מונוליט היא פשוטה יחסית. אם מתעורר CVE, אתה מעדכן את התלות המושפעת במקום אחד. צריכים לתקנן תקשורת שירות חיצונית? הטמעו מעטפת יחידה והשתמשו בה מחדש בכל בסיס הקוד.
בסביבת שירותי מיקרו, המשימות הפשוטות הללו הופכות למורכבות הרבה יותר. מה שהיה קודם טריוויאלי כרוך כעת בתיאום שינויים על פני מספר שירותים עצמאיים, כל אחד עם מחזור החיים והתלות שלו. המורכבות הנוספת מגדילה עלויות הן בזמן והן במשאבים. והמצב מחמיר כשיש לך צוותים רבים והרבה שירותים שונים.
לכן, ארגונים רבים מציגים שכבת פלטפורמה ייעודית, המנוהלת בדרך כלל על ידי צוות פלטפורמה. המטרה היא ליצור בסיס שכל שירותי המיקרו יכולים לרשת: ניהול תלות נפוצה, הטמעת דפוסים סטנדרטיים ואספקת עטיפות מוכנות. על ידי איחוד אלמנטים אלה ברמת הפלטפורמה, אתה מפשט משמעותית את התחזוקה ומטפח עקביות בכל המערכת.
פריצת מונוליט למיקרו-שירותים היא טרנספורמציה אדריכלית משמעותית הדורשת שיקול דעת ותכנון מדוקדקים.
במאמר זה, דנו בצעדים שתוכל לנקוט כדי להתכונן אליו ולעבור את התהליך בצורה חלקה. היצמדות לתבנית Strangler Fig תספק לך את התהליך המצטבר ותבטיח יציבות מערכת לאורך כל השינוי. כמו כן, המונוליט המודולרי לא רק יכול להוות שלב הכנה מועיל אלא גם יכול להביא יתרונות שעשויים לעורר אותך לשקול מחדש את החלטת הטרנספורמציה של המיקרו-שירותים שלך ולהימנע ממורכבות תפעולית מתאימה.