1. نظرة عامة
في تطبيقات الويب، قد يستغرق إنشاء بعض التقارير وقتًا طويلاً لحساب قاعدة البيانات؛ وتوفر بعض مواقع الويب معلومات عن الطقس، الأمر الذي يتطلب الوصول إلى خادم بعيد لإجراء اتصال SOAP للحصول على معلومات درجة الحرارة. كل هذه أمثلة على المعلومات المعقدة. قد تؤدي إضافة الكثير من المعلومات المعقدة إلى صفحة ويب إلى زيادة التحميل على خادم الويب وخادم قاعدة البيانات. يمنح التخزين المؤقت لكتلة كود JSP للمطورين حرية إضافة جميع أنواع المعلومات المعقدة حسب الرغبة.
يمكن لـ JSP تغليف وتشغيل تعليمات برمجية Java معقدة في مكتبة العلامات، مما يسهل صيانة ملفات صفحات JSP ويجعلها أكثر ملاءمة للمطورين غير المحترفين لاستخدام ملفات صفحات JSP. يوجد بالفعل العديد من مكتبات العلامات، والتي تكون إما منتجات تجارية أو منتجات مفتوحة المصدر. لكن معظم هذه المنتجات تستخدم فقط مكتبات العلامات لتنفيذ الوظائف التي يمكن تنفيذها باستخدام برنامج Java Scriptlet البسيط. يستخدم عدد قليل من المنتجات العلامات المخصصة بطريقة إبداعية، مما يوفر نفس الوظيفة تقريبًا قبل ظهور مكتبات العلامات المخصصة لـ JSP.
تعد مكتبة علامات OSCache، التي صممتها OpenSymphony، تطبيقًا رائدًا لعلامات JSP المخصصة يوفر تخزينًا مؤقتًا سريعًا للذاكرة داخل صفحات JSP الموجودة. على الرغم من وجود عدد قليل من البائعين الذين يقدمون منتجات التخزين المؤقت بأشكال مختلفة، إلا أنهم جميعًا منتجات خاصة بالبائعين. يمكن تشغيل OSCache على أي خادم متوافق مع JSP 1.1، ويمكنه تخزين كتل تعليمات JSP الموجودة مؤقتًا ليس فقط لجميع المستخدمين، ولكن أيضًا على أساس كل مستخدم. يتضمن OSCache أيضًا بعض الميزات المتقدمة لتحسين قابلية التوسع، مثل التخزين المؤقت على القرص، ومسح المخزن المؤقت القابل للبرمجة، والتحكم في الاستثناءات، وما إلى ذلك. بالإضافة إلى ذلك، مثل منتجات OpenSymphony الأخرى، يتم توزيع كود OSCache مجانًا بموجب ترخيص مفتوح المصدر.
تأخذ هذه المقالة عملية تصميم موقع مزاد وهمي كمثال لتقديم عملية عمل OSCache. سيتضمن موقع الويب الخيالي هذا ما يلي: صفحة إدارة تعرض أنشطة المزاد الأخيرة، وصفحة رئيسية كاملة الوظائف تحتوي على معلومات ترويجية متنوعة، وشريط تنقل خاص يحتوي على معلومات حول جميع أنشطة المزاد غير المستقرة للمستخدم.
2. صفحة الإدارة
يحتوي موقع المزاد على تقرير الإدارة، ويستغرق خادم قاعدة البيانات عدة ثوانٍ لإنشاء مثل هذا التقرير. من المهم أن يستغرق إنشاء التقرير وقتًا طويلاً، لأنه قد يكون لدينا العديد من المسؤولين الذين يراقبون تشغيل النظام، ونريد تجنب إعادة إنشاء التقرير في كل مرة يقوم فيها المسؤول بزيارة الموقع. ولتحقيق ذلك، سنقوم بتغليف الصفحة بأكملها في علامة مخزن مؤقت على مستوى التطبيق يتم تحديثها كل ساعة. تتمتع بعض المنتجات من البائعين الآخرين بوظائف مماثلة، لكن OSCache يقوم بها بشكل أفضل منهم.
ومن أجل التبسيط، لن نركز كثيرًا على مشكلات التنسيق. عند كتابة صفحة الإدارة، نضيف أولاً إعلان مكتبة العلامات إلى الصفحة:
<%@ taglib uri="cachetags" prefix="cache" %>
بعد ذلك يتعين علينا إحاطة الصفحة بأكملها بعلامات ذاكرة التخزين المؤقت. وقت التخزين المؤقت الافتراضي لعلامات التخزين المؤقت هو ساعة واحدة.
<cache:cache> .... تقارير الإدارة المعقدة.... </cache:cache>
تم الآن تخزين صفحة الإدارة مؤقتًا. إذا قام المسؤول بالوصول إلى نفس الصفحة مرة أخرى خلال ساعة بعد إنشاء الصفحة، فسوف يرى الصفحة المخزنة مؤقتًا مسبقًا، وليست هناك حاجة إلى أن يقوم خادم قاعدة البيانات بإنشاء هذا التقرير مرة أخرى.
3. الصفحة الرئيسية
تعرض الصفحة الرئيسية لموقع المزاد أنشطة الموقع وتروج للمزادات التي على وشك الانتهاء. نريد عرض عدد المزادات الجارية، وعدد المستخدمين المسجلين حاليًا، وقائمة المزادات التي من المقرر أن تنتهي في المستقبل القريب، والوقت الحالي. تحتوي هذه الرسائل على متطلبات دقة زمنية مختلفة. تستمر المزادات على الموقع الإلكتروني عادةً لعدة أيام، لذا يمكننا ضبط الوقت لتقليل عدد المزادات الصالحة إلى 6 ساعات. من الواضح أن عدد المستخدمين سيتغير بشكل متكرر، ولكن هنا سنقوم بتخزين هذه القيمة لمدة 15 دقيقة في المرة الواحدة. وأخيرًا، نريد أن يكون الوقت الحالي المعروض على الصفحة دائمًا هو الوقت المحدد للوصول إلى الصفحة.
بعد الإعلان عن مكتبة العلامات في الصفحة الرئيسية، نقوم أولاً بإخراج التاريخ الحالي مباشرة دون تخزين مؤقت:
الآن هو: <%=new java.util.Date()%>
بعد ذلك، نريد عرض قائمة بتلك التي ستقام مزادات تنتهي على المدى القصير:
<cache:cache> <ul> <% // إنشاء مكرر يحتوي على أحدث المزادات Iterator Auctions = .... while (auctions.hasMore()) { Auction Auction = (Auction) Auctions .next(); %><li><%=auction%></li%< } %> </ul> </cache:cache>
وأخيرًا، نريد عرض عدد أنشطة المزاد الجارية التي تحتاجها ليتم تخزينها لمدة 6 ساعات. نظرًا لأن وضع علامة على ذاكرة التخزين المؤقت يتطلب عدد الثواني لتخزين البيانات مؤقتًا، فإننا نحول 6 ساعات إلى 21600 ثانية:
<cache:cache time="21600"> <% // الاستعلام عن قاعدة البيانات للحصول على العدد الإجمالي لأنشطة المزاد int AuctionCount = .. .. %> هناك <%=auctionCount%> مزادات جارية على هذا الموقع </cache>
كما ترون، نحن نستخدم فقط كمية صغيرة من التعليمات البرمجية لإنشاء صفحة رئيسية بنظام تخزين مؤقت معقد. يقوم نظام التخزين المؤقت هذا بتخزين كل جزء من الصفحة مؤقتًا بشكل منفصل، ويتوافق وقت التخزين المؤقت لكل جزء تمامًا مع تكرار التغييرات في المعلومات الخاصة به. بفضل التخزين المؤقت، يمكننا الآن وضع المزيد من المحتوى على الصفحة الرئيسية؛ دون التخزين المؤقت من قبل، سيؤدي وضع الكثير من المحتوى على الصفحة الرئيسية إلى إبطاء الوصول إلى الصفحة، وقد يسبب مشاكل لخادم قاعدة البيانات.
4. شريط التنقل
لنفترض أنه عند التخطيط لموقع الويب، قررنا عرض محتوى عربة التسوق أسفل شريط التنقل الأيسر. سنعرض عدد عروض الأسعار والسعر الحالي لكل عنصر في المزاد بواسطة المستخدم، بالإضافة إلى قائمة بجميع العناصر التي حصل المستخدم الحالي على أعلى عرض لها.
نحن نستخدم إمكانات التخزين المؤقت على مستوى الجلسة لإنشاء الوظيفة المذكورة أعلاه في شريط التنقل. ضع الكود التالي في القالب أو قم بتضمين ملف حتى تتمكن الصفحات الأخرى في موقع الويب من الرجوع إلى شريط التنقل هذا
: معلومات العطاء الحالي%> </cache:cache>
نقدم هنا سمتين مهمتين، وهما المفتاح والنطاق. في التعليمات البرمجية السابقة في هذه المقالة، نظرًا لأن علامة ذاكرة التخزين المؤقت يمكنها تلقائيًا إنشاء مفتاح فريد لكتلة التعليمات البرمجية، فلا نحتاج إلى تعيين سمة المفتاح هذه يدويًا. ولكننا نريد هنا الرجوع إلى كتلة التعليمات البرمجية المخزنة مؤقتًا هذه من بقية الموقع، لذلك نحدد بوضوح السمة الرئيسية لعلامة ذاكرة التخزين المؤقت. ثانيًا، يتم استخدام سمة النطاق لإخبار ذاكرة التخزين المؤقت بوضع علامة على أن كتلة التعليمات البرمجية الحالية يجب أن يتم تخزينها مؤقتًا على أساس كل مستخدم، بدلاً من التخزين المؤقت مرة واحدة لجميع المستخدمين.
يجب أن تكون حذرًا جدًا عند استخدام التخزين المؤقت على مستوى الجلسة، ويجب أن يكون الأمر واضحًا: على الرغم من أنه يمكننا إنشاء شريط تنقل معقد يقلل من تحميل الخادم بمقدار 5x أو 10x، إلا أنه سيزيد بشكل كبير من مساحة الذاكرة المطلوبة لكل جلسة. مما لا شك فيه أنه من المثالي زيادة عدد المستخدمين المتزامنين المحتملين من حيث قدرات وحدة المعالجة المركزية، ولكن بمجرد تقليل عدد المستخدمين المتزامنين إلى الحد الأقصى لوحدة المعالجة المركزية من حيث قدرات دعم الذاكرة، لم يعد هذا الحل مثاليًا.
كما ذكرنا سابقًا في هذه المقالة، نريد الرجوع إلى مجموعة التعليمات البرمجية المخزنة مؤقتًا من بقية الموقع. وذلك لأنه عندما يقوم مستخدم بإضافة عنصر للمزاد، أو تقديم عروض أسعار لعناصر تم بيعها بالمزاد بواسطة مستخدمين آخرين، فإننا نريد تحديث المخزن المؤقت بحيث يحتوي شريط التنقل على أحدث محتوى في المرة التالية التي تتم قراءته فيها. على الرغم من أن هذه البيانات قد تتغير بسبب نشاط مستخدمين آخرين، فقد يكون من المربك جدًا للمستخدم أن يرى أن قائمته تظل دون تغيير بعد تنفيذ إجراء ما على الموقع.
يمكن لعلامة التدفق التي توفرها مكتبة OSCache تحديث محتوى المخزن المؤقت. يمكننا إضافة الكود التالي إلى الصفحة التي تتعامل مع إجراءات المستخدم وقد تؤثر على هذه المنطقة:
<cache:flush key="navbar"scope="session" />
عندما يصل المستخدم إليها في المرة القادمة، سيتم تحديث كتلة المخزن المؤقت لشريط التنقل .
حتى الآن، تم الانتهاء من إنشاء نموذج موقع الويب الخاص بنا ويمكن البدء في تشغيله. دعونا نلقي نظرة على إمكانيات معالجة الاستثناءات في OSCache. حتى إذا تم إبطال المحتوى المخزن مؤقتًا، مثل حدوث استثناء Java داخل كتلة المخزن المؤقت، فإن مكتبة علامات OSCache لا تزال تسمح لنا بعرض المحتوى برمجيًا. باستخدام ميزة التحكم في الاستثناءات هذه، يمكننا قطع الاتصال بين خادم قاعدة البيانات وخادم الويب، وسيظل موقع الويب قادرًا على الاستمرار في التشغيل. قدمت مواصفات JSP 1.2 واجهة TryCatchFinally، التي تسمح للعلامة نفسها باكتشاف استثناءات Java والتعامل معها. لذلك، يمكن دمج العلامات مع كود معالجة الاستثناء هذا لجعل صفحات JSP أكثر بساطة وتنظيمًا.
يخطط OpenSymphony لتنفيذ آليات تخزين مؤقت إضافية بالإضافة إلى نظام رئيسي أكثر قابلية للإدارة والذي سيسمح لنا بإدارة ذاكرة الوصول العشوائي (RAM) ومساحة القرص المستخدمة بواسطة التخزين المؤقت. وبمجرد توفر هذه الميزات، سنكون قادرين على تحسين استجابة وموثوقية الموقع.
[الاستنتاج]
يمكن أن يساعدنا OSCache في إنشاء مواقع ويب أكثر تنوعًا وأعلى أداءً. بمساعدة مكتبة علامات OSCache، يمكننا الآن استخدامها لحل بعض المشكلات التي تؤثر على استجابة موقع الويب، مثل فترات ذروة حركة المرور، وخوادم قواعد البيانات المحملة بشكل زائد، وما إلى ذلك.