وداعًا لبطء تحميل صفحات الويب مع يور ويب
تشمل اليوم عملية تحميل صفحة الويب (Web page) من موقع ما عمليات استعلام من قاعدة بيانات لمعرفة آخر النقاشات التي شاركت بها مثلًا، والحصول على قائمة بالأخبار المرتبطة بالموضوع الذي تقرؤه وعرض روابط متعلقة بموقعك الجغرافي، أو ما شابه ذلك.
لكن وصول عمليات الاستعلام تلك لقاعدة البيانات تستهلك الكثير من الوقت، لذلك تلجأ العديد من المواقع إلى التخزين المؤقت (cache) لنتائج الاستفسارات الشائعة على خوادم الويب (Web Servers) بغرض زيادة سرعة الوصول إليها.
وفي الحقيقة فإن المبدأ نفسه مطبق في الحواسيب الشخصية، ولنفهم عملية التخزين المؤقت إليك المثال التالي لتوضيح الفكرة فقط:
لنفرض أن هذا المقال حقق عدد قراءات قياسيًا، وكما نعلم فإن كل البيانات تخزن مسبقًا في قاعدة بيانات، فعملية الوصول لهذا المقال من قبل مئة ألف شخص يتطلب الاستعلام وسؤال قاعدة البيانات لمئة ألف مرة، الأمر الذي يعتبر مكلفًا زمنيًا، فكيف يمكن حل مثل هذه المشكلة؟
هنا يأتي دور الذاكرة المخبأة (cache memory) والتي تعتبر ذاكرة سريعة للغاية وصغيرة الحجم نسبيًا، تُخزّن فيها البيانات التي يتكرر طلبها وبشكل مؤقت، وعليه فعندما يتكرر طلب مقالنا هذا سوف يُخزّن في تلك الذاكرة، وعندما يطلبه أحد جديد فلا حاجة للعودة لقاعدة البيانات وإنما نسأل الذاكرة المخبأة أولًا عن توافر هذه المقالة لديها فإذا أجابت بنعم فتقرأ المقال بسرعة وبدون مشاكل أما إذا أجابت بالنفي تعود إلى قاعدة البيانات لتحصل على معلوماتك من هناك مع كلفة زمنية إضافية.
والمشكلة التي تواجهنا هنا هي أنه عندما يغير المستخدم قيمة ما في قاعدة البيانات فسنحتاج عندها لتحديث الذاكرة المخبأة أيضًا. المهمة المعقدة المتمثلة في تحليل تعليمات الموقع لتحديد العمليات التي تتطلب تحديث القيم المخزنة في الذاكرة المخبأة يندرج عمومًا تحت مهام مبرمج الويب. وأي عطل في واحدة من هذه العمليات ستؤدي حتمًا إلى عطل في الموقع.
ولندرك أهمية هذه العملية وأثرها لنتخيل السيناريو التالي في نظام بنكي، حيث لديك حساب يحوي 2000$ ولنفرض أنك طلبت معلومات الحساب ليخبرك بتوافر 2000 $ لديك وعندها انتقلت معلومات حسابك إلى الذاكرة المخبأة فإذا سحبت منه 1500$ أي أنك قمت بالتعديل على قاعدة البيانات مباشرة وأصبح المبلغ في الحساب المسجل في قاعدة البيانات هو 500 $، ولكن تذكر أن ذلك التعديل لم يحدث على الذاكرة المخبأة وإنما فقط على قاعدة البيانات فإذا طلبت بعد قليل معلومات الحساب من جديد فإن النظام سيسأل الذاكرة المخبأة وليس قاعدة البيانات عن الحساب وهي بدورها ستعطي القيمة القديمة وهي 2000$، وهنا تخيل حجم النتائج والأعطال والخسائر لأي مصرف يستخدم ذلك النظام.
الباحثون من قسم علوم الحاسب في معهد ماساتشوستس للتكنولوجيا ومختبر الذكاء الاصطناعي في ندوة لجمعية الحوسبة الآلية حول مبادئ لغات البرمجة قدّموا نظامًا جديدًا يعالج عملية التخزين المؤقت لاستعلامات قاعدة البيانات لتطبيقات الويب في الذاكرة المخبأة وبلغة مخصصة لبرمجة الويب تدعى يور ويب (Ur/Web) وهي لغة مفتوحة المصدر.
على الرغم من أن الموقع قد يضمن معالجة العديد من الطلبات بشكل تفرعي، أي معالجة بيانات مؤقتة مختلفة قادمة من مختلف المستخدمين في نفس الوقت، أو حتى البيانات المخزنة في الذواكر المخبأة في مختلف خوادم النظام، ليبدو للمستخدمين وكأن عملياتهم تنفذ بشكل تسلسلي. على سبيل المثال، يضمن النظام عند إعطاء المستخدم تذكرة حجز في حفلة ما أنها متاحة عند نقر ذلك المستخدم على رابط الحجز، وأن التذكرة لا تزال متوافرة عند الدفع ولم يحجزها أحد آخر خلال تلك المدة الفاصلة بين الحجز والدفع.
وقارنت التجارب الجديدة بين موقعين تمت برمجتهما باستخدام يور ويب، أحدهما فقط يستخدم النظام التلقائي في التخزين ضمن الذاكرة المخبأة والآخر يعتمد الطريقة التقليدية، وجاءت النتيجة لصالح النظام التلقائي الذي حقق سرعات تتراوح بين ضعف السرعة وحتى 30 ضعف سرعة الموقع الآخر.
ويقول (آدم شليبالا- Adam Chlipala) الدكتور المساعد في قسم هندسة الإلكترونيات وعلوم الحاسوب في معهد ماساتشوستس والمعد الرئيسي للدراسة: «تتضمن مواقع الويب الشهيرة قواعد بيانات التي لا يُطلَب منها الطلبات نفسها مرارًا وتكرارًا، فالموقع يعتمد على فكرة أنني قد كررت هذا الطلب كثيرًا في الآونة الأخيرة وحفظت النتيجة لذا سوف أقوم فقط بإخراجها من الذاكرة».
ولكن الجزء الصعب هنا هو أنه عند إجرائك تعديلات على قاعدة البيانات فبعض المعلومات التي قمت بحفظها مسبقًا في الذاكرة لم تعد صالحة، وعليك القيام بما يسمى إلغاء الصلاحية (invalidating) لتلك البيانات، والطريقة المتعارف عليها لتطبيق ذلك كانت بإضافة منطق إلغاء الصلاحية بشكل يدوي من قبل المبرمج لكل سطر من برنامجه يقوم بتغيير في قاعدة البيانات. أي أنه على المبرمج حينها الجلوس والتفكير: ما هي السطور التي تقرأ القيم من قاعدة البيانات وتخزنها في الذاكرة وتتأثر بالتحديثات التي تجري؟
يشترك شليبالا بالورقة البحثية المقدمة مع طالب متخرج من كلية علوم الحاسوب في كارنيغي ميلون يدعى زيف سكالي ( Ziv Scully)
أما عن ميزات يور ويب، فهي تسمح لمبرمجي الويب بالتخصيص الوظيفي في مواقعهم بشكلٍ كاملٍ وباستخدام لغة برمجة واحدة.
إذ يولد مترجم يور ويب (Ur/Web Compiler) تلقائيًا مختلف أنواع التعليمات المطلوبة لدعم الموقع مثل (HTML) و (JavaScript) و (CSS) و (SQL)، بينما تضمن أيضًا الأداء الجيد والأمن.
عدّل نظام سكالي وشليبالا الجديد أيضًا على المترجم (compiler)* بحيث يسمح لمستخدمي يور ويب بإعادة ترجمة التعليمات البرمجية الموجودة بها للحصول على كل ميزات التخزين المؤقت في قاعدة البيانات. أما اللغة فبقيت نفسها دون تغيير.
يبدأ المترجم الجديد بتحليل التعليمات البرمجية لبرنامج يور ويب وتحديد البيانات التي يجب حفظها في ذاكرة التخزين المؤقت وكيفية تنظيمها. على سبيل المثال، إذا كان هناك أنواع معينة من الطلبات التي تتزامن مع بعضها البعض بشكل دائم تقريبًا، سيقوم يور ويب بتخزين البيانات المرتبطة في جدول واحد. ويقرر المترجم أيضًا ما سيخزنه كالبيانات الخام، أو كود HTML أو صفحات الويب بأكملها إذا سمح هيكل البرنامج بذلك.
إذًا يفحص المترجم البرنامج ويقارن كل عملية تقوم بتحديث قيمة في قاعدة البيانات مع كل عملية تطلب استعلامات من قاعدة البيانات لمعرفة متى تحتاج القيم مخزنة في الذاكرة المخبأة لإلغاء صلاحيتها ويضيف أوامر إلغاء الصلاحية المناسبة في الأماكن المناسبة.
ومثل العديد من لغات البرمجة، يور ويب لديه نظام زمن تنفيذ (runtime) مرتبط به وهو برنامج صغير يعمل في الخلفية لإدارة تنفيذ التطبيقات المكتوبة بلغة يور ويب. كما حدّث شليبالا وسكالي ذلك النظام لمراقبة تردد الاستعلامات التي تُطلَب من الذاكرة المخبأة. وعندما يلاحظ عدم استخدامها تُحذف، مما يحسّن من كفاءة النظام.
بالإضافة إلى اختبار النظام على موقعين كاملين، فقد اختبر شليبالا وسكالي النظام أيضًا على عدد قليل من البرامج الصغيرة، المكتوبة أيضًا في يور ويب، وهي جزء من مجموعة من المعايير المستخدمة لمقارنة أطر تطوير مواقع الانترنت المختلفة (Web development frameworks). وقد قدم النظام الجديد زيادة في السرعة تتراوح بين ضعفين وخمسة أضعاف.
على أي حال لم تقارن المواقع التي طورت باستخدام النظام الخاص بهم بالنسبة إلى المواقع التي تستخدم لغات أخرى لأنه، كما يوضح شليبالا: «يور ويب أسرع بكثير من أي شيء آخر وحتى إذا تبين لنا أن شخصًا ما يمكن أن يقوم بعمل إضافي للحصول على ثلاثة أضعاف من الإنتاجية، فمن الرائع أن تضاعف يور ويب من الإنتاجية بدون عمل إضافي».
ويقول أندرو مايرز (Andrew Myers)، أستاذ علوم الكومبيوتر في جامعة كورنيل: «العديد من المواقع والبرامج التي تستخدم قواعد بيانات تستخدم معها الذاكرة المخبأة لتحسين الأداء، ومع ذلك فمن الصعب جدًا القيام بذلك بشكل صحيح، وتجنب الحصول على نتائج استعلامات غير صالحة، وبالتالي فإن محاولة تسريع التطبيقات بهذه الطريقة يؤدي إلى أخطاء يصعب العثور عليها أكثر من الطلب من المبرمج تحديد النتائج التي يجب التخلص منها، وباحثو معهد ماساتشوستس للتكنولوجيا نظام يفعلون ذلك تلقائيًا، من خلال تحليل الطلبات مختلفة التي يقوم بها التطبيق لقاعدة البيانات».
هوامش:
المترجم (compiler): هو برنامج حاسوبي يقوم بتحويل الملفات المصدرية (code) المكتوبة بلغة برمجة إلى أوامر مباشرة يفهمها الحاسوب.
إعداد: دعاء عساف
تدقيق: جعفر الجزيري
المصادر