حين يتوسع التخزين المؤقت في الاتجاه الخاطئ
في مجلد التخزين المؤقت لهذه الخدمة أربعة ملفات صغيرة. أكبرها حجمه 35 بايتًا. وهي معًا تحمل أرقام ثلاثة عدادات، وتُقرأ مع كل طلب عداد دون استثناء.
وُجدت كي لا يضطر مسار العدّ إلى طرح أربعة أسئلة على قاعدة البيانات تجيب عنها دائمًا تقريبًا بكلمة «لا». هل يستبعد هذا العداد زيارات مالكه؟ هل يتتبع النقرات الخارجية؟ هل يتتبع المسارات داخل الموقع؟ هل يعيد تحميل نفسه؟ في أكثر من 99% من العدادات يكون كل جواب «لا»، والرجوع إلى ملف يحمل الأرقام القليلة التي يكون جوابها «نعم» أرخص من أربعة استعلامات مفهرسة.
إنه أرخص فعلًا. لكنه أيضًا من نوع الرخص الذي ينقلب.
ما الذي قيس
السؤال نفسه — «هل هذا العداد في القائمة؟» — طُرح بطريقتين، عند ستة أحجام للقائمة. طريقة الملف: قراءته، وفك ترميز JSON، والبحث عن الرقم. وطريقة قاعدة البيانات: استعلام مُعدّ مسبقًا (prepared statement) واحد على عمود مفهرس. ألفا تكرار لكل منهما، في خمس جولات، مع أخذ الوسيط.
بالحجم الحالي يتفوق الملف بثمانية أضعاف: 0.0202 مللي ثانية مقابل 0.1630. وعند ألف رقم يتعادلان. وعند عشرة آلاف يكلّف الملف اثني عشر ضعفًا، وعند مئة ألف يكلّف 135 ضعفًا، لأنه يكون حينها 578 كيلوبايت يجب قراءتها وتحليلها مع كل مشاهدة.
خط قاعدة البيانات لا يتحرك. 0.16 مللي ثانية عند صفين، و0.16 مللي ثانية عند مئة ألف: هذا هو الغرض من الفهرس، ومن السهل أن ننسى كم من العمل يختبئ خلف مظهر هذا الخط الممل.
الجزء المزعج
نقطة التقاطع في موضع ما بين 100 و1,000 رقم. وفي هذه الخدمة 2,218 عدادًا كانت نشطة خلال الثلاثين يومًا الأخيرة.
لذا لو نجحت ميزة الاستبعاد — لو فعّل كل من لديه عداد خيار «لا تحتسب زياراتي» — لحمل الملف 2,218 رقمًا، ولبلغ وزنه 11 كيلوبايت، ولكلّف 0.43 مللي ثانية لكل مشاهدة بدلًا من 0.02. ومع مشاهدات الأمس البالغة 18,423 يعني ذلك ثماني ثوانٍ من العمل يوميًا لتجنب استعلام كان سيستغرق ثلاثًا.
يكون التحسين في أسرع حالاته حين تكون الميزة في أقل استخدام لها. فهو لا يتراجع تدريجيًا مع الحمل كما يفعل الاستعلام البطيء. بل يتراجع مع انتشار الاستخدام، وهو المحور الوحيد الذي لا يراقبه أحد، لأن ازدياد الاستخدام يُفترض أن يكون الخبر السار.
لماذا لا يزال موجودًا
لأنه صائب اليوم، ويجوز أن يكون «صائب اليوم» سببًا لشيء ما، ما دام أحدهم قد دوّن متى يتوقف ذلك عن كونه صحيحًا.
ثلاثة أرقام في ثلاثة ملفات. أرخص من البديل بثماني مرات، على جهاز يكون فيه مسار العدّ الشيء الوحيد الذي يجب أن يكون سريعًا. واستبداله الآن بالاستعلام الذي يتفوق عليه سيعني نظامًا أسوأ مبررًا بافتراض.
ما يحتاجه هو جرس إنذار، لا إعادة كتابة. فالملف يُكتب من قاعدة البيانات على أي حال، بواسطة الكود الذي يغيّر الإعداد — وهذا هو المكان الطبيعي لملاحظة أن القائمة تجاوزت بضع مئات من الإدخالات والتنبيه إلى ذلك. التخزين المؤقت ذو السقف الموثق قرار. والتخزين المؤقت بلا سقف رهان لم يوافق عليه أحد.
الصورة العامة
ليست هذه حجة ضد التخزين المؤقت في ملف. بل حجة لمعرفة الاتجاه الذي يتوسع فيه التخزين المؤقت.
معظم أنواع التخزين المؤقت تتحسن تحت الحمل: طلبات أكثر، وإصابات أكثر، ونسبة أفضل. أما هذا فمن النوع الآخر. تكلفته لكل طلب دالة في كمية البيانات التي يحملها، وما يحمله ينمو مع الشيء الذي تحاول الخدمة تشجيعه. كل قراءة تدفع ثمن كل إدخال، بما في ذلك الإدخالات الـ2,215 التي لا علاقة لها بالزائر الذي يُعدّ الآن.
والسؤال الذي يجب طرحه عن أي جدول بحث محفوظ في الذاكرة أو في ملف ليس «ما مدى سرعته؟» بل «ما الذي يجعله ينمو، وماذا يحدث حين يسير ذلك الشيء على ما يرام؟». وإذا كان الجواب «يصبح أبطأ»، فمكان حد الحجم هو الكود، بجانب ما يكتب الملف، في يوم بنائه.