שמירת תמונות מונה במטמון בזיכרון
במאמר הזה
קרוב לחמישית מתמונות המונה שהשירות הזה מצייר כבר אינן משנות דבר. סקריפט מעקב עכבר מהדור הקודם טוען את התמונה מחדש בכל תנועה, ומאז שהבקשות האלה הפסיקו להגדיל דבר, שתיים מהן ברצף מפיקות את אותה תמונה, בית לבית.
מועמד מובן מאליו למטמון. ההחלטות המעניינות היו היכן לשים אותו ועל מה לבסס את המפתח.
לא בדיסק
השירות פועל בשרת קטן, והדיסק הוא כרטיס SD. שמירת תמונות מצוירות במטמון עליו הייתה עולה בערך 70 MB של כתיבות ביום, תמורת חיסכון מדוד של 1.6 דקות זמן מעבד ביום.
זאת פשרה גרועה. כרטיסי SD מתקלקלים מכתיבה, ומה שקונים הוא שגיאת עיגול במחשב שאינו מוגבל על ידי המעבד. לכן המטמון נמצא בנתיב /dev/shm, שהוא tmpfs, שהוא RAM. נמדד שם: 0.027 ms לקריאה, 0.036 ms לכתיבה, 1.9 GB פנויים.
הכול נעלם באתחול מחדש. במטמון זה אינו אובדן, אלא המצב הרגיל.
מערכת Redis פועלת באותו מחשב. לא השתמשו בה, מסיבה שאינה קשורה לטכנולוגיה: היא שייכת ליישום אחר ומוגנת בסיסמה עבורו. שיתוף מופע אחד יקשור שני שירותים לא קשורים זה לזה, כך שיום רע לאחד יהפוך ליום רע לאחר.
המפתח מכיל את המספרים
מפתח מטמון רגיל הוא זהות בתוספת תפוגה, והתפוגה היא הימור: שום דבר חשוב לא השתנה בחמש הדקות האחרונות. במונה, מה שמשתנה הוא בדיוק הדבר שמוצג.
לכן הערכים המוצגים נכנסים לתוך המפתח. אם מספר משתנה, זה מפתח אחר והתמונה מצוירת מחדש. ההימור נעלם במקום להיעשות בזהירות. כל ביקור שנספר מגדיל לפחות את הסכום לכל התקופה, ולכן שום ביקור שנספר אינו יכול לקבל תמונה מיושנת. התפוגה שנותרת היא רק חסם עליון לערכים שאינם במפתח — נתונים שבועיים, חודשיים ושנתיים.
מה היה צריך לבדוק קודם
מטמון בטוח רק אם מה שהוא שומר הוא פונקציה של המפתח שלו. זאת טענה לגבי כל עיצוב, והיא נבדקה במקום להיות הנחה:
- שום עיצוב אינו משתמש בערכים
rand(),mt_rand(),shuffle()אוuniqid() - שום עיצוב אינו קורא את השעון ברזולוציה גבוהה משעה
- פרמטרי המעקב מהסקריפט הישן אינם נקראים בשום מקום בעץ הקוד
האחרון הפיק את הכישלון הטוב ביותר בתרגיל כולו. כל עוד הפרמטרים האלה היו חלק מהמפתח, כל בקשה נשאה קואורדינטות עכבר שונות מעט, ולכן כל מפתח היה ייחודי. המטמון פעל יום שלם ורשם 13 פגיעות במטמון. הוא עבד בצורה מושלמת ולא עשה דבר, וזה סוג התקלה שהכי קשה להבחין בו.
ואם משהו כאן נכשל — תיקייה בלתי קריאה, דיסק מלא, רשומה פגומה — התמונה פשוט מצוירת בדרך הרגילה. מטמון לעולם אינו רשאי להיות הסיבה שמונה אינו מופיע.