כיצד לייעל תשתית הפקה של Node.js: שיטות עבודה מומלצות
הקדמה
ב-Forward Email, בילינו שנים בשיפור סביבת הייצור שלנו ב-Node.js. מדריך מקיף זה משתף את שיטות העבודה המומלצות שלנו לפריסת ייצור ב-Node.js שנבדקו בשטח, עם דגש על אופטימיזציית ביצועים, ניטור, והלקחים שלמדנו בהרחבת יישומי Node.js לטיפול במיליוני עסקאות יומיות.
מהפכת אופטימיזציית ביצועי הליבה היחידה שלנו ב-573%
כאשר עברנו ממעבדי Intel למעבדי AMD Ryzen, השגנו שיפור ביצועים של 573% ביישומי Node.js שלנו. זו לא הייתה רק אופטימיזציה קטנה – היא שינתה באופן יסודי את אופן ביצוע יישומי Node.js שלנו בייצור ומדגימה את החשיבות של אופטימיזציית ביצועי ליבה יחידה לכל יישום Node.js.
Tip
לשיטות עבודה מומלצות לפריסת ייצור ב-Node.js, בחירת חומרה היא קריטית. בחרנו במיוחד באירוח DataPacket בזכות זמינות AMD Ryzen שלהם, כי ביצועי ליבה יחידה הם קריטיים ליישומי Node.js מכיוון שהרצת JavaScript היא חד-תהליכית.
למה אופטימיזציית ביצועי ליבה יחידה חשובה ל-Node.js
המעבר שלנו מ-Intel ל-AMD Ryzen הביא ל:
- שיפור ביצועים של 573% בעיבוד בקשות (מתועד ב-דף הסטטוס שלנו ב-GitHub Issue #1519)
- הסרת עיכובים בעיבוד לתגובות כמעט מיידיות (מוזכר ב-GitHub Issue #298)
- יחס מחיר-ביצועים טוב יותר לסביבות ייצור Node.js
- שיפור בזמני תגובה בכל נקודות הקצה של היישום שלנו
הגברת הביצועים הייתה כה משמעותית שכעת אנו רואים במעבדי AMD Ryzen חיוניים לכל פריסת ייצור רצינית של Node.js, בין אם אתם מפעילים יישומי ווב, APIs, מיקרו-שירותים או כל עומס עבודה אחר של Node.js.
תוכן קשור
למידע נוסף על בחירות התשתית שלנו, עיינו ב:
- שירות העברת דואר אלקטרוני הטוב ביותר - השוואות ביצועים
- פתרון עצמי מתארח - המלצות חומרה
הגדרת סביבת ייצור Node.js: ערכת הטכנולוגיה שלנו
שיטות העבודה המומלצות שלנו לפריסת ייצור ב-Node.js כוללות בחירות טכנולוגיות מכוונות המבוססות על שנות ניסיון בייצור. הנה מה שאנחנו משתמשים ולמה הבחירות האלה חלות על כל יישום Node.js:
מנהל חבילות: pnpm ליעילות בייצור
מה שאנחנו משתמשים: pnpm (גרסה מקובעת)
בחרנו ב-pnpm על פני npm ו-yarn להגדרת סביבת הייצור שלנו ב-Node.js בגלל:
- זמני התקנה מהירים יותר בצינורות CI/CD
- יעילות בשימוש בדיסק באמצעות hard linking
- פתרון תלות קפדני שמונע תלותות פנטום
- ביצועים טובים יותר בפריסות ייצור
Note
כחלק משיטות העבודה המומלצות שלנו לפריסת ייצור ב-Node.js, אנו מקבעים גרסאות מדויקות של כלים קריטיים כמו pnpm כדי להבטיח התנהגות עקבית בכל הסביבות ובמחשבי חברי הצוות.
פרטי יישום:
מסגרת ווב: Koa לייצור מודרני ב-Node.js
מה שאנחנו משתמשים:
@koa/router@koa/multer@ladjs/koa-simple-ratelimitבחרנו ב-Koa על פני Express לתשתית הייצור שלנו ב-Node.js בגלל התמיכה המודרנית ב-async/await וההרכבה הנקייה יותר של middleware. המייסד שלנו ניק באו (Nick Baugh) תרם גם ל-Express וגם ל-Koa, מה שמעניק לנו תובנה עמוקה על שני המסגרות לשימוש בייצור.
תבניות אלו חלות בין אם אתם בונים REST APIs, שרתי GraphQL, יישומי ווב או מיקרו-שירותים.
דוגמאות ליישום שלנו:
עיבוד עבודות רקע: Bree לאמינות בייצור
מה שאנחנו משתמשים: bree מתזמן
יצרנו ומתחזקים את Bree כי מתזמי עבודות קיימים לא ענו על הצרכים שלנו לתמיכה ב-worker threads ותכונות JavaScript מודרניות בסביבות Node.js בייצור. זה חל על כל יישום Node.js שצריך עיבוד ברקע, משימות מתוזמנות או worker threads.
דוגמאות ליישום שלנו:
טיפול בשגיאות: @hapi/boom לאמינות בייצור
מה שאנחנו משתמשים: @hapi/boom
אנו משתמשים ב-@hapi/boom לתגובות שגיאה מובנות בכל יישומי ה-Node.js שלנו בייצור. תבנית זו מתאימה לכל יישום Node.js שצריך טיפול שגיאות עקבי.
דוגמאות ליישום שלנו:
כיצד לנטר יישומי Node.js בייצור
הגישה שלנו לניטור יישומי Node.js בייצור התפתחה במשך שנים של הפעלת יישומים בקנה מידה גדול. אנו מיישמים ניטור ברמות מרובות כדי להבטיח אמינות וביצועים לכל סוג של יישום Node.js.
ניטור Node.js ברמת מערכת בייצור
היישום המרכזי שלנו: helpers/monitor-server.js
מה שאנחנו משתמשים: node-os-utils
ספי הניטור שלנו בייצור (מהקוד שלנו בייצור בפועל):
- מגבלת גודל heap של 2GB עם התראות אוטומטיות
- סף אזהרה של שימוש בזיכרון 25%
- סף התראה של שימוש ב-CPU 80%
- סף אזהרה של שימוש בדיסק 75%
Warning
ספים אלו מתאימים לתצורת החומרה הספציפית שלנו. בעת יישום ניטור Node.js בייצור, עיינו ביישום monitor-server.js שלנו כדי להבין את הלוגיקה המדויקת ולהתאים את הערכים לסביבתכם.
ניטור ברמת היישום ל-Node.js בייצור
סיווג השגיאות שלנו: helpers/is-code-bug.js
עוזר זה מבדיל בין:
- באגים בקוד אמיתיים שדורשים טיפול מיידי
- שגיאות משתמש שהן התנהגות צפויה
- כשלי שירות חיצוני שאינם בשליטתנו
תבנית זו חלה על כל יישום Node.js - אפליקציות ווב, APIs, מיקרו-שירותים או שירותי רקע.
מימוש הרישום שלנו: helpers/logger.js
אנו מיישמים טשטוש שדות מקיף כדי להגן על מידע רגיש תוך שמירה על יכולות איתור תקלות שימושיות בסביבת הייצור שלנו ב-Node.js.
ניטור ספציפי ליישום
מימושי השרת שלנו:
ניטור תורים: אנו מיישמים מגבלות תור של 5GB וזמני המתנה של 180 שניות לעיבוד בקשות כדי למנוע התשה של משאבים. דפוסים אלו חלים על כל יישום Node.js עם תורים או עיבוד ברקע.
ניטור ייצור ב-Node.js עם בדיקות בריאות PM2
שיפרנו את הגדרת סביבת הייצור שלנו ב-Node.js עם PM2 לאורך שנות ניסיון בייצור. בדיקות הבריאות של PM2 שלנו חיוניות לשמירה על אמינות בכל יישום Node.js.
מערכת בדיקות הבריאות של PM2 שלנו
מימוש הליבה שלנו: jobs/check-pm2.js
ניטור הייצור שלנו ב-Node.js עם בדיקות בריאות PM2 כולל:
- ריצה כל 20 דקות באמצעות תזמון cron
- דורש מינימום 15 דקות זמן פעילות לפני שמחשיבים תהליך כבריא
- מאמת סטטוס תהליך ושימוש בזיכרון
- מאתחל אוטומטית תהליכים שנכשלו
- מונע לולאות אתחול באמצעות בדיקות בריאות חכמות
Caution
לשיטות הטובות ביותר לפריסת ייצור ב-Node.js, אנו דורשים 15+ דקות זמן פעילות לפני שמחשיבים תהליך כבריא כדי למנוע לולאות אתחול. זה מונע כשלונות מצטברים כאשר תהליכים מתקשים עם זיכרון או בעיות אחרות.
תצורת הייצור שלנו ב-PM2
הגדרת האקוסיסטם שלנו: למדו את קבצי הפעלת השרת שלנו להגדרת סביבת ייצור ב-Node.js:
דפוסים אלו חלים בין אם אתם מפעילים אפליקציות Express, שרתי Koa, APIs של GraphQL, או כל יישום Node.js אחר.
פריסת PM2 אוטומטית
פריסת PM2: ansible/playbooks/node.yml
אנו מאוטומטים את כל הגדרת PM2 שלנו דרך Ansible כדי להבטיח פריסות ייצור Node.js עקביות בכל השרתים שלנו.
מערכת טיפול וסיווג שגיאות בייצור
אחת משיטות העבודה הטובות ביותר שלנו לפריסת ייצור ב-Node.js היא סיווג שגיאות חכם החלה על כל יישום Node.js:
מימוש isCodeBug שלנו לייצור
מקור: helpers/is-code-bug.js
עזר זה מספק סיווג שגיאות חכם ליישומי Node.js בייצור כדי:
- לתעדף באגים אמיתיים על פני שגיאות משתמש
- לשפר את תגובת התקלות שלנו על ידי התמקדות בבעיות אמיתיות
- להפחית עייפות התראות משגיאות משתמש צפויות
- להבין טוב יותר בעיות יישום מול בעיות שנוצרו על ידי המשתמש
דפוס זה עובד לכל יישום Node.js - בין אם אתם בונים אתרי מסחר אלקטרוני, פלטפורמות SaaS, APIs, או מיקרו-שירותים.
אינטגרציה עם הרישום שלנו בייצור
אינטגרציית הרישום שלנו: helpers/logger.js
היומן שלנו משתמש ב-isCodeBug כדי לקבוע רמות התראה וטשטוש שדות, ומוודא שנקבל התראות על בעיות אמיתיות תוך סינון רעש בסביבת הייצור שלנו ב-Node.js.
תוכן קשור
למד עוד על דפוסי טיפול בשגיאות שלנו:
- בניית מערכת תשלומים אמינה - דפוסי טיפול בשגיאות
- הגנת פרטיות במייל - טיפול בשגיאות אבטחה
איתור ביצועים מתקדם עם v8-profiler-next ו-cpupro
אנו משתמשים בכלי פרופיילינג מתקדמים לניתוח צילומי heap ולפתרון בעיות OOM (מחסור בזיכרון), צווארי בקבוק בביצועים ובעיות זיכרון ב-Node.js בסביבת הייצור שלנו. כלים אלו חיוניים לכל אפליקציית Node.js החווה דליפות זיכרון או בעיות ביצועים.
גישת הפרופיילינג שלנו לסביבת ייצור Node.js
כלים שאנו ממליצים עליהם:
v8-profiler-next- ליצירת צילומי heap ופרופילי CPUcpupro- לניתוח פרופילי CPU וצילומי heap
Tip
אנו משתמשים ב-v8-profiler-next וב-cpupro יחד ליצירת תהליך איתור ביצועים מלא לאפליקציות Node.js שלנו. שילוב זה עוזר לנו לזהות דליפות זיכרון, צווארי בקבוק בביצועים ולמטב את קוד הייצור שלנו.
כיצד אנו מיישמים ניתוח צילומי Heap
מימוש הניטור שלנו: helpers/monitor-server.js
ניטור הייצור שלנו כולל יצירת צילומי heap אוטומטית כאשר סף הזיכרון עולה על המותר. זה עוזר לנו לפתור בעיות OOM לפני שהן גורמות לקריסות באפליקציה.
דפוסי מימוש מרכזיים:
- צילומים אוטומטיים כאשר גודל ה-heap עולה על סף של 2GB
- פרופיילינג מבוסס אותות לניתוח לפי דרישה בייצור
- מדיניות שמירה לניהול אחסון הצילומים
- אינטגרציה עם עבודות הניקוי שלנו לתחזוקה אוטומטית
תהליך איתור הביצועים
למד את המימוש בפועל שלנו:
- מימוש ניטור השרת - ניטור heap ויצירת צילומים
- עבודת ניקוי - שמירת צילומים וניקוי
- אינטגרציה עם היומן - רישום ביצועים
מימוש מומלץ לאפליקציית Node.js שלך
לניתוח צילומי heap:
- התקן את v8-profiler-next ליצירת צילומים
- השתמש ב-cpupro לניתוח הצילומים שנוצרו
- ממש ספי ניטור בדומה ל-monitor-server.js שלנו
- הגדר ניקוי אוטומטי לניהול אחסון הצילומים
- צור מטפלי אותות לפרופיילינג לפי דרישה בייצור
לפרופיילינג CPU:
- צור פרופילי CPU בתקופות עומס גבוה
- נתח עם cpupro לזיהוי צווארי בקבוק
- התמקד בנתיבים חמים והזדמנויות אופטימיזציה
- נטר לפני/אחרי שיפורי ביצועים
Warning
יצירת צילומי heap ופרופילי CPU עלולה להשפיע על הביצועים. אנו ממליצים לממש הגבלת תדירות ולהפעיל פרופיילינג רק בעת חקירת בעיות ספציפיות או במהלך חלונות תחזוקה.
אינטגרציה עם ניטור הייצור שלנו
כלי הפרופיילינג שלנו משתלבים באסטרטגיית הניטור הרחבה שלנו:
- הפעלה אוטומטית בהתבסס על ספי זיכרון/CPU
- אינטגרציה עם התראות כאשר מתגלות בעיות ביצועים
- ניתוח היסטורי למעקב אחר מגמות ביצועים לאורך זמן
- קורלציה עם מדדי האפליקציה לאיתור תקלות מקיף גישה זו סייעה לנו לזהות ולפתור דליפות זיכרון, לאופטימיזציה של מסלולי קוד חמים, ולשמור על ביצועים יציבים בסביבת הייצור שלנו ב-Node.js.
אבטחת תשתית ייצור Node.js
אנו מיישמים אבטחה מקיפה לתשתית הייצור של Node.js שלנו באמצעות אוטומציה של Ansible. שיטות אלו חלות על כל יישום Node.js:
אבטחה ברמת המערכת לייצור Node.js
מימוש ה-Ansible שלנו: ansible/playbooks/security.yml
אמצעי האבטחה המרכזיים שלנו לסביבות ייצור Node.js:
- השבתת swap כדי למנוע כתיבה של נתונים רגישים לדיסק
- השבתת core dumps כדי למנוע דליפות זיכרון המכילות מידע רגיש
- חסימת אחסון USB כדי למנוע גישה לא מורשית לנתונים
- כוונון פרמטרי kernel הן לאבטחה והן לביצועים
Warning
בעת יישום שיטות עבודה מומלצות לפריסת ייצור Node.js, השבתת swap עלולה לגרום להריגות מחוסר זיכרון אם היישום שלך חורג מזיכרון RAM זמין. אנו עוקבים בקפידה אחר שימוש הזיכרון ומגדירים את השרתים שלנו בהתאם.
אבטחת יישומים ליישומי Node.js
הסתרת שדות בלוג שלנו: helpers/logger.js
אנו מסתירים שדות רגישים מהלוגים כולל סיסמאות, טוקנים, מפתחות API ומידע אישי. זה מגן על פרטיות המשתמש תוך שמירה על יכולות איתור באגים בכל סביבת ייצור Node.js.
אוטומציה של אבטחת תשתית
הגדרת Ansible המלאה שלנו לייצור Node.js:
תוכן האבטחה שלנו
למידע נוסף על גישת האבטחה שלנו:
ארכיטקטורת מסדי נתונים ליישומי Node.js
אנו משתמשים בגישה היברידית למסדי נתונים המותאמת ליישומי Node.js שלנו. דפוסים אלו ניתנים להתאמה לכל יישום Node.js:
מימוש SQLite לייצור Node.js
מה שאנו משתמשים:
הקונפיגורציה שלנו: ansible/playbooks/sqlite.yml
אנו משתמשים ב-SQLite לנתונים ספציפיים למשתמש ביישומי Node.js שלנו מכיוון שהיא מספקת:
- בידוד נתונים לכל משתמש/שוכר
- ביצועים טובים יותר לשאילתות משתמש יחיד
- גיבוי ומיגרציה פשוטים
- פחות מורכבות בהשוואה למסדי נתונים משותפים
דפוס זה עובד היטב ליישומי SaaS, מערכות רב-שוכרות, או כל יישום Node.js שדורש בידוד נתונים.
מימוש MongoDB לייצור Node.js
מה שאנו משתמשים:
@ladjs/mongoose@ladjs/mongoose-error-messages@zainundin/mongoose-factoryהיישום שלנו:helpers/setup-mongoose.js
הקונפיגורציה שלנו: config/mongoose.js
אנו משתמשים ב-MongoDB עבור נתוני האפליקציה בסביבת הייצור של Node.js שלנו מכיוון שהיא מספקת:
- סכימה גמישה למבני נתונים מתפתחים
- ביצועים טובים יותר עבור שאילתות מורכבות
- יכולת סקיילינג אופקי
- שפת שאילתות עשירה
Note
הגישה ההיברידית שלנו מותאמת למקרה השימוש הספציפי שלנו. למדו את דפוסי השימוש האמיתיים במסד הנתונים בקוד כדי להבין אם גישה זו מתאימה לצרכי אפליקציית ה-Node.js שלכם.
עיבוד עבודות רקע בסביבת ייצור Node.js
בנינו את ארכיטקטורת עבודות הרקע שלנו סביב Bree לפריסה אמינה של Node.js בסביבת ייצור. זה חל על כל אפליקציית Node.js שזקוקה לעיבוד רקע:
הגדרת שרת Bree שלנו לייצור
היישום הראשי שלנו: bree.js
הפריסה שלנו באמצעות Ansible: ansible/playbooks/bree.yml
דוגמאות לעבודות ייצור
ניטור בריאות: jobs/check-pm2.js
אוטומציה לניקוי: jobs/cleanup-tmp.js
כל העבודות שלנו: עיינו בתיקיית העבודות המלאה שלנו
דפוסים אלה חלים על כל אפליקציית Node.js שזקוקה ל:
- משימות מתוזמנות (עיבוד נתונים, דוחות, ניקוי)
- עיבוד רקע (שינוי גודל תמונות, שליחת מיילים, ייבוא נתונים)
- ניטור ותחזוקה של בריאות המערכת
- שימוש ב-worker threads למשימות עתירות מעבד
דפוסי תזמון העבודות שלנו לייצור Node.js
למדו את דפוסי תזמון העבודות האמיתיים בתיקיית העבודות שלנו כדי להבין:
- כיצד אנו מיישמים תזמון בסגנון cron בסביבת ייצור Node.js
- טיפול בשגיאות ולוגיקת ניסיון חוזר
- כיצד אנו משתמשים ב-worker threads למשימות עתירות מעבד
תחזוקה אוטומטית לאפליקציות Node.js בסביבת ייצור
אנו מיישמים תחזוקה פרואקטיבית למניעת בעיות נפוצות בסביבת ייצור Node.js. דפוסים אלה חלים על כל אפליקציית Node.js:
יישום הניקוי שלנו
מקור: jobs/cleanup-tmp.js
התחזוקה האוטומטית שלנו לאפליקציות Node.js בסביבת ייצור מתמקדת ב:
- קבצים זמניים בני יותר מ-24 שעות
- קבצי לוג שמעבר למגבלות השמירה
- קבצי מטמון ונתונים זמניים
- קבצים שהועלו שאינם דרושים עוד
- צילום מצב heap לצורך איתור ביצועים
דפוסים אלה חלים על כל אפליקציית Node.js שיוצרת קבצים זמניים, לוגים או נתוני מטמון.
ניהול שטח דיסק בסביבת ייצור Node.js
ספי הניטור שלנו: helpers/monitor-server.js
- מגבלות תורים לעיבוד רקע
- אזהרת שימוש בדיסק ב-75%
- ניקוי אוטומטי כאשר הספים עוברים
אוטומציה של תחזוקת תשתיות
האוטומציה שלנו באמצעות Ansible לסביבת ייצור Node.js:
מדריך יישום לפריסת Node.js בסביבת ייצור
למדו את הקוד האמיתי שלנו לפרקטיקות הטובות ביותר בפרודקשן
התחילו עם הקבצים המרכזיים האלה להגדרת סביבת פרודקשן ב-Node.js:
- קונפיגורציה:
config/index.js - ניטור:
helpers/monitor-server.js - טיפול בשגיאות:
helpers/is-code-bug.js - רישום לוגים:
helpers/logger.js - בריאות התהליך:
jobs/check-pm2.js
למדו מפוסטים בבלוג שלנו
המדריכים הטכניים שלנו ליישום פרודקשן ב-Node.js:
- אקוסיסטם של חבילות NPM
- בניית מערכות תשלום
- יישום פרטיות אימייל
- טפסי יצירת קשר ב-JavaScript
- אינטגרציית אימייל ב-React
אוטומציה של תשתיות לפרודקשן ב-Node.js
ספריות ה-Ansible שלנו ללימוד לפריסת פרודקשן ב-Node.js:
מקרי מבחן שלנו
היישומים הארגוניים שלנו:
סיכום: פרקטיקות הטובות ביותר לפריסת פרודקשן ב-Node.js
תשתית הפרודקשן שלנו ב-Node.js מראה כי אפליקציות Node.js יכולות להשיג אמינות ברמת ארגון דרך:
- בחירות חומרה מוכחות (AMD Ryzen לאופטימיזציית ביצועים של 573% בליבה יחידה)
- ניטור פרודקשן ב-Node.js שנבדק בשטח עם ספים ספציפיים ותגובות אוטומטיות
- סיווג שגיאות חכם לשיפור תגובת התקלות בסביבות פרודקשן
- ניפוי ביצועים מתקדם עם v8-profiler-next ו-cpupro למניעת OOM
- הקשחת אבטחה מקיפה באמצעות אוטומציה ב-Ansible
- ארכיטקטורת מסד נתונים היברידית מותאמת לצרכי האפליקציה
- תחזוקה אוטומטית למניעת בעיות נפוצות בפרודקשן Node.js
מסקנה מרכזית: למדו את קבצי היישום האמיתיים שלנו ואת פוסטים בבלוג במקום לעקוב אחרי פרקטיקות כלליות. בסיס הקוד שלנו מספק דפוסים מהעולם האמיתי לפריסת פרודקשן ב-Node.js שניתן להתאים לכל אפליקציית Node.js - אפליקציות ווב, APIs, מיקרו-שירותים או שירותי רקע.
רשימת משאבים מלאה לפרודקשן ב-Node.js
קבצי היישום המרכזיים שלנו
- קונפיגורציה ראשית
- תלויות חבילות
- ניטור שרת
- סיווג שגיאות
- מערכת רישום לוגים
- בדיקות בריאות PM2
- ניקוי אוטומטי
מימושי השרת שלנו
אוטומציה של התשתית שלנו
פוסטים טכניים בבלוג שלנו
- ניתוח אקוסיסטם NPM
- מימוש מערכת תשלומים
- מדריך טכני לפרטיות אימייל
- טפסי יצירת קשר ב-JavaScript
- אינטגרציית אימייל ב-React
- מדריך לפתרון עצמי מתארח