העברתי פרויקט שלם מפוסטגראס-קיו-אל לפיירסטור (גוגל)

חזרה הביתה אילן ישוק | 3 ביולי 2024
העברתי פרויקט שלם מפוסטגראס-קיו-אל לפיירסטור (גוגל)

העברתי את הפרויקט שלי מפוסטגראס-קיו-אל לפיירסטור של גוגל.

בקצרה למי שלא מכיר - אתר סטטיסטיקות שמרכז את כל תוצאות האתלטים הישראלים ועושה אוטומציות כגון טבלאות דירוג, חישובים שונים וכד'.

החלטתי להחליף את הדאטאבייס שלי מPostgreSQL ל Google Firestore שרץ בקלאוד מאחר ואני צריך דרך מהירה וקלה לשנות מידע מהדאטאבייס. אחד הדברים שחוזרים על עצמם זה שאני חייב אופציה להוספה קלה ומהירה של תחרויות / אתלטים לויז'ותאלט. לדוגמה, אם מקור המידע שלי לא הכניס תחרות מסויימת של אתלט שבחר על דעת עצמו להתחרות בוינה (מה שקורה הרבה מאוד, שכן זכותם של אתלטים להתחרות איפה שבא להם אבל לא תמיד יש מי שיתעד) - אני רוצה להוסיף את זה בקלילות ולא דרך מחיקה והוספה ופונקציות parsing וquery בפייתון.

חשבתי (ואולי קצת קיוויתי) שכל מה שאצטרך לעשות זה פשוט להחליף את הקוד שמשנה את הדאטאבייס אבל לא יותר מזה. מסתבר, שכשכתבתי את האינטגרציה עם PostgreSQL לא הייתי יעיל במיוחד.

מה שמאוד הניע אותי לגלות זאת - הוא המחסום של 50,000 קריאות חינמיות שGoogle Firestore מביא לך ביום.

האמת היא שכרגע אני משלם על סרבר שמריץ את הדאטאבייס של PostgreSQL ולהצליח להוריד את התשלום הזה הוא אחד מהמטרות באפדייט הזה. (אוקיי עכשיו בדקתי כמה אני משלם, 15 דולר בחודש! אמאלה!)

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

יום 1: יצירת פונקציות הוספה ושינוי לפיירסטור (פייתון)

אין מה לעשות, במוקדם או מאוחר צריך לקפוץ למים. ואין הגדרה טובה מזאת. התחלתי מלהוציא את כל הדאטא שיש לי במאגר הנתונים הנוכחי ודרך קוד, להכין אותו לקבלה לפיירסטור ולהעלות אותו לפיירסטור. עשיתי טיפה טעויות בדרך ומאחר ויש כבר הרבה אתלטים שמורים, 636 אם להיות מדויק וכ 1000 פוסטים שגם אותם אני שומר בדאטאבייס, עשיתי המון requests ופחדתי פחד מוות שאני הולך לשלם על התענוג הזה כבר מההתחלה. למזלי הגעתי רק ל20 אלף קריאות אז בינתיים אנחנו בסדר. אחר כך התחלתי להפוך את הקוד מכזה שמתקשר עם סרבר פוסטגראס לכזה שמתקשר עם פיירסטור (כמובן שהקוד הישן שמור). על הדרך, יש שינוי שצריך לקרות (בינתיים). אני צריך להוסיף תאריך לידה לכל אתלט (באתלטיקה יש מקצועות שמשתנים בהתאם לגיל שלך, לדוגמה כדור הברזל שאתלט עודף נהיה כבד יותר עם השנים. אחרי גיל 19 הכדור מגיע למשקלו המקסימלי - כ 7 קילוגרמים).

התחלתי לעבור על הפונקציות וגיליתי שיחסית הרבה פעמים אני מושך את כל התוצאות של כל האתלטים. לדוגמה על מנת לבנות טבלאות דירוג או שיהיה חיפוש כללי בסרגל החיפוש של כל שמות האתלטים.

זאת הייתה בעיה כי כמו שאמרתי, אם יש לך 600 אתלטים ומגבלה של 50,000 קריאות יומיות - זה משאיר אותך עם 83 רענונים כאלו שאתה יכול לעשות ביום אחד. נגיד וכל משתמש מרענן את האתר לפחות פעם אחד - זה יוצר מגבלה של 41 אנשים ביום באתר.

לכן יצרתי קולקשן חדש של סטטיסטיקות (במאגר נתונים קוראים לזה טבלה, עד עכשיו היו רק 2 טבלאות - אתלטים ופוסטים) שמחזיק את מספר כל האתלטים, מספר הפוסטים ושמות כל האתלטים. את כולם אעדכן כל הוספת אתלט. הקולקשן הזה אמור לעזור לי לצמצם את כמות החיפושים.

גם הוספתי לכל אתלט רשימת מקצועות שבהם התחרה, על מנת שאדע את זה מראש שכן אם ארצה טבלת דירוג של רצי 100 מטר, אין מה למשוך אתלטים שלא רצו את המרחק בחיים. זה נשמע שטויות אבל זה קריטי, 50,000 קריאות - זה קצת מאוד (מסתבר).

בהמשך הבנתי שאצטרך לעשות קאשינג לטבלאות דירוג מאחר ולכל טבלת דירוג בממוצע צריך כ200 אתלטים (כרגע, בעתיד אולי יהיה צריך 1000 אתלטים, מי יודע) - כלומר 250 רענונים של טבלת דירוג ביום והלך האתר. זה מחייב פתרון.

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

ביום הזה סיימתי להחליף את כל הפונקציות שמטפלות במידע על אתלטים (מהצד של הדאטאבייס). כעת עם כל השדות החדשים, הקוד שמקבל מידע מהדאטאבייס לא ידע להתמודד וזאת כמובן - משימה לימים הבאים.

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

יום 2: המשך יצירת אותן פונקציות ותיקון באגים מאתמול

לא היה כל כך הרבה זמן ועבדתי בסוף היום - ומי לעזאזל רוצה לעבוד בסוף יום?

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

מחקתי המון פונקציות כי הן היו בזבזניות ואני לא יכול להרשות לעצמי אפילו בטעות לקרוא להן. ערכתי פונקציות כמו צירוף פוסט, משיכת פוסט ופוסטים בין תאריכים מסוימים. הוספתי לקולקשן של סטטיסטיקות דוקומנט (שזאת עמודה בטבלה במאגר נתונים רגיל) חדש שיסתכל על זמני ריענון. כך אדע מתי לרענן חלקים בדאטאבייס שלי. נגיד מתי לרענן טבלת דירוג של 100 מטר נשים או את הפוסטים שמופיעים בפיד בעמוד הראשי של האתר.

סך הכל סיימתי את הקטע של שינוי הקוד מpostgresql לפיירסטור ועכשיו נשאר לתקן את כל הקוד שמקושר לדאטאבייס שידע איך לתפקד עם המשתנים החדשים שחוזרים עכשיו.

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

יום 3: התאמת הקוד לקוד החדש של פיירסטור ותחילת ייעול טבלאות הדירוג

זה לא מובן "כמה קפצת למים" עד שאתה משנה פיסה אחת בקוד ופשוט הכל מסביב קורס. אבל זה לא נורא, זה אומר שהאתר הולך לקבל שינוי גדול ואני מת על זה. אלו שינויים שבאמת פחדתי לעשות, כי הם מאוד ליבתיים והם דורשים ממך לעיתים לכתוב המון קוד בלי לבדוק אותו ואז לבדוק את כל המכונה (כל זרימת הקוד) ביחד.

רגע לפני שאני מתחיל - לקחתי פתק ורשמתי עליו - FeedLoader, HelperFunctions, app, leaderboard. הסטנדרט גבוה. אני לא יכול להעלות בעידכון הזה אתר לא עובד. גם לא ליום. כל הקבצים האלו - צריכים להיות פיקס עם המעבר לפיירסטור.

אז היום - התחלתי מלהעיף את הקובץ הישן של הקוד דאטאבייס. לא רוצה אפילו לגעת בו בטעות.

ערכתי את app.py, הקובץ הראשי שמריץ את שרת הbackend - ככה שידע להפעיל את הדאטאבייס לבד עם משתני סביבה. הוספתי גם כאן קבלה של עוד 2 שדות - תאריך לידה ותחרויות שבהן האתלט התחרה ובכללי עשיתי התאמות קטנות. כעת פרופילי אתלטים חזרו לעבוד.

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

הייתה פונק' אחת שנגעה לדאטאבייס בHelperFunctions. היא עטפה בדיקה של קיום אתלט בדאטאבייס בלוגרים (Logs). קצת מיותר - הורדתי.

טבלאות דירוג - זה יהיה מעניין. כי את זה צריך לייעל פי מיליון אם אני לא רוצה לשלם המון המון כסף.

התחלתי מלהוסיף טבלה (קולקשין) שנקרא leaderboard לדאטאבייס. פונק' משיכה/הופסה וכו' ויצרתי דרך לזכור מתי פעם אחרונה ריעננתי את הטבלה. כעת אם הרענון הזה ישן מדי (כרגע 24 שעות), הטבלה תעודכן שוב בפעם הבאה שמישהו יכנס אליה. אם העדכון עדיין חדש יחסית - המידע פשוט נמשך מהדאטאבייס. זה היה צעד הכרחי, ואני לא יודע כמה הוא יעזור לי לצמצם את כמות הקריאות מבחינת מספרים... אבל נחיה ונראה :)

כרגע - נראה שהטבלת דירוג פשוט... עובדת. אני הרבה פעמים רואה את הדברים האלו כנס. כשהכל מקליק. מרגש כל פעם מחדש. כעת, אפשר להמשיך הלאה.

המשימות הבאות שלנו - משיכת אתלט ישר ממאגר הנתונים ורענון ברקע (לטובת SEO, יש יותר מדי זמן רענון לאתלט - לפעמים אפילו 10 שניות!), בדיקת גיל בטבלאות דירוג שהאתלט בגיל בוגר (אם מדובר במשוכות או זריקות מאחר ומשקל וגובה המשוכה משתנה עם השנים) ותצוגה של כמה תחרויות אתלט/ית רשומות אצלינו בסך הכל.

יום 4: הורדת הטעינה לאתלט ופילטור תחרויות של אתלטים צעירים בטבלאות דירוג

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

בשביל זה צירפתי בקשה חדשה שטוענת את מידע האתלט מהר ורק אם המידע לא עדכני והאתלט אינו אתלט עבר (שזה נבדק בפרונטאנד) - האתר ישלח בקשה נוספת לשרת ויתחיל תהליך הטעינה של כל הנתונים וחישובים בשרת מחדש.

העלתי את זמן הטעינה של טבלאות דירוג ל24 שעות. קצת הפחיד אותי שיכולים לעשות לי 30,000 קריאות ביום. זה 60% מהכמות המותרת ביום. 15,000 נשמע הרבה יותר טוב!

המשכתי למשימה הבאה, הוספתי פילטור של תחרויות בטבלאות הדירוג כלפי גיל. כשמדובר במקצוע באתלטיקה שמשתנה עם הגיל (זריקות ומשוכות), כעת הטבלאות דירוג לא יציגו תחרות אם היא נעשתה בגיל צעיר מדי.

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

יום 5: כתיבת פוסט זה

אין לי שום מילות סיכום לכתוב. אודה לכם אם קראתם את זה! ניסיתי להכניס קצת משפטים יפים בשביל שזה לא יהיה לגמרי משעמם. היום, מחקתי את שרת הפוסטגראס (PostgreSQL) שלי.

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

Deleting my DigitalOcean Postgresql database

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