Table of Contents
הבנה של אדריכלות ללא שרת ותפקידה של Python
מחשוב Serverless הגדיר מחדש את האופן שבו מפתחים בונים ופרוס יישומים במקום לספק ולמנהל שרתים, אתה כותב פונקציות ללא מדינה שמגיבות לאירועים כגון בקשות HTTP, העלאת קבצים, שינויים במסד הנתונים, או משימות מתוכננות. Python, עם הסינכרון הנקי שלה, הספרייה העצומה, תמיכה קהילתית חזקה, הפך לשפה הולכת-to-to-to-to-to-to-to-in-in-ilente לפיתוח ללא שרת.
מה הופך את Serverless different?
במודל מבוסס שרת מסורתי, עליך לספק כמות קבועה של יכולת compute וגודל באופן ידני או באמצעות קבוצות בעלות רכב. Serverless אבסטרקטיות כי לחלוטין: ספק הענן מנהל את התשתית, מתאמת באופן אוטומטי, והאשמות רק עבור הזמן התואם שהקוד שלך צורך (בנוסף לכל אחסון או שימוש ברשת).
פייתון מאיר בסביבה זו בשל יכולת הקריאה שלה וזמינות של מסגרות כמו:0AWS Lambda של Python לרוץ זמן רב יותר:2 Google Cloud Functions for PythonFLT 3:0AWS Lambda's Python RuntimeFLT:5 ו-FLT 7 ואילך, אשר מתחיל לפעול ללא שינוי, ולכן יש צורך להפעיל את הפונקציות של בני האדם, ללא שינוי.
עקרונות הליבה לפיתוח ללא שרתי
לפני צלילה לטיפים ספציפיים, חשוב לבסס את העקרונות הבסיסיים המנחים אדריכלות ללא שרת.עקרונות אלה להבטיח שהפונקציות שלך יישארו ברות-היקף, יעילות בעלויות, ושמירה על יכולת.
חשיבה
כל פונקציה ללא שרת צריכה להיות בנויה סביב אירוע יחיד, מוגדר היטב.אירוע זה יכול להיות בקשה HTTP (באמצעות API Gateway), אובייקט חדש בדלי אחסון (S3, Cloud Storage, Blob Storage), הודעה בתור (SQS, Pub/Sub, Service Bus), או שינוי מסד נתונים (DynamoDB Streams, Cloudhouse) עיצוב הפונקציה שלך לתהליך אחד בזמן, ולהימנע מתפקידה של bugretexing, והימנעות מתפקוד לא קשור ל-retexretexing.
תפקודים חסרי מדינה
פונקציות ללא שרת הן אפסיות.לאחר ביצוע, סביבת ההוצאה עשויה להיות קפואה או מושמדת.כל המדינה המתמדת חייבת לחיות מחוץ לזיכרון התפקוד - במאגרי נתונים, כנים, אחסון אובייקטים, או שירותי תיאום מבוזרים. החלת על משתנים גלובליים או כתיבה למערכת הקבצים המקומית (מעבר ל-FLT המוגבלת:0 במאי) עלולה לגרום להתנהגות בלתי צפויה.
חוסר יכולת וטעויות
כאשר פונקציה נכשלת, ספק הענן מהדהד באופן אוטומטי את האירוע (בהתאם לטריגר) זה הופך את idempotency קריטי: הפונקציה שלך חייבת לייצר את אותה תוצאה גם אם זה מעבד את אותו אירוע יותר מפעם אחת.לדוגמה, אם אתה מטפל במקרה תשלום, לכלול מזהה עסקה ולבדוק עבור לשכפלות לפני עיבוד.
בחירת המסגרת הנכונה והכלים
בעוד אתה יכול לכתוב פונקציות גלם באמצעות ה- API של ספק הענן, באמצעות מסגרת באופן דרמטי פריסה, תצורה ובדיקות מקומיות.
מסגרת Serverless Framework
(FLT:0) Serverless FrameworkearFLT:1) הוא אחד הכלים הקוד הפתוחים הפופולריים ביותר.זה משתמש בקבצי תצורה של YML כדי להגדיר פונקציות, אירועים ומשאבים תשתיות.עבור מפתחי Python, הוא תומך באריזה תלויות מבוססת pip ויכול לפרוס ל-AWS, Google Cloud, Azure, ואחרים היתרונות המרכזיים כוללים:
- תמיכה מרובה-ספקיבית קלה עם אותו מס.
- בנוי-in plugins for Monitor, logging, ומשתנים מותאמים אישית.
- אריזה אוטומטית של פייתון תלויה ב-FLT:2.
- סימולציה מקומית של גורמים לפיתוח.
Zappa for Django/Flaskאינטגרציה
(FLT:0)ZappaveFLT:1 , מיועד במיוחד עבור מסגרות אינטרנט Python.It חבילות Django או Flask יישום כפונקציה יחיד Lambda והוראות נקודת קצה של API. Zappa מטפל WSGI מתפתל, הגדרת משתנים סביבה, ואפילו בואו של תעודות SSL הצפנה.
AWS SAM ו-Google Cloud CLI
מודל יישומים ללא שרת של AWS (SAM) הוא הרחבה של AWS CloudFormation המספקת סינטקס יד קצר עבור משאבי Lambda. Google Cloud Functions יש פשוטFLT 3 (CLI) הן אפשרויות טובות כאשר אתה מתאחד בחוזקה לענן אחד ורוצה שילוב עמוק עם המערכות האקולוגיות שלהם.
אופטימיזציה של Python Serverless Performance
פונקציות ללא שרת יש משאבים מוגבלים (CPU וזיכרון) אופטימיזציה ביצועים משפיע ישירות על חווית המשתמש ואת הצעת החוק שלך.שני האתגרים הגדולים ביותר ביצועים הם זמן קר מתחיל וביצוע.
הבנה והפחתה של התחלות קרות
התחלה קרה מתרחשת כאשר ספק הענן מסובב סביבה חדשה לביצוע כדי להתמודד עם בקשה בלתי צפויה.במהלך התחלה קרה, את זמן הריצה (פייתון) חייב להיות טעון, וכל יבוא גלובלי מבוצע.הההה קלה יכולה לנוע בין 200 ל -200ms לכמה שניות בהתאם לגודל הפריסה.
- (ב) ,0) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (FLT:0)Use Proconport.FLT:1 AWS Lambda מאפשר לך לשמור מספר מוגדר של סביבות ביצוע חם.זה מבטל את תחילת הקר עבור נקודות הקצה הרגישות ביותר, אם כי זה מוסיף עלות קטנה.
- (FLT:0) אופטימיזציה קוד ההקצאה.FIRLT:1 , הזיז יבוא יקר ותצורה טעינה מחוץ לתפקוד המטפל כך שהם לרוץ רק פעם אחת לכל החיים בסביבה.לדוגמה, לקבוע חיבור מסד נתונים או לטעון מודל למידת מכונה בקנה מידה הגלובלי, לא בתוך המטפל.
- (FLT:0) בחר שפה עם סטארט-אפ מהיר יותר.FreaLT:1 בעוד Python הוא בדרך כלל איטי יותר להתחיל מאשר Node.js או Go, פרופיל זהיר יכול לצמצם את הפער.
זיכרון ו CPU Tuning
AWS Lambda מקצה CPU באופן יחסי לזיכרון המוגדר (מ- 128 MB ל-10,240 MB) הגדלת הזיכרון לא רק נותן לך יותר יכולת, אלא גם מגביר באופן ליניארי את כוח CPU.עבור משימות שקיפות (למשל, עיבוד תמונה, טרנספורמציה נתונים), הגדרה זיכרון גבוהה יותר יכולה להפחית את זמן החיוב בפועל ועלויות נמוכות יותר באופן פוטנציאלי, כי אתה משלם עבור פחות שניות.
שימוש ב-Asynchronous I/O
Python's (FLT:8) ניתן למנף בתוך פונקציות ללא שרת כאשר יש לך מספר פעולות I / O-bound (למשל, קורא מספר APIs, קריאה ממאגרי נתונים מרובים) עם זאת, רוב הפלטפורמות ללא השרתים לא תומכים במטבע אמיתי בתוך ייעוד יחיד; הם עדיין להפעיל את הפונקציה באופן שווה.
ניהול קובצי ה-Creloyment
אחת המלכודות הנפוצות ביותר בפיתוח ללא שרתי Python היא פריסת פונקציה שאינה מתרחשת בזמן ריצה בגלל ספריות מולדות חסרות או תלות סותרת.בניגוד לכלי, סביבת ההוצאה להורג של Lambda היא סביבה קבועה אמזון לינוקס (או דומה) ניהול תלות תקין הוא חיוני.
שימוש בסביבה וירטואלית ובדרישות.txt
תמיד להתפתח בתוך סביבה וירטואלית (למשל, FLT:10 או ⁇ :11) פין כל התלויים בגרסאות מדויקות ב-FLT:12 עבור חבילת הפריסה, להתקין את התלויות לתוך במאי מקומי וzip את כל הדירקטוריון יחד עם הקוד שלך.
Lambda Layers for Joint Code
אם יש לך פונקציות מרובות לחלוק את אותן ספריות (למשל, ; 13:13, ; ;FLT:14, FLT:15), ליצור שכבת Lambda. A שכבה היא ארכיון ZIP נפרד המכיל ספריות מודפסות ותלויים שלהם.שכבות הם חקוקים ושימוש חוזר על פני פונקציות, צמצום גודל הפריסה וזמן ההתחלה הקר של אמזון מפרסם כמה שכבות רשמיות עבור Python, כולל כוח ה- SDK.
ההרחבה Native Libraries and C Extensions
כמה חבילות פייתון - כמו FLT:16,FLT:17 או, או (FLT 18 - איסוף מהיר נגד הארכיטקטורה של סביבת ההוצאה להורג (לינוקס x86 64 או ARM) להתקין אותם באמצעות מיכל דוקר שמתאים לסביבת היעד (למשל, Docker ImageFLT:19). לחלופין, להשתמש בסביבת הענן של AWS9 או CICD עם בסיס נכון.
אבטחה הטובה ביותר עבור Python Serverless
פונקציות ללא שרת הן פגיעות לרבים מההתקפות הללו כיישומים מסורתיים - בנוסף לכמה חדשים כמו זריקת אירוע ותפקידי IAM סחירים מדי.
איכות הסביבה וסודות
לעולם אל תקשה על מקשי API, אישורי מסד נתונים, או כל מידע רגיש. השתמש במשתנה סביבה לאחסון תצורה.עבור סודות שיש לסובב או לגשת בזמן ריצה, לשלב עם מנהל סודות (מנהל סודות של AWS, מנהל גוגל סודי, Azure Key Vault). להחזיר את הסוד פעם במהלך ההתחלתיזציה ו- cache אותו בזיכרון.רוב השירותים מציעים SDK עם מקיפים וסיבוב אוטומטי.
IAM Roles and Least Privilege
פונקציות ללא שרת בדרך כלל מניחים את תפקיד IAM (על AWS) או חשבון שירות (על GCP) להתחיל עם העיקרון של זכות מינימלית: להעניק רק את המשאבים הספציפיים ואת הפעולות הדרושים לתפקיד.לדוגמה, אם פונקציה רק קורא דלי יחיד S3, לתת לו FLT:20 על הדלי הזה, לא מלא S3 גישה באופן קבוע וחדד תפקידים כמו יישומים מתפתחים.
Inputation and Eventזרקה
מאחר שתפקודים ללא שרת יכולים להילקח מנקודות קצה ציבוריות (כמו 'שער API'), תמיד לאמת ולהעריך את הקלטות.ספריית פייתון כמו FLT:21 או FLT:22 יכולים לפסול ולאמת את שכרי האירוע לפני עיבוד. להיות זהירים במיוחד עם שאילתות SQL - שימוש ב- ORMs עם שאילתות פרמטר פרמטר (Alchemy,Pwee) כדי למנוע זריקה, אף פעם לא להעביר משתמשים גולמיים ל-FLT:23 או ל-FLT:23 או LT:23 או LT:23 או .
מעקב, אינטגרציה, וכדאיות
הטבע האנפימרי של חסרי השרת הופך את המעקב המסורתי (התמסר לשרתים) לבלתי אפשרי.במקום זאת, עליך להסתמך על יומני, מדדים, והמסלול המופץ.
עקבו אחרי Structured Logging
להימנע ממשלוחים פשוטים. השתמש בתבנית JSON כדי לכלול מידע קונטקסטואלי כגון תעודות זהות, שם הפונקציה, וזמן ביצוע.הספריה של TheFLT:25 מספקת עיצוב הצצה FLT:26 אשר באופן אוטומטי מוסיף metadata סביבה. על Google Cloud, האינטגרציה של ה-FLT:27 שולחת באופן אוטומטי יומני JSON ל-Cloudging.
« « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « «
כאשר היישום שלך משתרע על פונקציות מרובות, מסדי נתונים ושירותים חיצוניים, מסלול מבוזר עוזר לאתר צווארי בקבוק.AWS X-Ray, Google Cloud Trace, ו- Azure Application Insights ניתן לשלב עם קוד מינימלי.עבור Python, ה-FLT:28 מספק עיצובים ו-Microware. Tracing Overhead הוא מינימלי ובדרך כלל שווה את האפשרות בייצור.
« « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « «
בעוד ספקי ענן מציעים מדדים מובנה (המכונים, משך, שגיאות), אתה יכול פולט מדדים מותאמים אישית לפקח על ההיגיון העסקי.לדוגמה, לעקוב אחר מספר ההזמנות מעובד, cache פגע יחס, או התראה על שיעור גבוה של כשלים אימות. השתמש בתבנית CloudWatch Embedd Metric (EMF) עבור metrics בעלי משקל גבוה, אשר הוא עלות יעילה יותר מאשר ממדים מותאמים אישית.
המונחים: Serverless Python function
קוד ללא שרת מציג אתגרים ייחודיים: עליך לדמות את הסביבה בענן, להתמודד עם גורמים סינכרוניים, ולעתים קרובות ללעג שירותים חיצוניים. אסטרטגיית בדיקה חזקה כוללת בדיקות יחידות, בדיקות אינטגרציה, בדיקות קצה עד הסוף.
יחידת מבחן ה Handler
כתוב מבחנים סטנדרטיים של יחידת Python עבור הלוגיקה העסקית שלך באמצעות FLT:29 (תפקוד המטפל שלך הוא רק פונקציה רגילה שמקבלת מילון אירוע.אתה יכול ליצור אובייקטים אירוע מבחן באופן ידני (הרבה אירועים S3, אירועי API Gateway) או להשתמש בספריות כמו FLT:30 עבור ביצוע מקומי. שמור את המטפל דק לדחוף לוגיקה לתוך פונקציות עוזרות נבדק.
בדיקות אינטגרציה עם ulators מקומי
שירותים כמו LocalStack (עבור AWS) או חיקוי של Cloud Functions מאפשרות לך להפעיל ערימה מלאה של ענן באופן מקומי.זה יקר לבדיקת אינטראקציות בין פונקציות מרובות, מסדי נתונים, תורים. Docker Compose יכול לזמר את LocalStack עם קוד היישום שלך. מבחנים אינטגרציה צריך לוודא כי הפונקציה קורא מדלי, כותב למסד נתונים, ושולח הודעות נכונות.
בדיקה אחרונה ב- End-to-End Testing in a Staging Environment
לפני פריסה לייצור, הפעל בדיקות מקצה לקצה נגד סביבה אמיתית ללא שרת המראה ייצור. השתמש בחשבונות מבודדים או פרויקטים.אוטומטי את הפריסה עם CI /CD (GitHub Actions, GitLab CI, AWS CodePipeline) והפעלה של בדיקות עשן כי לממש את הזרמת המשתמש העיקרית.
ניהול עלויות ואופטימיזציה
Serverless הוא עלות יעילה עבור עומסי עבודה משתנים, אבל עלויות יכולות לטבול אם אתה מתעלם מביטול ייעוד, עומסי תשלום גדולים או זמן ביצוע מופרז.
- (ב) §0) ,0 פקד זמן מתאים (FIRLT:1) להימנע מערכים של זמן שהם הרבה יותר גדולים מצרכי ביצוע בפועל. ארוכות זמן מגבירות את הסיכון לעיסוקים נמלטים.
- (FLT:0)Reduce payload size.FLT:1 , Gateway יש גבול 10 MB, ועומסי תשלום גדולים יותר להגדיל את עלויות ההעברה.compress Data או להשתמש הזרמת קבצים גדולים.
- (FLT:0) Use שמורה מטבע עבור פונקציות קריטיות.IRLT:1) זה מונע פרץ של תנועה מצריכת כל המטבע זמין בחשבון (אשר יהיה לנפץ פונקציות אחרות).
- (FLT:0) ,Analyze לוגים עבור פונקציות לא בשימוש.archFLT (הסקירה תקופתית של יומני ייעוד יכול לחשוף פונקציות שלא שימשו במשך שבועות.
- (FLT:0) מינוף גבולות מדרגה חופשית.FIRLT:1 , ספקי ענן גדולים מציעים טיים חופשיים נדיבים עבור Lambda (1 מיליון בקשות בחודש על AWS).
דוגמאות מתקדמות ו- Real-world
מעבר ליסוד, מפתחים מנוסים ללא השרת מאמצים דפוסים הממקסמים את האמינות ואת מהירות המפתח.
Fan-Out עם Queues ו-Frefs
בקשה אחת נכנסת לעתים קרובות צריכה לעורר משימות מרובות מטה (למשל, לשלוח דואר אלקטרוני, לעדכן שפם, ליצור דוח) במקום לבצע אותן באופן משמעותי בתפקיד אחד, לפרסם הודעה תור הודעה להודעה (SQS, Pub/Sub) או לכתוב לזרם (Kinesis, Event Hub).
פונקציות לתזמורת של זרימת עבודה
כאשר תהליך כרוך בצעדים מרובים עם פעילות מותנית, התאמות שגיאות, והתערבות אנושית, פונקציות שלב AWS או Google Cloud Workflows הם טובים יותר מאשר פונקציה מונוליטית. הם מתזמרים רצף של שיחות Lambda, טיפול במצב וזמניות.עבור Python, אתה יכול להגדיר זרמי עבודה באמצעות תקליטור AWS K או Terraform, וכל צעד נשאר פונקציה פשוטה, בדיקה.
שימוש ב- Custom Runtimes for Python
אם אתה צריך גרסה מסוימת של Python לא נתמך באופן רשמי על ידי ספק הענן, או אם אתה דורש ספריות מערכתיות מותאמות אישית, אתה יכול ליצור זמן ריצה מותאם אישית. AWS Lambda מאפשר לך לארוז כל exetable as a Runtime (למשל, מתורגמנים Python מופרש).זה מתקדם ומוסיף תחזוקה מעל ראש, אבל זה יכול לפתור בעיות תאימות.
מסקנה
פיתוח יישומים ללא שרת עם Python היא דרך עוצמתית לבנות מערכות חסכוניות, ללא תשתית ניהולית.על ידי בחירת המסגרת הנכונה, אופטימיזציה של התחלה קרה וזיכרון, ניהול תלות בזהירות, וליישם שיטות אבטחה ו ניטור קוליות, אתה יכול לספק פתרונות חזקים העומדים בדרישות ייצור מודרניות.התבניות המתוארות במאמר זה - ללא ספק עיצוב, סודיות, LT, ועלויות שליטה LT - כמו גם כדי לשמור על סוללות עכשוויות (כמו כן, כמו גם על פיתוח כלים מאובטחים)
מקור:0 (ב) מקורות:
- (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (ב) ,0) Google Cloud Functions Documentation
- (ב) ,0ürivs Python Developer Guide)
- (ב) ,0) מסגרת ללא שירות - מדריך פייתון 1
- (ב) ויקרא י"א: ויקרא י"ד יט" (בראשית כ"ד)