Atualizado há 1 mês
כאשר אתה בודק את יתרת חשבון הבנק שלך, המספר שאתה רואה אינו מאוחסן בקובץ אי-שם, מחכה להימסר. הוא מחושב — ממש כעת, עבורך ספציפית — על ידי שאילתת בסיסי נתונים, החלת כללים, בדיקת הרשאות, והרכבת תשובה. התוכנה שמבצעת את העבודה הזו היא שרת אפליקציות.
שרתי ווב מטפלים בשיחה: קבלת בקשות HTTP, ניהול חיבורים, הגשת קבצים סטטיים. שרתי אפליקציות מטפלים בחשיבה: הרצת קוד, עיבוד נתונים, אכיפת לוגיקת עסקים, יצירת תוכן דינמי. שרת הווב יודע איך לדבר. שרת האפליקציות יודע מה לומר.
מה שרתי אפליקציות עושים בפועל
כל אינטראקציה דינמית ברשת זורמת דרך שרתי אפליקציות. חפש מוצר, ושרת האפליקציות שואל את מסד הנתונים של המלאי, מיישם את המסננים שלך, מדרג תוצאות לפי רלוונטיות, בודק את מיקומך לצורך הערכות משלוח, ומרכיב את התשובה. פרסם ברשת חברתית, ושרת האפליקציות מאמת את התוכן שלך, שומר אותו במסד נתונים, מעדכן את הפידים של עוקביך, מפעיל התראות, ורושם את הפעילות לניתוח נתונים.
שרתי אפליקציות מספקים את סביבת הריצה לקוד זה, בתוספת שירותים שכמעט כל אפליקציה זקוקה להם: חיבורי מסד נתונים, ניהול טרנזקציות, אכיפת אבטחה, מעקב סשן, והעברת הודעות. ללא שירותים אלה, כל מפתח יצטרך לבנות מחדש את אותה תשתית עבור כל אפליקציה.
זרימת הבקשה
בקשה לתוכן דינמי עוקבת אחר נתיב צפוי. שרת הווב מקבל את בקשת ה-HTTP ומזהה שנדרש עיבוד אפליקציה — זה אינו קובץ סטטי. הוא מעביר את הבקשה לשרת האפליקציות, אשר מנתב אותה לקוד המתאים בהתבסס על ה-URL, שיטת ה-HTTP, או כללים אחרים.
קוד האפליקציה מתבצע. הוא עשוי לאמת את המשתמש, לשאול מסדי נתונים, לקרוא ל-API חיצוניים, לאמת נתונים שהוגשו, להחיל כללים עסקיים, וליצור פלט. שרת האפליקציות מנהל את הביצוע הזה — מספק גישה למסד הנתונים, מטפל בשגיאות, אוכף אבטחה, מנהל זיכרון.
ברגע שהקוד מייצר תשובה, היא זורמת חזרה: שרת אפליקציות לשרת ווב ללקוח. כל התהליך לוקח בדרך כלל אלפיות שניות.
שירותים מרכזיים
איגום חיבורי מסד נתונים פותר בעיה יקרה. יצירת חיבור מסד נתונים חדש לכל בקשה היא איטית — לחיצת יד TCP, אימות, הגדרות ראשוניות. מאגרי חיבורים שומרים חיבורים מוכנים לשימוש שבקשות משתפות, משפרים ביצועים באופן ניכר ומפחיתים את העומס על מסד הנתונים.
ניהול טרנזקציות מבטיח עקביות כאשר פעולות מתפרסות על פני מספר שלבים. העברת כסף בין חשבונות: חיוב אחד, זיכוי אחר. אם הזיכוי נכשל לאחר שהחיוב הצליח, הפסדת כסף. ניהול טרנזקציות מבצע rollback של פעולות לא שלמות, שומר על שלמות הנתונים מבלי לדרוש ממפתחים לכתוב לוגיקת rollback ידנית.
אכיפת אבטחה מטפלת באימות (מי אתה?), הרשאה (מה אתה יכול לעשות?), ומניעת מתקפות. שרתי אפליקציות משתלבים עם מערכות ארגוניות כמו LDAP, מנהלים בקרת גישה מבוססת תפקידים, ומגינים מפני SQL injection, cross-site scripting, ואיומים אחרים.
ניהול סשן עוקב אחר מצב המשתמש בין בקשות. HTTP הוא חסר מצב — כל בקשה עצמאית. אך משתמשים מצפים לרציפות: עגלות קניות נשמרות, מצב הכניסה נשמר, העדפות נקבעות. שרתי אפליקציות שומרים ומאחזרים את נתוני הסשן, ומציגים חוויה עם מצב מעל פרוטוקול חסר מצב.
עיבוד אסינכרוני מוציא פעולות איטיות מדרכו של המשתמש. שליחת אימיילי אישור, עיבוד קבצים שהועלו, יצירת דוחות — אלה לא צריכים לחסום את התשובה. תורי הודעות מאפשרים לאפליקציות להעביר משימות אלה לעיבוד ברקע.
מטמון מאחסן תוצאות יקרות-לחישוב בזיכרון. שאל את מסד הנתונים פעם אחת, שמור את התוצאה במטמון, הגש בקשות הבאות מהמטמון. האתגר הוא ביטול תוקף — לדעת מתי המידע השמור כבר אינו עדכני.
סביבות פיתוח לפי שפה
שפות שונות מתייחסות לאירוח אפליקציות בצורה שונה.
Java בעלת המסורת העשירה ביותר בשרתי אפליקציות. שרתים מלאים של Jakarta EE כמו WildFly מספקים שירותים ארגוניים מקיפים. מיכלי servlet קלים יותר כמו Tomcat מתמקדים ביישומי ווב. אפליקציות Spring Boot מודרניות לרוב מטמיעות את Tomcat ישירות — האפליקציה היא השרת.
Node.js מטפלת ב-HTTP ישירות דרך סביבת ריצה מונעת אירועים. מסגרות כמו Express מוסיפות ניתוב ו-middleware. לולאת האירועים החד-חוטית מטפלת ביעילות בעומסי I/O כבדים.
Python — אפליקציות פועלות על שרתים כמו Gunicorn או uWSGI, המארחים מסגרות כמו Django או FastAPI. תקן ה-WSGI מגדיר כיצד שרתים ואפליקציות מתקשרים.
Ruby משתמשת ב-Puma או Unicorn לאירוח אפליקציות Rails, עם תקן Rack המספק את חוזה הממשק.
.NET — אפליקציות פועלות על IIS (Windows) או Kestrel (חוצת-פלטפורמות), ולרוב משלבות תפקידי שרת ווב ושרת אפליקציות.
PHP פועלת דרך mod_php של Apache או PHP-FPM, כאשר שרת הווב מפעיל PHP לכל בקשה.
שרת ווב לעומת שרת אפליקציות
ההבחנה חשובה גם כשהקו מיטשטש.
שרתי ווב מצטיינים ב-HTTP: ניתוח בקשות, ניהול חיבורים, הגשת קבצים, סיום SSL, ניתוב לשכבות עורפיות. הם מותאמים לפעולות I/O ורשת.
שרתי אפליקציות מצטיינים בחישוב: הרצת קוד, ניהול טרנזקציות, אכיפת כללים עסקיים, שילוב עם מסדי נתונים. הם מותאמים לפעולות עיבוד ונתונים.
ארכיטקטורות מסורתיות שמרו על הפרדה ברורה: Apache כשרת ווב, WebLogic כשרת אפליקציות. ארכיטקטורות מודרניות לרוב משלבות — אפליקציית Node.js מטפלת הן ב-HTTP והן בלוגיקת עסקים בתהליך אחד.
אבל אפילו מערכות משולבות נהנות מהפרדה מושגית. הבנה של איזה קוד מטפל בדאגות HTTP לעומת לוגיקה עסקית משפרת ארכיטקטורה. ואפילו אפליקציות עצמאיות בדרך כלל יושבות מאחורי Nginx או reverse proxy אחר שמטפל ב-SSL, קבצים סטטיים ואיזון עומסים.
ההפרדה הפיזית עשויה להיעלם. ההפרדה המושגית נשארת בעלת ערך.
תבניות פריסה
מופע יחיד מריץ הכל על שרת אחד. פשוט לפריסה ולאיתור תקלות. נקודת כשל יחידה. מתרחב רק על ידי שדרוג החומרה.
סקייל אופקי מריץ מספר מופעים מאחורי מאזן עומסים. יתירות — מופע אחד נכשל, אחרים ממשיכים. פריסות מתגלגלות ללא השבתה. מתרחב על ידי הוספת מופעים. דורש עיצוב חסר מצב או אחסון סשן משותף.
מיקרו-שירותים מפצלים את האפליקציה לשירותים עצמאיים, כל אחד עם שרת אפליקציות משלו. שירותים שונים יכולים להשתמש בטכנולוגיות שונות, להתרחב באופן עצמאי, לפרוס באופן עצמאי. המורכבות עוברת לתיאום, לתקורת הרשת ולאיתור תקלות מבוזר.
קונטיינרים אורזים יחד אפליקציה ושרת, ומבטיחים עקביות בין סביבות. Kubernetes ופלטפורמות דומות מתזמרות את פריסת הקונטיינרים. זה הפך לתבנית הדומיננטית לאפליקציות מודרניות.
ללא שרת מבטל לחלוטין את ניהול השרתים. AWS Lambda ופלטפורמות דומות מריצות את הקוד שלך בתגובה לאירועים, ומתרחבות אוטומטית מאפס לאלפי מופעים. אין תשתית לניהול, ומשלמים רק עבור זמן הביצוע. המגבלות כוללות הגבלות על זמן ביצוע, עיכוב אתחול קר, ודרישות קפדניות של חוסר מצב.
שיקולי ביצועים
מודלי מקביליות קובעים כיצד שרתים מטפלים בבקשות בו-זמניות. שרשור לכל בקשה פשוט אך עתיר משאבים. מודלים מונעי אירועים מטפלים בבקשות רבות עם מעט שרשורים באמצעות I/O לא-חוסם. מאגרי עובדים מאזנים בין שימוש במשאבים לתפוקה.
כוונון משאבים כולל גדלי מאגר שרשורים, מגבלות חיבור, הקצאת זיכרון וזמני קצב. משאבים מעטים מדי מגבילים תפוקה. יותר מדי גורמים לדלדול.
מטמון מספק שיפורים ניכרים כשמוחל היטב. הבעיה הקשה היא ביטול תוקף — לדעת מתי המידע השמור כבר אינו עדכני.
אופטימיזציית מסד נתונים לעתים קרובות קובעת את הביצועים הכוללים. איגום חיבורים, יעילות שאילתות, אינדקסים נכונים, מטמון אסטרטגי.
עיבוד ברקע שומר על מהירות התגובות על ידי דחיית פעולות איטיות. משתמשים לא צריכים לחכות לשליחת אימיילים או ליצירת דוחות.
ניטור
מערכות ייצור זקוקות לנראות.
כלי APM עוקבים אחר זמן אחזור, שגיאות, תפוקה ושימוש במשאבים. הם מזהים שאילתות איטיות, קריאות API בעייתיות ונתיבי קוד לא יעילים.
רישום לוגים לוכד אירועים ושגיאות. רישום JSON מובנה מאפשר ניתוח עוצמתי. מערכות מרכזיות אוספות לוגים מכל המופעים.
מדדים מספקים נתונים כמותיים: בקשות לשנייה, זמני תגובה, שיעורי שגיאה, עומקי תור. מסדי נתונים של סדרות זמן מאחסנים אותם לצורך המחשה והתרעה.
מעקב מבוזר עוקב אחר בקשות בין שירותים, חיוני לאיתור תקלות במיקרו-שירותים שבהם פעולה אחת של משתמש נוגעת במערכות רבות.
בדיקות בריאות מאפשרות למאזני עומסים לזהות מופעים לא תקינים ולנתב מסביבם.
שאלות נפוצות על שרתי אפליקציות
האם אני צריך שרת אפליקציות נפרד אם אני משתמש ב-Node.js או Spring Boot?
לא בהכרח. מסגרות אלה מטמיעות פונקציונליות שרת אפליקציות ישירות. האפליקציה שלך מטפלת הן ב-HTTP והן בלוגיקה עסקית. עם זאת, סביר שתרצה עדיין reverse proxy כמו Nginx בחזית לסיום SSL, הגשת קבצים סטטיים ואיזון עומסים.
מה ההבדל בין שרת אפליקציות ל-API?
API הוא ממשק — חוזה המגדיר כיצד לקוחות יכולים לבקש שירותים. שרת האפליקציות הוא התוכנה שמממשת ומריצה את ה-API. ה-API הוא התפריט; שרת האפליקציות הוא המטבח.
כיצד אבחר בין serverless לשרתי אפליקציות מסורתיים?
Serverless מצטיין עבור עומסי עבודה משתנים, עיבוד מונע אירועים, וכאשר רוצים אפס ניהול תשתיות. שרתים מסורתיים עובדים טוב יותר עבור תעבורה יציבה, תהליכים ממושכים, או כאשר נדרשת שליטה מדויקת על סביבת הריצה. ארכיטקטורות רבות משלבות את שניהם.
מדוע לאפליקציות Java יש כל כך הרבה אפשרויות שרת אפליקציות?
המורשת הארגונית של Java ייצרה תקנים מקיפים (Java EE, כיום Jakarta EE) שספקים מרובים יישמו. המערכת האקולוגית נעה משרתים ארגוניים מלאים עם כל תכונה ועד מיכלים מינימליים שרק מריצים יישומי ווב. הפיצול הזה משקף צרכים שונים — חלק מהאפליקציות זקוקות לטרנזקציות מבוזרות והעברת הודעות; אחרות רק צריכות לטפל בבקשות HTTP.
Esta página foi útil?