🚀 The Performance Bible: CodeKeeper Optimization Guide ====================================================== המדריך הזה נכתב לאחר ה-Refactor הגדול של דצמבר 2025, שבו הורדנו את ה-p95 של המערכת מ-1.8 שניות ל-200ms. אלו העקרונות שחייבים להישמר: ## 0. חוק הברזל: Cache First (מנע את הגישה ל-DB) לפני אופטימיזציה של שאילתה – בדוק אם היא הכרחית. המערכת משתמשת ב-**Redis Cache** כשכבת הגנה ראשונה. * **Heavy Lists:** TTL ארוך (3-5 דקות). * **Metadata:** TTL קצר (15-60 שניות). * **Validation:** השתמש ב-`/admin/cache-inspector` כדי לוודא שמפתחות נוצרים עם Hash קבוע ולא כתובות זיכרון. **הכלל:** כל קריאת קריאה (Read) כבדה חייבת לעבור דרך `CacheManager`. ## 1. חוק ה-Projection (אל תמשוך מה שאתה לא מציג) לעולם אל תמשוך את השדות `code` או `content` בשאילתות רשימה. הבעיה: שליפת 50 קבצים עם קוד מלא יוצרת Payload של מגה-בייטים, חונקת את ה-RAM של השרת ומאיטה את ה-Serialization. הפתרון: שימוש קבוע ב-`LIST_EXCLUDE_HEAVY_PROJECTION`. איך זה עובד: ה-Repository מחזיר רק מטא-דאטה. התוכן המלא נשלף רק ב-Explicit Fetch (כשמשתמש פותח קובץ ספציפי). ## 2. חישובים ב-DB (Smart Metadata) במקום למשוך קוד ולספור שורות בפייתון, אנחנו מחשבים ושומרים: - `file_size`: גודל הקובץ בבייטים. - `lines_count`: מספר השורות. הכלל: אם אפשר לחשב את זה ב-MongoDB בזמן השמירה – עשה זאת שם. זה הופך את הרשימות ל"נוצה". ## 3. אינדוקס מורכב (Compound Indexes) אל תסמוך על אינדקסים פשוטים. השאילתות שלנו מורכבות ולכן האינדקסים חייבים להיות תואמים: - `{ "user_id": 1, "is_deleted": 1, "created_at": -1 }` – לשליפה מהירה וממוינת של קבצי משתמש. - `{ "user_id": 1, "is_favorite": 1 }` – לדף המועדפים. זכור: שאילתה בלי אינדקס (COLLSCAN) היא פצצת זמן מתקתקת. ## 4. אופטימיזציית API וחיפוש (The Snippet Pattern) בחיפוש גלובלי, במקום להחזיר את כל הקובץ שבו נמצאה המילה: - משתמשים ב-`$regexFind` בתוך מונגו כדי לחתוך Snippet קטן סביב ההתאמה. - מחזירים ל-UI רק את ה-Preview. זה חוסך 99% מהתעבורה בחיפושים כבדים. ## 5. הזרקת נתונים אסינכרונית (Lazy Loading) בדפים כבדים (כמו Observability): - **Backend**: ה-Route מחזיר HTML ריק תוך פחות מ-200ms. - **Frontend**: שימוש ב-Skeleton Loaders בזמן שנתונים נמשכים ב-API נפרד ברקע. - **Concurrency**: שימוש ב-`asyncio.to_thread` לקריאות DB כבדות כדי לא לחסום את ה-Event Loop. ## 6. הגדרות סביבה (The Production Sweet Spot) - `LOG_LEVEL=INFO`: צמצום כתיבת לוגים מיותרת. - `MONGODB_MIN_POOL_SIZE=10`: שמירת חיבורים "חמים" למניעת SSL Handshake Timeouts. - `AIOHTTP_LIMIT_PER_HOST=25`: פתיחת צוואר הבקבוק מול GitHub/APIs חיצוניים.