דמיינו את עצמכם בראיון עבודה. המראיין מבקש מכם להגדיר מבנה של מערכת ווב שמשרתת צורך מסוים.
אתם מציירים קוביות וחצים ביניהם על הלוח ומסבירים (בצורה משכנעת ככל האפשר) - למה זו דרך טובה מאוד לפתור את הבעיה.
"עכשיו תעשה לי את זה בלי שרת" - מבקש המראיין.
ווב, בלי שרת? כלומר... Rich Client שלא מתקשר עם אף אחד?
"לא. בדיוק רק מה שהצגת - אבל בוא נבטל את השרת".
לרובנו השלב הבא יהיה להבין לעזאזל מה חושב המראיין (??). זה איזה תרגיל לוגי מתחכם? אולי תרגיל בבחינת האישיות שלנו? אולי בעצם הגענו לראיון במחלבה של תנובה, ולא בחברת הייטק?!
מאז שנות ה-80, מודל ה Client-Server הוא המודל העיקרי של מערכות תוכנה, והוא עובד טוב. יש טרנדים: פעם לקוח רזה, ופעם לקוח שמן. פעם שרת מרכזי, ופעם שרת-רזה. אבל בכל זאת, ובמיוחד מאז עליית האינטרנט בשנות ה-2000 - אין כמעט מערכות שאנו משתמשים בהן שלא מחוברות לאיזשהו שרת (חוץ מכמה אפליקציות אופיס, Photoshop, או משחקים - וגם זה משתנה).
אז איך בדיוק אנחנו נבנה מערכות ללא-שרת? האם זה רק גימיק שיווקי (למשל: "השרת הוא בענן"), פתרון ספציפי לצרכים מיוחדים, או אולי באמת בסוג של מהפכה?
הרי קשה להתעלם מהבאזז המוזר הזה של "Serverless Architectures", באזז שכולל Frameworks, ספרים, ואפילו Conference שמוקדש לנושא.
בפוסט הזה אנסה להסביר את הנושא. נראה שבעצם כל התשובות נכונות.
כמו באזזים שונים שנתקלתי בהם בעולם התוכנה לאורך השנים ("SOA", "MVC", או "Big Data"), חוסר בהירות או אחידות בהבנת העקרונות הבסיסיים מאחורי הבאזז - לא מונעים מהבאזז לפרוח (אולי אפילו להיפך). זה קצת כמו הברקזיט: קודם מצביעים - ואז הולכים להבין במה מדובר ;-)
את באזז ה Serverless ניתן לקשר לשלושה כיוונים עיקריים:
BaaS (קיצור של Backend as a Service) - שירות המאפשר למפתחי צד-לקוח (בעיקר מובייל, ולכן לעתים נקרא גם MBaaS) לבצע bootstrapping[א] מהיר ללא הצורך בידע והשקעה בצד השרת.
שירותים כמו parse.com (שנקנתה ע"י פייסבוק ואח"כ נסגרה), Firebase, או Kinvey הפכו פופולריים בעולם הסטארטאפים, וקיימים גם פתרונות פופלארים בקהילות הסגורות של עולם ה Enterprise (יבמ, אוקרל, סאפ) שבוודאי יהיו פחות מוכרים לאיש התוכנה הממוצע.
שירותים אלו מספקים סט יכולות סטנדרטי (כ API), שבעצם פותר את עיקר הצרכים של אפליקציות מובייל בתחילת דרכן: שמירת נתונים, למשמש או מידע שישותף בין המשתמשים. ניהול הרשאות, אנליטיקס ו notifications למשתמשים. לכל פלטפורמה יש כמה יכולות נוספות משלה.
הסטארטאפ יכול בעצם להתמקד באפליקציית המובייל, ובעלות זניחה יחסית - לקבל שירותים בסיסיים בצד-השרת השמאפשרים "להרים" אפליקציה במהירות. בעתיד, ובמידה שהאפליקציה תצליח - יהיה ניתן להעביר את פונקציונליות השרת בהדרגה לפתרון custom made שיתאים בצורה מדוייקת יותר לצרכים.
האם ב BaaS אין שרת? - יש שרת, הוא פשוט מוצר מדף "סטנדרטי".
האם זו נישה? - במידה מסוימת כן. סטאראטאפים בתחילת דרכים.
האם זו גישה חדשנית או אפילו מהפכנית? - כן, אם אתם סטאראטאפ שנופל לקטגוריה.
FaaS (קיצור של Functions as a Service) היא הגל השני של ה Serverless Architectures, שעלה לכותרות בעיקר בעקבות ההצגה של שירות AWS Lambda. למרות שהשירות שוחרר בגרסתו הראשונית עם מגבלות רבות, הוא הגיע משחקן מוכר ומוערך מאוד (אמזון), עם מחיר כניסה אפסי (אפשר להתנסות בו במחיר של סנטים), ובמרחק נגיעה - כי למאות אלפי (?) מתכנתים יש כרטיס אשראי כבר מוזן באמזון, והם יכולים להפעיל את השירות במרחק של קליק.
הפתרון, בגדול, מאפשר לכתוב ולעשות deploy לפונקציה בודדות - שתופעל כתגובה לקריאה ל endpoint (נקראים: "event sources") שנגדיר.
תפעול הפונקציות הללו (ניהול עומס, monitoring, ו High Availability) מנוהל ע"י אמזון. רק מעדכנים את קוד הפונקציה - ואמזון דואגת לשאר.
בעצם FaaS הוא סוג של PaaS (כלומר: Platform as a Service, סליחה על השימוש התכוף בבאזזים) ברזולוציה קטנה הרבה יותר: במקום אפליקציה - פונקציה.
מאז הצגת AWS Lambda הזדרזו המתחרים להציג שירותים מקבילים, והיום יש לנו גם את Google Cloud Functions (עדיין באלפא, בעת כתיבת פוסט זה), את Azure Functions (גם הוא חדש), ואת OpenWhisk של יבמ (שרצה על פלטפורמת Bluemix של יבמ, פלטפורמה מוכרת בכנסים - וקצת פחות מפתרונות בפרודקשיין).
במקביל לענקיות הענן, ישנם גם מפתרונות של שחקנים קטנים, למשל:StackHut או WebTask.
האם ב FaaS אין שרת? - יש קוד צד-שרת, אבל בעצם מדובר בסט של פונקציות עצמאיות המנוהלות ע"י מישהו אחר. יש צד-שרת, למרות שאין "שרת".
האם זו נישה? - כרגע כן. הרבה משחקים באופציה החדשה, מתלהבים ("יו! פאקינג אינסוף Scalability!!"), אבל גם מתפכחים ("אהה.. אבל ה DB הוא צוואר הבקבוק של ה scale" / "קצת נהיה בלאגן" / "זה יוצא דווקא דיי יקר...").
האם זו גישה חדשנית או אפילו מהפכנית? - אולי. נהיה חכמים יותר עוד שנתיים - שלוש. עדיין יש פה גישה חדשה שמאתגרת הרבה מאוד ממה שהתרגלנו אליו עד עכשיו בעולם צד-השרת.
תת-וריאציה (מעט משונה) של FaaS היא DBFaaS, הגישה הזו גורסת שלעתים קרובות אנו זקוקים ב FaaS לפנוקציות שמבצעות עיבוד קל על נתונים. היכן יותר יעיל לשים את הפונקציות הללו - אם לא ב Database עצמו?
לחברת SAP יש מוצר בשם HANA, בסיס נתונים in-memory, שמאפשר ממשק וובי ישיר ל stored procedures שלו.
גישה זו שוברת כמעט כל מוסכמה של Layered Architecture או MVC, ומציבה דאגות רבות (Scalability? אבטחה? יכולת debugging ותהליכי תוכנה נכונים?). אני עדיין לא מצאתי איזון בריא לגישה הזו - אך אין ספק שהיא מערערת מוסכמות וגורמת לחשיבה מחודשת של הדברים. למה בעצם לא??
Serverless Web Site (אין קיצור מגניב)
תצורה אחרונה, וקצת פחות מהותית מהאחרות אליה מתייחסים כ Serverless Architecture היא לארח אתר אינטרנט (לרוב עם פונקציונליות מוגבלת, ובעיקר חוסר-תקשורת בין המשתמשים השונים) כ Static Content, ובניית כל הפונקציונליות ב JavaScript.
את קובצי ה HTML/CSS/JavaScript מארחים בשירות אכסון כמו S3 או אפילו עדיף - CDN.
הם בגישה זו אין שרת? - אפשר לומר שלא. ניתן להתייחס ל CDN כ"תשתית רשת".
האם זו נישה? - כן.
האם זו גישה חדשנית או אפילו מהפכנית? - לא ממש, אם כי היא אפשרית בעקבות ההתפתחות של שפת ה JavaScript ויכולות שונות בדפדפן מהשנים האחרונות. יש אנשים שיישום השיטה הזו גורם להם לסיפוק רב.
כמה שהגישות השונות שהצגתי הן שונות זו מזו - יש ביניהן סינרגיה.
כאשר אנו משתמשים ב BaaS, תחת היכולות הגנריות שמציע השירות הספציפי - מה יותר טבעי מלהוסיף קצת custom server functionality כ FaaS?
פגשתי לא מזמן מישהו שכתב אפליקציית מובייל, והיה זקוק לבצע עריכה מסוימת על קטעי וידאו שהמשתמש צילם.
האפליקציה התבססה על Parse - שבאופן טבעי לא כוללת שום יכולות של עיבוד וידאו. עיבוד וידאו במובייל הוא זללן של סוללה, ולספריות הקיימות יש מגבלות רבות.
מה יותר פשוט מהוספת פונקציה בודדת של עיבוד וידאו בצד-השרת - עולם בו כח חישוב מצוי בשפע, ויש מגוון רחב של ספריות מפותחות לעיבוד וידאו?
בכל מקרה, החידוש העיקרי והעכשווי הוא סביב FaaS - ובו נתמקד בשארית הפוסט.
אפשר לייחס ל Serverless Applications את התכונות הבאות:
איזה סוג של מערכות אם כן, מתאימות יותר ל Serverless Architectures?
לגבי העלויות ארצה לציין זאת במפורש: יש אינסוף אזכורים לכמה AWS Lambda עשויה זולה יותר מ EC2. שמעתי לא פעם את המספר "80% חסכון!". זה סיפור טוב. כשצוללים לפרטים, ניתן לראות סיפורים על חסכון משמעותי - כאשר יש 3 קריאות ביום (מול שרת t2.micro).
יותר קשה למצוא ניתוחים של עלויות AWS Lambda ב scale גבוה. כל הניתוחים הללו שראיתי (הנה דוגמה) מראים מחיר גבוה יותר בשימוש ב Lambda מאשר בשימוש ב EC2.
"כמה זמן יעבור עד ש Serverless Architectures יהיו הסטנדרט?" - היא שאלה שכבר שמעתי.
"כמו שהענן הולך להעלים את תצורות ה On-Premises... הרי Serverless יעלימו את ה Client-Server"
האמת - שאני לא יודע.
ייתכן וזה באזז שיחלוף, וייתכן שלגישת ה Serverless Architectures תהיה השפעה רבה על עיצוב מערכות מכאן ואילך.
אנשים רבים מבלבלים או מחליפים בין Microservices ל FaaS: מתארים פונקציה בודדת פשוטה (FaaS) כמיקרו-שירות.
למשל: שמעתי מישהו שהסביר שמיקרו שירות הוא Fully Stateless בהגדרה, ואסור שיהיו לו תלויות בשירותים אחרים.
הוא תיאר ככל הנראה פונקציה ב FaaS - ולא מיקרו-שירות.
למרות שיש דמיון בין הגישות, קרי: חלוקת המערכת לחלקים קטנים הרבה יותר, יש הבדל מהותי במוטיבציות:
במיקרו שירותים מחלקים מערכת גדולה ומורכבת על מנת שהמתכנתים (שמספרם הולך וגדל בשלב hyper-scaling של החברה) יוכלו להשתלט על הקוד ביתר קלות, ועל מנת להשיג Continuous Deployment.
אם המערכת לא כ"כ מורכבת - ההמלצה היא להישאר עם מונוליט. כמו כן, ההנחה היא שחלק גדול מהשירותים הולכים לשמור מידע בבסיסי נתונים כאלה ואחרים - ויש הרבה קשרים בין השירותים.
ב FaaS לוקחים חלקים מאוד ספציפיים מהמערכת (או מהמיקרו-שירות), בד"כ חלקים פשוטים, ולהוציא אותם החוצה. המוטיבציה היא מכלול של שיקולים שונים כמו: ניהול ע"י צד שלישי, Scalability גבוה, קרבה למשאבי מחשוב (למשל: לשים פונקציות מסויימות על ה CDN שלי כך שיהיה קרוב למשתמשים ויספק תשובה במילי-שניות ספורות), וכו.
חלוקה שכזו עובדת טוב על פונקציות שיש להן מינימום תלויות, וכמה שפחות state - או לפחות: shared state.
חשוב להבין את המוטיבציה, וה tradeoffs הנתונים לכל גישה - ולא להיסחף אחרי "סיפורי הצלחה" של ארגונים אחרים, עם בעיות אחרות - שאולי לא שקולות לבעיות שעליכם לפתור.
שיהיה בהצלחה!
---
[א] קרי - להעמיד מוצר ראשוני / התחלתי
אתם מציירים קוביות וחצים ביניהם על הלוח ומסבירים (בצורה משכנעת ככל האפשר) - למה זו דרך טובה מאוד לפתור את הבעיה.
"עכשיו תעשה לי את זה בלי שרת" - מבקש המראיין.
ווב, בלי שרת? כלומר... Rich Client שלא מתקשר עם אף אחד?
"לא. בדיוק רק מה שהצגת - אבל בוא נבטל את השרת".
לרובנו השלב הבא יהיה להבין לעזאזל מה חושב המראיין (??). זה איזה תרגיל לוגי מתחכם? אולי תרגיל בבחינת האישיות שלנו? אולי בעצם הגענו לראיון במחלבה של תנובה, ולא בחברת הייטק?!
מאז שנות ה-80, מודל ה Client-Server הוא המודל העיקרי של מערכות תוכנה, והוא עובד טוב. יש טרנדים: פעם לקוח רזה, ופעם לקוח שמן. פעם שרת מרכזי, ופעם שרת-רזה. אבל בכל זאת, ובמיוחד מאז עליית האינטרנט בשנות ה-2000 - אין כמעט מערכות שאנו משתמשים בהן שלא מחוברות לאיזשהו שרת (חוץ מכמה אפליקציות אופיס, Photoshop, או משחקים - וגם זה משתנה).
אז איך בדיוק אנחנו נבנה מערכות ללא-שרת? האם זה רק גימיק שיווקי (למשל: "השרת הוא בענן"), פתרון ספציפי לצרכים מיוחדים, או אולי באמת בסוג של מהפכה?
הרי קשה להתעלם מהבאזז המוזר הזה של "Serverless Architectures", באזז שכולל Frameworks, ספרים, ואפילו Conference שמוקדש לנושא.
בפוסט הזה אנסה להסביר את הנושא. נראה שבעצם כל התשובות נכונות.
הכרזה של ServerlessConf בניו-יורק |
אז מה בעצם הכוונה ב "Serverless"?
כמו באזזים שונים שנתקלתי בהם בעולם התוכנה לאורך השנים ("SOA", "MVC", או "Big Data"), חוסר בהירות או אחידות בהבנת העקרונות הבסיסיים מאחורי הבאזז - לא מונעים מהבאזז לפרוח (אולי אפילו להיפך). זה קצת כמו הברקזיט: קודם מצביעים - ואז הולכים להבין במה מדובר ;-)
את באזז ה Serverless ניתן לקשר לשלושה כיוונים עיקריים:
BaaS (קיצור של Backend as a Service) - שירות המאפשר למפתחי צד-לקוח (בעיקר מובייל, ולכן לעתים נקרא גם MBaaS) לבצע bootstrapping[א] מהיר ללא הצורך בידע והשקעה בצד השרת.
שירותים כמו parse.com (שנקנתה ע"י פייסבוק ואח"כ נסגרה), Firebase, או Kinvey הפכו פופולריים בעולם הסטארטאפים, וקיימים גם פתרונות פופלארים בקהילות הסגורות של עולם ה Enterprise (יבמ, אוקרל, סאפ) שבוודאי יהיו פחות מוכרים לאיש התוכנה הממוצע.
שירותים אלו מספקים סט יכולות סטנדרטי (כ API), שבעצם פותר את עיקר הצרכים של אפליקציות מובייל בתחילת דרכן: שמירת נתונים, למשמש או מידע שישותף בין המשתמשים. ניהול הרשאות, אנליטיקס ו notifications למשתמשים. לכל פלטפורמה יש כמה יכולות נוספות משלה.
הסטארטאפ יכול בעצם להתמקד באפליקציית המובייל, ובעלות זניחה יחסית - לקבל שירותים בסיסיים בצד-השרת השמאפשרים "להרים" אפליקציה במהירות. בעתיד, ובמידה שהאפליקציה תצליח - יהיה ניתן להעביר את פונקציונליות השרת בהדרגה לפתרון custom made שיתאים בצורה מדוייקת יותר לצרכים.
האם ב BaaS אין שרת? - יש שרת, הוא פשוט מוצר מדף "סטנדרטי".
האם זו נישה? - במידה מסוימת כן. סטאראטאפים בתחילת דרכים.
האם זו גישה חדשנית או אפילו מהפכנית? - כן, אם אתם סטאראטאפ שנופל לקטגוריה.
FaaS (קיצור של Functions as a Service) היא הגל השני של ה Serverless Architectures, שעלה לכותרות בעיקר בעקבות ההצגה של שירות AWS Lambda. למרות שהשירות שוחרר בגרסתו הראשונית עם מגבלות רבות, הוא הגיע משחקן מוכר ומוערך מאוד (אמזון), עם מחיר כניסה אפסי (אפשר להתנסות בו במחיר של סנטים), ובמרחק נגיעה - כי למאות אלפי (?) מתכנתים יש כרטיס אשראי כבר מוזן באמזון, והם יכולים להפעיל את השירות במרחק של קליק.
הפתרון, בגדול, מאפשר לכתוב ולעשות deploy לפונקציה בודדות - שתופעל כתגובה לקריאה ל endpoint (נקראים: "event sources") שנגדיר.
תפעול הפונקציות הללו (ניהול עומס, monitoring, ו High Availability) מנוהל ע"י אמזון. רק מעדכנים את קוד הפונקציה - ואמזון דואגת לשאר.
בעצם FaaS הוא סוג של PaaS (כלומר: Platform as a Service, סליחה על השימוש התכוף בבאזזים) ברזולוציה קטנה הרבה יותר: במקום אפליקציה - פונקציה.
מאז הצגת AWS Lambda הזדרזו המתחרים להציג שירותים מקבילים, והיום יש לנו גם את Google Cloud Functions (עדיין באלפא, בעת כתיבת פוסט זה), את Azure Functions (גם הוא חדש), ואת OpenWhisk של יבמ (שרצה על פלטפורמת Bluemix של יבמ, פלטפורמה מוכרת בכנסים - וקצת פחות מפתרונות בפרודקשיין).
במקביל לענקיות הענן, ישנם גם מפתרונות של שחקנים קטנים, למשל:StackHut או WebTask.
האם ב FaaS אין שרת? - יש קוד צד-שרת, אבל בעצם מדובר בסט של פונקציות עצמאיות המנוהלות ע"י מישהו אחר. יש צד-שרת, למרות שאין "שרת".
האם זו נישה? - כרגע כן. הרבה משחקים באופציה החדשה, מתלהבים ("יו! פאקינג אינסוף Scalability!!"), אבל גם מתפכחים ("אהה.. אבל ה DB הוא צוואר הבקבוק של ה scale" / "קצת נהיה בלאגן" / "זה יוצא דווקא דיי יקר...").
האם זו גישה חדשנית או אפילו מהפכנית? - אולי. נהיה חכמים יותר עוד שנתיים - שלוש. עדיין יש פה גישה חדשה שמאתגרת הרבה מאוד ממה שהתרגלנו אליו עד עכשיו בעולם צד-השרת.
תת-וריאציה (מעט משונה) של FaaS היא DBFaaS, הגישה הזו גורסת שלעתים קרובות אנו זקוקים ב FaaS לפנוקציות שמבצעות עיבוד קל על נתונים. היכן יותר יעיל לשים את הפונקציות הללו - אם לא ב Database עצמו?
לחברת SAP יש מוצר בשם HANA, בסיס נתונים in-memory, שמאפשר ממשק וובי ישיר ל stored procedures שלו.
גישה זו שוברת כמעט כל מוסכמה של Layered Architecture או MVC, ומציבה דאגות רבות (Scalability? אבטחה? יכולת debugging ותהליכי תוכנה נכונים?). אני עדיין לא מצאתי איזון בריא לגישה הזו - אך אין ספק שהיא מערערת מוסכמות וגורמת לחשיבה מחודשת של הדברים. למה בעצם לא??
טרנפורמציה של ארכיטקטורת Client-Server לארכיטקטורת Serverless. מקור: Bliki |
Serverless Web Site (אין קיצור מגניב)
תצורה אחרונה, וקצת פחות מהותית מהאחרות אליה מתייחסים כ Serverless Architecture היא לארח אתר אינטרנט (לרוב עם פונקציונליות מוגבלת, ובעיקר חוסר-תקשורת בין המשתמשים השונים) כ Static Content, ובניית כל הפונקציונליות ב JavaScript.
את קובצי ה HTML/CSS/JavaScript מארחים בשירות אכסון כמו S3 או אפילו עדיף - CDN.
הם בגישה זו אין שרת? - אפשר לומר שלא. ניתן להתייחס ל CDN כ"תשתית רשת".
האם זו נישה? - כן.
האם זו גישה חדשנית או אפילו מהפכנית? - לא ממש, אם כי היא אפשרית בעקבות ההתפתחות של שפת ה JavaScript ויכולות שונות בדפדפן מהשנים האחרונות. יש אנשים שיישום השיטה הזו גורם להם לסיפוק רב.
כמה שהגישות השונות שהצגתי הן שונות זו מזו - יש ביניהן סינרגיה.
כאשר אנו משתמשים ב BaaS, תחת היכולות הגנריות שמציע השירות הספציפי - מה יותר טבעי מלהוסיף קצת custom server functionality כ FaaS?
פגשתי לא מזמן מישהו שכתב אפליקציית מובייל, והיה זקוק לבצע עריכה מסוימת על קטעי וידאו שהמשתמש צילם.
האפליקציה התבססה על Parse - שבאופן טבעי לא כוללת שום יכולות של עיבוד וידאו. עיבוד וידאו במובייל הוא זללן של סוללה, ולספריות הקיימות יש מגבלות רבות.
מה יותר פשוט מהוספת פונקציה בודדת של עיבוד וידאו בצד-השרת - עולם בו כח חישוב מצוי בשפע, ויש מגוון רחב של ספריות מפותחות לעיבוד וידאו?
בכל מקרה, החידוש העיקרי והעכשווי הוא סביב FaaS - ובו נתמקד בשארית הפוסט.
מקור: אמזון. לטעמי השימוש כאן במונח "Microservice" הוא לא ממש מדויק. אם היו גם מציינים גם Big Data, דוקר, ו IoT - זה היה כבר יותר הגיוני :-) |
אז מה הם באמת התכונות העיקריות של ארכיטקטורה "ללא-שרת" (קרי: מבוססת FaaS)?
אפשר לייחס ל Serverless Applications את התכונות הבאות:
- התבססות במידת האפשר על שירותי צד-שלישי.
- ה Flows העיקריים של האפליקציה מנוהלים בצד-הלקוח. צד השרת מספק בעיקר "פונקציות".
- בניגוד לשרת שחי לאורך זמן, וטיפל בבקשות שונות - ב Serverless Architectures המופע של צד-השרת חי לאורך טיפול בבקשה. יכולים להיות אלפים כאלו שמופעלים ונדומים בשנייה.
- זו תכונה טכנית יחסית, שעשויה להשתנות. ייתכן והספקים יתחילו לספק הנחות למי שמבטיח כמות מסוימת של שימוש בשעה - והדרך להוזיל עלויות תהיה כן להחזיק כמות מסוימת של instances קבועים.
- יתרונות נוספים של instances קבועים הם cache "חם" (ברמות השונות) וביטול / קיצור ה initialization latency.
- ארכיטקטורות Serverless לוקחות את רעיון ה Continuous Deployment לאקסטרים חדש: כעת ניתן, בכל רגע, לבצע דיפלוי ברזולוציה של פונקציה בודדת.
יתרונות:
- חסכון בעלויות, כי משלמים רק על מה שרץ - במיוחד כאשר יש traffic דליל. בסקייל בינוני ומעלה - זה יותר יקר.
- יותר אופרציה מנוהלת ע"י ספק השירותים, או קצת בהקצנה: noOps#. רעיון ה Platform as a Service (בו כמעט כל היבטי ניהול אפליקציות מבוצע ע"י הספק) לא הצליח כ"כ בפועל, אך יש סיכוי שמודל ה FaaS יצליח יותר.
- כאשר כל פונקציה (עם מאפייני הביצועים הייחודיים שלה) היא מבודדת - קל יותר לעשות Scaling. טעות נפוצה היא ש FaaS הוא "infinitely scalable". כאשר יש לפונקציה state משותף כזה או אחר - צווארי הבקבוק של ה scalability יהיו שם - כפי שהיה תמיד.
- אפשרות לקרב את הפונקציה למשאב אחר, למשל: קרוב מאוד לשירות צד-שלישי ולבצע חישובים שם, קרוב לנתונים, או אולי קרוב ללקוחות (למשל: לשים פונקציות שירוצות אצל ספק ה CDN וכך יספקו תשובות מאוד מהירות למשתמשי הקצה שלי, בכל רחבי העולם).
חסרונות:
- חלוקה של מערכת להרבה פונקציות קטנות דיי מהר הופכת לאתגר תפעולי מצד המתכנתים. רבים מהמימושים המוצלחים של FaaS כרגע - מבוססים על פונקציות מעטות.
- חלוקת המערכת להרבה פונקציות קטנות עלולה ליצור קשיים בהשגת אמינות גבוהה: הרשת יכולה לשבש קריאות בין פונקציות שונות - ואם אנו זקוקים ל"אפס פספוסים", אנו נצטרך להתגונן בפני כשל של הרבה מאוד נקודות אינטגרציה.
- Lock-In ל Vendor המספק לכם את השירותים. אולי הפונקציות עצמן מבודדות (isolated), אך סביר שהן משתמשות ב infrastructure נוסף (הרשאות, API Gateway, אכסון נתונים, וכו') שכובל אתכם לספק הספציפי.
- כאשר כל פונקציה רצה בפני עצמה בשרת צד-שלישי, ולא ניתן להריץ את הקוד לוקאלית - הפיתוח נעשה מורכב יותר.
- לא יפתיע אותי אם נראה בקרוב יותר ויותר אמולטורים שמאפשרים להריץ את פתרונות ה FaaS (בצורה פחות יעילה / אמינה - רק לצורך פיתוח) על המחשב המקומי.
- לפחות כרגע, לפתרונות כמו AWS Lambda יש Initialization latency לפונקציה - כלומר: אתחול הפונקציה מוסיף לזמני התגובה כ 100-600 מילישניות (ע"פ דיווחים שונים). זה בסדר ל Event Processing, אבל קצת פחות טוב ל UI או מערכות semi-realtime.
איזה סוג של מערכות אם כן, מתאימות יותר ל Serverless Architectures?
- UI-Centric Apps - אפליקציות בהן חווית המשתמש היא המרכזית, והצרכים מצד השרת הם מצומצמים. אלו יהיו בעיקר אפליקציות מובייל - אך לעתים גם מערכות ווב.
- Message-Driven Systems - מערכות שעיקר עיסוקן הוא טיפול באירועים, למשל: טיפול בטרנזקציות בנקאיות, איתור Fraud, או מערכת שמחליטה איזו מודעה להתאים למשתמש. מערכות אלו ניתן לפרק בקלות יחסית לסדרה של פונקציות, כאשר יש הגיון לשפר כל פונקציה בנפרד: הן מבחינת ביצועי תוכנה = לרוץ מהר יותר, והן מבחינת ביצועים עסקיים = לתת תשובה קצת יותר מדויקת.
- אם המבנה הלוגיקה העסקית הוא של Pipes and Filters - מבנה ועקרונות של Serverless Architectures עשויים בהחלט להיות רלוונטיים.
- באזז נוסף שמתקשר ל Message-Driver Systems ו FaaS הוא IoT (קיצור של Internet of Things): אירועים שמגיעים מהמון מכשירים קטנים.
- חיזוק לנאמר לעיל: מערכות בהן אין (או כמעט ואין) State בצד השרת.
- בשפה של תכנות פונקציונלי: הפונקציות של FaaS הן Pure Functions.
- (קצת תיאורטי) יש טיעון שמערכות שחוות spikes גדולים מתאימות ל Serverless Architecture בגלל הציפיה לתשלום ע"פ גרנולריות מדויקת של שימוש, ויכולת Scalability גבוהה כאשר הפונקציות הן stateless.
- כאשר AMI של אמזון (שנבנה בצורה המתאימה) יכול לעלות ולהיכנס לשימוש בטווח של דקה או שתיים - רוב ה spikes יכולים להיות מטופלים בצורה סבירה עם autoscaling. קשה לי להאמין שהעלויות של FaaS יוכלו להתחרות בעלויות של ניהול התשתית בעצמנו (IaaS) - כאשר מדובר ב Scale גבוה. אין ארוחות חינם.
לגבי העלויות ארצה לציין זאת במפורש: יש אינסוף אזכורים לכמה AWS Lambda עשויה זולה יותר מ EC2. שמעתי לא פעם את המספר "80% חסכון!". זה סיפור טוב. כשצוללים לפרטים, ניתן לראות סיפורים על חסכון משמעותי - כאשר יש 3 קריאות ביום (מול שרת t2.micro).
יותר קשה למצוא ניתוחים של עלויות AWS Lambda ב scale גבוה. כל הניתוחים הללו שראיתי (הנה דוגמה) מראים מחיר גבוה יותר בשימוש ב Lambda מאשר בשימוש ב EC2.
סיכום
"כמה זמן יעבור עד ש Serverless Architectures יהיו הסטנדרט?" - היא שאלה שכבר שמעתי.
"כמו שהענן הולך להעלים את תצורות ה On-Premises... הרי Serverless יעלימו את ה Client-Server"
האמת - שאני לא יודע.
ייתכן וזה באזז שיחלוף, וייתכן שלגישת ה Serverless Architectures תהיה השפעה רבה על עיצוב מערכות מכאן ואילך.
אנשים רבים מבלבלים או מחליפים בין Microservices ל FaaS: מתארים פונקציה בודדת פשוטה (FaaS) כמיקרו-שירות.
למשל: שמעתי מישהו שהסביר שמיקרו שירות הוא Fully Stateless בהגדרה, ואסור שיהיו לו תלויות בשירותים אחרים.
הוא תיאר ככל הנראה פונקציה ב FaaS - ולא מיקרו-שירות.
למרות שיש דמיון בין הגישות, קרי: חלוקת המערכת לחלקים קטנים הרבה יותר, יש הבדל מהותי במוטיבציות:
במיקרו שירותים מחלקים מערכת גדולה ומורכבת על מנת שהמתכנתים (שמספרם הולך וגדל בשלב hyper-scaling של החברה) יוכלו להשתלט על הקוד ביתר קלות, ועל מנת להשיג Continuous Deployment.
אם המערכת לא כ"כ מורכבת - ההמלצה היא להישאר עם מונוליט. כמו כן, ההנחה היא שחלק גדול מהשירותים הולכים לשמור מידע בבסיסי נתונים כאלה ואחרים - ויש הרבה קשרים בין השירותים.
ב FaaS לוקחים חלקים מאוד ספציפיים מהמערכת (או מהמיקרו-שירות), בד"כ חלקים פשוטים, ולהוציא אותם החוצה. המוטיבציה היא מכלול של שיקולים שונים כמו: ניהול ע"י צד שלישי, Scalability גבוה, קרבה למשאבי מחשוב (למשל: לשים פונקציות מסויימות על ה CDN שלי כך שיהיה קרוב למשתמשים ויספק תשובה במילי-שניות ספורות), וכו.
חלוקה שכזו עובדת טוב על פונקציות שיש להן מינימום תלויות, וכמה שפחות state - או לפחות: shared state.
חשוב להבין את המוטיבציה, וה tradeoffs הנתונים לכל גישה - ולא להיסחף אחרי "סיפורי הצלחה" של ארגונים אחרים, עם בעיות אחרות - שאולי לא שקולות לבעיות שעליכם לפתור.
שיהיה בהצלחה!
---
[א] קרי - להעמיד מוצר ראשוני / התחלתי
אחלה פוסט!
השבמחקכמה תיקונים:
1) Kinvey ולא Kinvery,
2) WebTask ולא WebStack
תודה רבה, ארז!
מחקתוקן.
הי, פוסט מעולה.
השבמחקהאם FaaS בהגדרתו stateless או שיש שירותים שנותנים שמירה של sessions?
המונח FaaS הגיע מהשטח (למשל: https://goo.gl/5RqFQB) ולא הוגדר ע״י הספקים השונים - ולכן אין לי תשובה לשאלה שלך.
מחקנראה שמי שמיישם FaaS משתדל להצמד לפונקציות שהן stateless (כלומר: אפילו ללא state משותף מרכזי כמו redis, מקסימים state per workflow - שאינו משותף) - וכך הכל הרבה יותר פשוט.
הי, פוסט מעולה.
השבמחקהאם FaaS בהגדרתו stateless או שיש שירותים שנותנים שמירה של sessions?
אמית, אני חושב שהאמירה של scale אינסופי נובעת מהעובדה שאתה לא צריך לשמור את הנתונים, הוספה של persistence תגביל את ספק השירות.
מחקאמית, אני חושב שהאמירה של scale אינסופי נובעת מהעובדה שאתה לא צריך לשמור את הנתונים, הוספה של persistence תגביל את ספק השירות.
מחקתודה רבה על כל האינפורמציה
השבמחקאני חושב שזה איזהשהוא אבולציה של ה micro services
שענקיות התוכנה מרגישות שהם יכולות לספק גם תשתיות יותר קטנות של עיבוד
עם קצת לוגיקה ולגרוף עוד כמה מילוני דולרים תוך כדי .
מה שהיה יכול להיות נחמד זה לתת תשתית גם לאנשים קטנים לפתח micros service בענן
וגם להרוויח קצת
ייתכן.
מחקהייתי רוצה לציין שהאבולוציה שאני רואה בתוך קהילת המיקרו-שירותים היא יותר לכיוון "right size service״, לפעמים לצמצם את גודל השירות לרמה של פונקציה, אבל לא פחות להתיר גם קיום של שירותים גדולים יותר, ״midi service״ - למשל כאלו עם 10,000 שורות קוד, כי יש צרכים (consistency, אטומיות) - שפשוט יותר נכון להשיג בתוך process יחיד של תוכנה.
מגמת ה FaaS נראית לי דיי אורטוגונלית לגישת ה MSA, אם כי ייתכן שגישת ה MSA הכינה את הקרקע לגישת ה FaaS בעצם הרעיון שמערכת יכולה להיות בנויה בהצלחה ממאות שירותים קטנים.
פוסט מאוד מעניין וגישה בהחלט מעניינת.
השבמחקאני תוהה האם לגישה יש הגיון טכנולוגי גם במערכות עם state? אם נניח צריך לבצע שליפה ולוגיקה מעליה.
מצד אחד אנחנו מקבלים scaling פשוט על הלוגיקה, מצד שני אנחנו עדיין צריכים לשלם את המחיר התחזוקתי של מאגר נתונים שיוכל לעמוד בכמויות.
היי,
מחקאני מניח שהכל עניין של מידתיות:
הקושי העיקרי של FaaS הוא עם state *משותף*.
לא סתם יש הרבה דוגמאות ל Lambda (כלומר: FaaS) עם DynamoDB (קרי: Key/Value DB) באמזון. כאשר מדובר פונציה שקוראת value בודד מבסיס נתונים (נניח שמצייג משתמש או device) מבוזר עושה עליו חישוב ומאכסנת אותו חזרה - זה state שאינו משותף בין הרצה של פונקציות ולכן הוא scalable מאוד.
אם אני לא זקוק ל scale גדול - עדיין אני יכול להשתמש ב FaaS בהצלחה גם כשיש state משותף.
אם יש לי אפליקציית מובייל שדורשת כמות מצומצמת של חישובים ב server - אזי FaaS יכול להתאים.
אם מדובר במערכת עם כמות קטנה של business logic שמתחלקת יפה לפונקציות - אזי גם FaaS יכול להתאים.
בקיצור, כמו רוב הרעיונות בארכיטקטורת תוכנה: אין פה שחור ולבן, אלא עניין של מתאים יותר ומתאים פחות.
הטעות הכי גדולה תהיה, כמובן, לבחור ב FaaS בגלל שהוא פופולארי / נחשב ״מוצלח״ - לפתור סוג בעיה שהוא מאוד לא מתאים לה.
לדוגמא: יש לנו מערכת real time מורכבת עם חצי מליון שורות קוד, והמון state משותף ב DB. מישהו הציע לי להעביר אותה ל FaaS בכדי לשפר את ה Scalability שלה.
מחקזאת טעות גדולה.
תודה רבה על הפוסט,
השבמחקאני חייב גם להזכיר את Google app engine (כרגע יצאה גירסא חדשה מבוססת docker אך עדיין אפשר להשתמש ב standard)
יש שם סט כלים שמאפשר הרבה מאוד יכולות, כולל datastore שהוא מסד מנוהל לחלוטין עם כמה יתרונות על פני dynamo
סנאפצ׳אט כולו מבוסס על זה.
AWS lambda, שהוא נחמד ויעילי לקרולרים ובטח לעוד דברים, יקר יותר משרת,
אך יש לנו כמה ייתרונות עם האייפי המתחלף :)
תודה רבה, עוד פוסט מצויין!
http://martinfowler.com/articles/serverless.html
השבמחקכרגיל, תענוג לקרוא.
השבמחקצריך לזכור שAmazon Lambda הוא מוגבל במשאבים שלו הן מבחינת זמן הריצה (300 שניות) והן בכמות הזיכרון, אי אפשר לעשות עם זה פעולות קריטיות או כאלה שעלולות לצרוך זיכרון או זמן.
http://docs.aws.amazon.com/lambda/latest/dg/limits.html
אני חושב ששווה לציין גם את WebRTC שאומנם כרגע עדיין בחיתולים, אך מאפשרת להרים מערכות מורכבות בתצורת P2P (ראה Peer5 למשל - P2P CDN). כרגע הטכנולוגיה בעיקר מיושמת לשלוח קבצים ללא מעורבות שרת (מה שמביא למהירות שליחה גבוהה בLAN), למשל: http://cend.me אך בעתיד הלא רחוק אני חושב שנראה אותה בעוד הרבה מקומות.
השבמחק(לרוב, עדיין יש שרת מעורב בהקמת הסשן P2P - "מתווך")
מעניין מאד. תודה.
השבמחקהאם יש חברות ישראליות (או חברות בין-לאומיות עם נוכחות בישראל) שלידיעתכם משתמשות ב Serverless או שזה עדיין קונספט שרק שכבה מאד קטנה של חברות בארה"ב משתמשות בו?
היי,
מחקב Next Insurance משתמשים בפונקציות למבדה כחלק מהמערכת. אני מודע לכמה חברות נוספות בהייטק הישראלי שמשתמשות בלמבדה - אבל בד"כ לדברים קטנים. לא ידוע לי על חברה שהיא completely stateless - כלומר: כל קוד צד השרת שלה מבוסס FaaS.
ליאור