nodestreamsbackendperformanceproduction

קריסה בפרודקשן: ניהול קבצים בנוד שלא ילמדו אתכם בקורס

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

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

הסיבה? שימוש ב-fs.readFile — שיטה נאיבית שקוראת את כל הקובץ לזיכרון בבת אחת. כשהקבצים קטנים זה עובד. כשהם גדולים — זו הזמנה פתוחה לשיחת טלפון מהבוס ב-3 בבוקר.

מה נלמד

הטעות הנאיבית

לקרוא את כל הקובץ לזיכרון בבת אחת זו הזמנה לאסון. fs.readFile טוען את כל המידע ל-RAM לפני שאפשר לעשות איתו משהו. זה עובד מצוין בטסטים עם קבצים קטנים — ומתפוצץ בפרודקשן כשהמשתמשים מעלים קבצים אמיתיים.

Streams 101

Streams מאפשרים לעבד מידע בצ’אנקים — בלי לטעון הכל לזיכרון בו-זמנית. במקום לחכות שכל הקובץ ייקרא, אפשר להתחיל לעבד כל חלק ברגע שהוא מגיע. זה ההבדל בין מערכת שנושמת לאחת שנחנקת.

Backpressure

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

Pipe vs Pipeline

pipe הוא הכלי המוכר — אבל ניהול שגיאות בו הוא כאב ראש. pipeline הוא הפתרון המודרני שמטפל בשגיאות ב-Streams אוטומטית ומונע מהמערכת לקרוס כשמשהו משתבש באמצע.

Live Demo

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


מתאים לכל מפתח Backend שעובד עם קבצים בנוד — ובמיוחד לאלה שעדיין מאמינים ש-fs.readFile תמיד מספיק.