שאלות מתקדמות ב nodejs
-
מספר שאלות מתקדמות בnodjs
א. היות וצורת העבודה שלי היא לא משהו קבוע, אלא כל הזמן עלי להוסיף פעולות וכתובות חדשות, שנקרא להם מערכות, וכן לתקן ולשנות מערכות קודמות.
מהי צורת העבודה הנכונה והנוחה?
לעשות לכל מערכת קוד נפרד, שיאזין לפורט נפרד, ואז יש לי את הגמישות שאני יכול לשנות מערכת מבלי לגעת במערכות פעילות אחרות, והקודים הרבה יותר מסודרים, אך אני מריץ לכל דבר תהליך נוד נפרד, דבר שלכאורה יקח יותר משאבים, ומצד שני אם זה היה הכל תחת תהליך אחד, אם תיהיה שגיאה בעדכון החדש זה יכול להפריע למערכות הפעילות, וכן הקוד ארוך ומפותל, אך אולי תהליך אחד גדול מבזבז פחות משאבים מכמה תהליכים קטנים.
ב. לגבי עצם העדכון, אני משתמש בPM2, לעשות restart לתהליך היא הדרך הכי נכונה לאחר ביצוע שינוי בקובץ?
ג. עד כמה כדאי להעמיס במשתנים בדף אחד?
הנקודה היא כך, לפי איך שהתחלתי להבין יותר לעומק איך שנוד בנוי בתהליך שרץ כל הזמן, זה יכול לתת לי מענה למה שהייתי תקוע עד עכשיו בPHP שלא הייתי יכול להשתמש במשתנה אחד משלב לשלב, אלא כל פעם הכל נטען ומסתיים מחדש, כעת אני יכול בעצם ליצור מערך של שיחות (אני מקבל בGET מזהה שיחה יחודי), ואז לאכסן בצד השרת בתהליך של הנוד כל מיני משתנים שרלוונטים לשיחה הנוכחית, ומקסימום אני יכול לעשות שכאשר שיחה מסתיימת אני אמור לקבל בGET פרמטר hangup=yes, ואז אני מוחק את זה מהמערך של השיחות הפעילות, ובעצם המערך הזה אמור להתנפח ולהתקטן לפי כמות השיחות הקיימות כעת במערכת.
האם זה מומלץ, או יכול ליצור בעיות?
ד. בהמשך לשרשור הקודם שלי, בניתי בצורה שהנתונים מתעדכנים כל 2 שניות, לא תמיד יש צורך בזה, יש שעות שאף אחד לא מחובר וכו' וחבל על המשאבים.
האם כדאי לבנות בצורה של מערך שמכיל ג"כ נתון של זמן עדכון אחרון, ואז אני מבצע בדיקה באם העדכון היה לפני למעלה מ2 שניות זה יעדכן תוך כדי הבקשה של הלקוח, והמאזינים הבאים במשך 2 השניות הקרובות יקבלו את המידע השמור, ואח"כ זה שוב יעדכן תוך כדי בקשה וחוזר חלילה.
אני מרוויח שאין בדיקה סתם כשלא צריך, ומצד שני א. המאזין הנוכחי שאצלו זה מתעדכן ימתין חצי שניה יותר.. ב. מה יקרה בבקשות ביניים, זאת אומרת מאזין א מתקשר, השרת רואה שזה לא מעודכן, ומפעיל את פונקציית העדכון, אך בינתיים ב 165 מ"ש שלוקח לעדכן, מתקשר מאזין ב ואז השרת רואה שעדיין לא עודכן המערך. זה יפעיל שוב את פונקציית העדכון? ונמצא שעודכן פעמיים בזה אח"ז? א"כ אני מפסיד הרבה מאוד ממה שאני רוצה להרוויח כמה שפחות פעולות עדכון.
@david @magicode @אהרן @יוסף-בן-שמעון @clickone -
@חוקר אמר בשאלות מתקדמות ב nodejs:
ד. בהמשך לשרשור הקודם שלי, בניתי בצורה שהנתונים מתעדכנים כל 2 שניות, לא תמיד יש צורך בזה, יש שעות שאף אחד לא מחובר וכו' וחבל על המשאבים.
שטויות
כמה גיוסים כבר יש? ובכ"א אתה מקבל את כל ההתקדמויות האישיות בכפולות של 100. כמה בקשות זה כבר?לדעתי תעשה גנרית 2 מצבים, מצב גיוס, מצב אחרי גיוס
תגדיר את שעות הגיוס מראש ובשעות אלו זה מתעדכן כל 2 שניות, ואחרי זה רק לפי בקשה. -
שאלה ב: כן, הדרך הנכונה היא לעשות ריסטרט.
שאלה ג: זה בהחלט דרך נכונה, אם כי זה יכול לגרום לדליפת זיכרון אם אתה מכביד מידי על הזיכרון, אבל זה רחוק שזה יגיע למצב כזה, תקפיד לנקות את הזיכרון אחרי שהשיחה מסתיימת ולא אמורה להיות בעיה
שאלה א: זה לא שאלה של node אלא שאלה כללית בארכיטרקטורה, קשה לענות עליה בצורה מדוייקת בלי להכיר את האיפיון של המערכת שלך, בגדול אם זה נתונים דינמיים שמשתנים בתדירות כדאי לך לשקול עבודה עם מסד נתונים, ולכתוב את הקוד בצורה כזו שהפונקציות יהיו גנריות וישלפו את הנתונים הרלוונטיים כל פעם, כך לא תצטרך עדכון תדירי בקוד.
לא בטוח שזה מתאים לך, עכ"פ לא בשלב הזה, ואתה כן תצטרך לעשות את זה בתוך הקוד, ככל שאתה ממעט באפליקציות אתה מרוויח חסכון במשאבים וניהול נכון יותר של השרת, בקשר לאורך של הקוד צריך ללמוד איך עושים את זה נכון, לכתוב קוד מסודר ונקי זה דבר נרכש.
בכל אופו לפני כל עדכון תבדוק אותו בארגז חול במחשב שלך או על השרת בתהליך נפרד, ואחרי שאתה מדבג ורואה שכל הפונקציות עובדות ואין שגיאות תוכל להעלות אותו לאויר. -
לשאלה ב' יש אופציה בPM של watch שאמורה להפעיל אוטומטית, אבל אני ממליץ לעשות ידנית ולשלוט בעניין.
לשאלה ג' כדאי שהנתונים יכתבו גם במסד נתונים כל שהוא במקביל להיותם במשתנה, ככה במקרה של הפעלה מחדש לא נאבד שום חומר (כמעט).
לשאלה ד'
זו שאלה יפה, שכמו רוב שאלותיך עוקפים בהרבה את המקום הטבעי שם אתה אמור להיות בשלב זה, לא רק מבחינת לימודים, אלא שזה באמת לא קריטי כל העדינויות האלה, תתרגל להתאכזר על השרת ואל תיתן לשאיפות מיטוב קטנות לעצור אותך עד שיש לך רעיון או דרך שכולה באה להקל על המחשב וממש לא להקל עליך.
אז התשובה עבורך מבחינתי, זה פשוט לעדכן כל שתי שניות בלי קשר לביקורים ולהפסיד את האופטימיזציה שאתה רוצה בה (וזה מאוד הגיוני, כי (בדרך כלל) אתה לא מרויח משהו מהזמן בו השרת "נח").
ובכל זאת אני אתייחס גם לגופה של שאלה. ההוא שמגיע אחרי שתי שניות יחכה טיפה יותר, זה שטויות לחלוטין - שיחשוב שעברנו לPHP :). בעיה של התנגשות של שתי בקשות אין פה אם מבצעים זאת בצורה טובה. אני הייתי פותר את זה עם Promise (מושג נחמד, אל תילחץ להבין אותו, אתה עוד תגיע אליו):let lastTime = 0; let freq = 1000 * 60 * 2 let lastData = null; app.get('/last-state', function(req, res){ if(new Date() - lastTime > freq){ lastTime = new Date(); lastData = new Promise(getDataFromDb); } lastData.then(function(data) { res.json(data); }); });
הייתי מעדיף שתיצא מה"מתחילות" שלך ותתחיל ליחד אשכול לכל שאלה בלי נקיפות מצפון.