מילון מונחים לבקאנד - כל המושגים שכל מפתח צד שרת חייב להכיר¶
כשמתחילים ללמוד צד שרת נתקלים בערימה של מושגים שאף אחד לא טורח להסביר מההתחלה - כולם מניחים שאתם כבר יודעים מה זה מידלוור או מה ההבדל בין אימות להרשאה. הדף הזה נועד לפתור את זה. אספנו כאן את המונחים שכל מפתח בקאנד פוגש שוב ושוב, מוסברים בפשטות ובלי מילים גבוהות. תשמרו את הדף בסימניה ותחזרו אליו כל פעם שמונח מוכר לכם, אבל לא באמת.
יסודות השרת וה-API¶
שרת - Server
תוכנה (או מחשב) שמחכה לבקשות מלקוחות ומחזירה תשובות. כשאתם פותחים אתר, הדפדפן שלכם שולח בקשה לשרת, והשרת מחזיר את הדף. שרת יכול לרוץ על המחשב האישי שלכם, בענן, או בכל מקום שיש לו חיבור לרשת.
נקודת קצה - Endpoint
כתובת ספציפית ב-API שמבצעת פעולה מסוימת. לדוגמה /users/5 היא נקודת קצה שמחזירה את פרטי המשתמש עם המזהה 5. כל API בנוי מאוסף של נקודות קצה כאלה, כל אחת עם תפקיד משלה.
תיווך - Middleware
פונקציה שרצה באמצע, בין קבלת הבקשה לבין הטיפול הסופי בה. לדוגמה מידלוור שבודק אם המשתמש מחובר, לפני שהוא בכלל מגיע לקוד שמחזיר לו את הנתונים. אפשר לחבר כמה מידלוורים בשרשרת, אחד אחרי השני.
נתיב - Route
ההגדרה שמקשרת בין כתובת ומתודת HTTP (כמו GET או POST) לבין הפונקציה שמטפלת בבקשה. לדוגמה נתיב שמגדיר שבקשת GET לכתובת /products תפעיל פונקציה שמחזירה רשימת מוצרים.
בקר - Controller
השכבה בקוד שמקבלת בקשה מנותבת, מפעילה את הלוגיקה העסקית הרלוונטית, ומחזירה תשובה. הרעיון הוא להפריד בין ניתוב הבקשות לבין הלוגיקה עצמה, כדי שהקוד יהיה מסודר וקל לתחזוקה.
REST API
סגנון עיצוב נפוץ ל-API שמבוסס על משאבים וכתובות, כשכל פעולה מיוצגת דרך מתודת HTTP מתאימה - GET לקריאה, POST ליצירה, PUT או PATCH לעדכון, DELETE למחיקה. כמעט כל API שתפגשו היום מנסה להתקרב לעקרונות האלה, גם אם לא באופן מושלם.
Webhook
דרך שבה שרת אחד מודיע לשרת אחר על אירוע, בלי שהשני צריך לשאול כל הזמן אם קרה משהו. לדוגמה חברת סליקה שולחת בקשת POST לשרת שלכם ברגע שתשלום הצליח, כדי שתעדכנו את ההזמנה במסד הנתונים.
בסיסי נתונים ואחסון¶
ORM
שכבת תרגום שמאפשרת לכתוב קוד רגיל בשפת התכנות שלכם במקום שאילתות SQL ישירות, וה-ORM דואג לתרגם את זה למסד הנתונים בפועל. זה חוסך כתיבה חוזרת, אבל שווה להבין מה קורה מתחת למכסה, כי לפעמים הוא מייצר שאילתות פחות יעילות.
מיגרציית בסיס נתונים - Database Migration
קובץ שמתעד שינוי במבנה של מסד הנתונים, כמו הוספת עמודה או טבלה חדשה, כדי שאפשר יהיה להריץ אותו בסביבות שונות ולעקוב אחרי היסטוריית השינויים. בלי מיגרציות, כל מפתח בצוות היה צריך לעדכן ידנית את המסד שלו בכל פעם שהמבנה משתנה.
בריכת חיבורים - Connection Pool
אוסף של חיבורים פתוחים מראש למסד הנתונים, שהאפליקציה משתמשת בהם חוזר ושוב במקום לפתוח חיבור חדש לכל בקשה. פתיחת חיבור למסד היא פעולה יקרה יחסית, אז בריכת חיבורים חוסכת המון זמן וביצועים תחת עומס.
ACID
ראשי תיבות של ארבע תכונות שמסדי נתונים רלציוניים מבטיחים לטרנזקציה - שהכל קורה או כלום, שהמסד נשאר תקין, שטרנזקציות לא מפריעות אחת לשנייה, ושמה שנשמר נשאר גם אחרי קריסה. זה מה שנותן ביטחון שהעברת כסף בין שני חשבונות לא תתקע באמצע.
סריאליזציה - Serialization
המרה של נתונים ממבנה בזיכרון (כמו אובייקט בקוד) לפורמט שאפשר לשלוח או לשמור, בדרך כלל JSON. הפעולה ההפוכה, מ-JSON חזרה לאובייקט, נקראת דה-סריאליזציה. כל תשובת API שאתם שולחים עוברת סריאליזציה לפני שהיא יוצאת מהשרת.
אימות והרשאות¶
אימות מול הרשאה - Authentication vs Authorization
אימות זה לוודא מי אתם - למשל התחברות עם סיסמה. הרשאה זה לקבוע מה מותר לכם לעשות אחרי שזיהו אתכם - למשל האם מותר לכם למחוק משתמשים אחרים. שני המושגים מתבלבלים כל הזמן, אבל השאלה שהם עונים עליה שונה לגמרי.
Session מול Token - JWT
session היא דרך לזכור משתמש מחובר על ידי שמירת מידע בצד השרת, כשהלקוח מחזיק רק מזהה קטן. token, ובפרט JWT, הוא אובייקט חתום שמכיל את כל המידע על המשתמש בתוכו, כך שהשרת לא צריך לשמור כלום ורק מאמת את החתימה. JWT נוח לשירותים מבוזרים, session נוח יותר לשליטה מיידית על ניתוק.
משתנה סביבה - Environment Variable
ערך שמוגדר מחוץ לקוד, ברמת מערכת ההפעלה או סביבת ההרצה, ומשמש להעברת הגדרות רגישות כמו סיסמאות מסד נתונים או מפתחות API. ככה לא שומרים סודות בתוך הקוד עצמו, וקל להחליף הגדרות בין סביבת פיתוח לייצור בלי לגעת בקוד.
ביצועים וסקייל¶
קאש - Cache
שכבת אחסון זמנית ומהירה שמחזיקה תוצאות שכבר חושבו, כדי לא לחשב אותן שוב מאפס. לדוגמה שמירת תוצאה של שאילתה כבדה בזיכרון למשך כמה דקות, כדי שהבקשה הבאה תקבל תשובה מיידית במקום לחכות למסד הנתונים.
תור הודעות - Message Queue
מנגנון שמאפשר לשירות אחד לשלוח הודעה ולהמשיך הלאה, בזמן ששירות אחר מטפל בה בקצב שלו. זה שימושי למשימות כבדות כמו שליחת מיילים או עיבוד קבצים, כשלא רוצים שהמשתמש יחכה עד שהכל יסתיים.
הגבלת קצב - Rate Limiting
מנגנון שמגביל כמה בקשות לקוח מסוים יכול לשלוח בפרק זמן נתון, כדי למנוע עומס יתר או שימוש לרעה ב-API. לדוגמה הגבלה של מאה בקשות בדקה למשתמש, ומעבר לזה השרת מחזיר שגיאה ומבקש לחכות.
מאזן עומסים - Load Balancing
רכיב שמפזר בקשות נכנסות בין כמה שרתים זהים, כדי שאף שרת אחד לא יקרוס תחת עומס. אם שרת אחד נופל, מאזן העומסים פשוט מפנה תעבורה לשאר השרתים בלי שהמשתמשים ירגישו.
הרחבה אופקית מול אנכית - Scaling
הרחבה אנכית היא חיזוק של שרת בודד עם יותר עוצמת מעבד או זיכרון. הרחבה אופקית היא הוספת עוד שרתים שרצים במקביל ומחלקים ביניהם את העומס. רוב המערכות הגדולות בעולם מתבססות בעיקר על הרחבה אופקית, כי יש לה תקרה הרבה יותר גבוהה.
מיקרוסרביסים מול מונוליט - Microservices vs Monolith
מונוליט הוא אפליקציה אחת גדולה שמכילה את כל הלוגיקה במקום אחד. מיקרוסרביסים הם פירוק של אותה אפליקציה לשירותים קטנים ונפרדים, שכל אחד אחראי על תחום מצומצם ומתקשר עם השאר דרך רשת. מונוליט קל יותר להתחיל איתו, מיקרוסרביסים נותנים גמישות רבה יותר בהמשך.
Cron Job
משימה שמוגדרת לרוץ אוטומטית בזמנים קבועים, בלי שמישהו מפעיל אותה ידנית. לדוגמה סקריפט שרץ כל לילה בשלוש בבוקר וניקוי רשומות ישנות מהמסד, או שליחת דוח יומי במייל.
לוגים - Logging
תיעוד שיטתי של מה שקורה בשרת, כדי שתוכלו להבין מה השתבש כשמשהו נשבר. לוגים טובים כוללים חותמת זמן, רמת חומרה, ופרטים רלוונטיים - בלי לוגים, דיבוג של תקלה בייצור הופך לניחוש עיוור.
אם המושגים עדיין מרגישים מנותקים מהקשר, כדאי להעיף מבט על קורס הצד שרת החינמי שלנו, שבו כל מונח כזה מלווה בדוגמאות קוד ותרגילים.
בסופו של דבר, המילים האלה הן רק תוויות. ברגע שתבנו API אחד משלכם ותתקלו במידלוור, בקאש ובהגבלת קצב בעצמכם, כל המונחים האלה יהפכו טבעיים לגמרי. נתקעתם באמצע? בואו נדבר.