ארכיטקטורות ללא שרת (Serverless Architectures) - למה זה טוב בכלל?

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

devs getty images

קרדיט תמונה\צלם: Ernst Grasser, Getty Images Israel

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

"עכשיו תעשה לי את זה בלי שרת" – מבקש המראיין.
ווב, בלי שרת? כלומר… Rich Client שלא מתקשר עם אף אחד?

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

מאז שנות ה-80, מודל ה Client-Server הוא המודל העיקרי של מערכות תוכנה, והוא עובד טוב. יש טרנדים: פעם לקוח רזה, ופעם לקוח שמן. פעם שרת מרכזי, ופעם שרת-רזה. אבל בכל זאת, ובמיוחד מאז עליית האינטרנט בשנות ה-2000 – אין כמעט מערכות שאנו משתמשים בהן שלא מחוברות לאיזשהו שרת (חוץ מכמה אפליקציות אופיס, Photoshop, או משחקים – וגם זה משתנה).

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

הרי קשה להתעלם מהבאזז המוזר הזה של "Serverless Architectures", באזז שכולל Frameworks, ספרים, ואפילו Conference שמוקדש לנושא.

בפוסט הזה אנסה להסביר את הנושא. נראה שבעצם כל התשובות נכונות.

הכרזה של ServerlessConf בניו-יורק

הכרזה של 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

טרנפורמציה של ארכיטקטורת 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 - זה היה כבר יותר הגיוני.

מקור: אמזון. לטעמי השימוש כאן במונח "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 הנתונים לכל גישה – ולא להיסחף אחרי "סיפורי הצלחה" של ארגונים אחרים, עם בעיות אחרות – שאולי לא שקולות לבעיות שעליכם לפתור.

שיהיה בהצלחה!

הפוסט פורסם לראשונה בבלוג ארכיטקטורת תוכנה.

 

ליאור בר-און

ליאור בר-און הוא Chief Architect בחברת סטארטאפ ישראלית גדולה.

הגב

9 Comments on "ארכיטקטורות ללא שרת (Serverless Architectures) - למה זה טוב בכלל?"

avatar
Photo and Image Files
 
 
 
Audio and Video Files
 
 
 
Other File Types
 
 
 
Sort by:   newest | oldest | most voted
עמית
Guest

תודה

chezi
Guest

thanks. i really like it

איתמר
Guest

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

אני
Guest

זה באמת מעניין. וזה באמת serverLess

ברק
Guest

כן, זאת אפשרות מאוד מעניינת שהתחילה לפני כמה שנים אבל משום מה לא המשיכה. UnHosted אפשר לקרוא עליה כאן: https://unhosted.org/

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

עודד
Guest

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

יצחק
Guest

ב"ה

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

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

ככה שהמושג הזה הכן אמיתי וזה שמו.

ישראלי
Guest

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

רוו
Guest

כתבה Pointless. פשוט בלבול מוח אחד גדול ונסיון להתברג בתור מומחה בבאז שאתה מנסה להמציא.

wpDiscuz

תגיות לכתבה: