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" %>
ต่อไปเราต้องล้อมรอบทั้งหน้าด้วยแท็กแคช เวลาแคชเริ่มต้นสำหรับแท็กแคชคือ 1 ชั่วโมง
<cache:cache> .... รายงานการจัดการที่ซับซ้อน.... </cache:cache>
ขณะนี้หน้าการจัดการถูกแคชไว้แล้ว หากผู้ดูแลระบบเข้าถึงเพจเดิมอีกครั้งภายในหนึ่งชั่วโมงหลังจากสร้างเพจ เขาจะเห็นเพจที่แคชไว้ก่อนหน้านี้ และเซิร์ฟเวอร์ฐานข้อมูลไม่จำเป็นต้องสร้างรายงานนี้อีกครั้ง
3. หน้าแรก
หน้าแรกของเว็บไซต์การประมูลจะแสดงกิจกรรมของเว็บไซต์และส่งเสริมการประมูลที่กำลังจะสิ้นสุด เราต้องการแสดงจำนวนการประมูลที่กำลังดำเนินอยู่ จำนวนผู้ใช้ที่เข้าสู่ระบบในปัจจุบัน รายการการประมูลที่จะสิ้นสุดในอนาคตอันใกล้นี้ และเวลาปัจจุบัน ข้อความเหล่านี้มีข้อกำหนดด้านความแม่นยำของเวลาที่แตกต่างกัน โดยปกติการประมูลบนเว็บไซต์จะใช้เวลาหลายวัน ดังนั้นเราจึงสามารถตั้งเวลาเพื่อบัฟเฟอร์จำนวนการประมูลที่ถูกต้องไว้ที่ 6 ชั่วโมง จำนวนผู้ใช้จะเปลี่ยนแปลงบ่อยขึ้นอย่างเห็นได้ชัด แต่ที่นี่เราจะบัฟเฟอร์ค่านี้ครั้งละ 15 นาที สุดท้ายนี้ เราต้องการให้เวลาปัจจุบันที่แสดงบนเพจเป็นเวลาที่แน่นอนที่มีการเข้าถึงเพจเสมอ
หลังจากประกาศไลบรารีแท็กในหน้าแรกแล้ว ขั้นแรกเราจะส่งออกวันที่ปัจจุบันโดยตรงโดยไม่มีการบัฟเฟอร์:
ตอนนี้คือ: <%=new java.util.Date()%>
ต่อไป เราต้องการแสดงรายการวันที่ที่จะประมูล ที่ลงท้ายในระยะสั้น:
<cache:cache> <ul>< <% // สร้าง Iterator ที่มีการประมูลล่าสุด Iterator การประมูล = .... while (auctions.hasMore()) { Auction Auction = (Auction) การประมูล .next(); %><li><%=auction%></li%< } %> </ul> </cache:cache>
สุดท้ายนี้ เราต้องการแสดงจำนวนกิจกรรมการประมูลที่กำลังดำเนินอยู่ จะถูกบัฟเฟอร์เป็นเวลา 6 ชั่วโมง เนื่องจากการทำเครื่องหมายแคชต้องใช้จำนวนวินาทีในการแคชข้อมูล เราจึงแปลง 6 ชั่วโมงเป็น 21600 วินาที:
<cache:cache time="21600"> <% //สืบค้นฐานข้อมูลเพื่อรับจำนวนกิจกรรมการประมูลทั้งหมด int AuctionCount = .. .. %> มี <%=auctionCount%> การประมูลที่กำลังดำเนินอยู่บนเว็บไซต์นี้! </cache>
อย่างที่คุณเห็น เราใช้โค้ดเพียงเล็กน้อยเพื่อสร้างหน้าแรกที่มีระบบบัฟเฟอร์ที่ซับซ้อน ระบบบัฟเฟอร์นี้จะบัฟเฟอร์แต่ละส่วนของหน้าแยกจากกัน และเวลาบัฟเฟอร์ของแต่ละส่วนจะสอดคล้องกับความถี่ของการเปลี่ยนแปลงข้อมูลที่เกี่ยวข้องอย่างสมบูรณ์ ด้วยการบัฟเฟอร์ ทำให้เราสามารถใส่เนื้อหาเพิ่มเติมในหน้าแรกได้ หากไม่มีการบัฟเฟอร์มาก่อน การวางเนื้อหามากเกินไปในหน้าแรกจะทำให้การเข้าถึงหน้าเว็บช้าลง และอาจทำให้เกิดปัญหากับเซิร์ฟเวอร์ฐานข้อมูลที่มากเกินไป
4. Navigation Bar
สมมติว่าเมื่อวางแผนเว็บไซต์ เราตัดสินใจแสดงเนื้อหาตะกร้าสินค้าใต้แถบนำทางด้านซ้าย เราจะแสดงจำนวนการประมูลและราคาปัจจุบันสำหรับแต่ละรายการในการประมูลโดยผู้ใช้ รวมถึงรายการของสินค้าทั้งหมดที่ผู้ใช้ปัจจุบันมีราคาเสนอสูงสุด
เราใช้ความสามารถในการบัฟเฟอร์ระดับเซสชันเพื่อสร้างฟังก์ชันการทำงานข้างต้นในแถบนำทาง ใส่โค้ดต่อไปนี้ลงในเทมเพลตหรือรวมไฟล์เพื่อให้หน้าอื่นๆ ในเว็บไซต์สามารถอ้างอิงแถบนำทางนี้ได้:
<cache:cache key="navbar" scope="session" time="300"> <% //แยกและแสดง ข้อมูลการประมูลปัจจุบัน%> </cache:cache>
ที่นี่เราจะแนะนำคุณลักษณะที่สำคัญสองประการ ได้แก่ คีย์และขอบเขต ในโค้ดก่อนหน้าของบทความนี้ เนื่องจากแท็กแคชสามารถสร้างคีย์เฉพาะสำหรับบล็อคโค้ดได้โดยอัตโนมัติ เราจึงไม่จำเป็นต้องตั้งค่าแอตทริบิวต์คีย์นี้ด้วยตนเอง แต่ที่นี่ เราต้องการอ้างอิงบล็อกโค้ดที่แคชไว้นี้จากส่วนอื่นๆ ของไซต์ ดังนั้นเราจึงกำหนดแอตทริบิวต์คีย์ของแท็กแคชอย่างชัดเจน ประการที่สอง แอ็ตทริบิวต์ขอบเขตใช้เพื่อบอกแคชให้ทำเครื่องหมายว่าบล็อกโค้ดปัจจุบันต้องถูกบัฟเฟอร์ตามผู้ใช้แต่ละราย แทนที่จะบัฟเฟอร์เพียงครั้งเดียวสำหรับผู้ใช้ทั้งหมด
คุณควรใช้ความระมัดระวังอย่างมากเมื่อใช้การบัฟเฟอร์ระดับเซสชัน และควรมีความชัดเจน: แม้ว่าเราจะสามารถทำให้แถบนำทางที่ซับซ้อนลดภาระของเซิร์ฟเวอร์ได้ 5 เท่าหรือ 10 เท่า แต่จะเพิ่มพื้นที่หน่วยความจำที่ต้องใช้ต่อเซสชันอย่างมาก ไม่ต้องสงสัยเลยว่าจะเพิ่มจำนวนผู้ใช้พร้อมกันที่เป็นไปได้ในแง่ของความสามารถของ CPU แต่เมื่อจำนวนผู้ใช้พร้อมกันลดลงจนถึงขีดจำกัดของ CPU ในแง่ของความสามารถในการรองรับหน่วยความจำ โซลูชันนี้ไม่เหมาะอีกต่อไป
ตามที่กล่าวไว้ก่อนหน้าในบทความนี้ เราต้องการอ้างอิงบล็อกโค้ดที่บัฟเฟอร์นี้จากส่วนที่เหลือของไซต์ เนื่องจากเมื่อผู้ใช้เพิ่มรายการสำหรับการประมูล หรือเสนอราคาสำหรับรายการที่ประมูลโดยผู้ใช้รายอื่น เราต้องการรีเฟรชบัฟเฟอร์เพื่อให้แถบนำทางมีเนื้อหาล่าสุดในครั้งต่อไปที่มีการอ่าน แม้ว่าข้อมูลนี้อาจเปลี่ยนแปลงเนื่องจากกิจกรรมของผู้ใช้รายอื่น แต่อาจทำให้ผู้ใช้สับสนมากเมื่อเห็นว่ารายการของตนยังคงไม่เปลี่ยนแปลงหลังจากดำเนินการบนไซต์
แท็กฟลัชที่จัดทำโดยไลบรารี OSCache สามารถรีเฟรชเนื้อหาบัฟเฟอร์ได้ เราสามารถเพิ่มโค้ดต่อไปนี้ลงในเพจที่จัดการการกระทำของผู้ใช้และอาจส่งผลกระทบต่อพื้นที่นี้:
<cache:flush key="navbar" scope="session" />
เมื่อผู้ใช้เข้าถึงในครั้งถัดไป บล็อกบัฟเฟอร์ navbar จะถูกรีเฟรช .
จนถึงขณะนี้ การสร้างเว็บไซต์ตัวอย่างของเราเสร็จสมบูรณ์แล้วและสามารถเริ่มดำเนินการได้ มาดูความสามารถในการจัดการข้อยกเว้นของ OSCache กัน แม้ว่าเนื้อหาที่บัฟเฟอร์ไม่ถูกต้อง เช่น ข้อยกเว้น Java ที่เกิดขึ้นภายในบล็อกบัฟเฟอร์ ไลบรารีแท็ก OSCache ยังคงอนุญาตให้เราแสดงเนื้อหาโดยทางโปรแกรม ด้วยคุณสมบัติการควบคุมข้อยกเว้นนี้ เราสามารถรื้อการเชื่อมต่อระหว่างเซิร์ฟเวอร์ฐานข้อมูลและเว็บเซิร์ฟเวอร์ได้ และเว็บไซต์จะยังคงสามารถทำงานต่อไปได้ ข้อกำหนด JSP 1.2 นำเสนออินเทอร์เฟซ TryCatchFinally ซึ่งช่วยให้แท็กสามารถตรวจจับและจัดการข้อยกเว้นของ Java ได้ ดังนั้น มาร์กอัปสามารถรวมกับโค้ดการจัดการข้อยกเว้นนี้เพื่อทำให้เพจ JSP เรียบง่ายและเป็นระเบียบมากขึ้น
OpenSymphony กำลังวางแผนที่จะใช้กลไกการบัฟเฟอร์เพิ่มเติม เช่นเดียวกับระบบหลักที่สามารถจัดการได้มากขึ้น ซึ่งจะช่วยให้เราจัดการ RAM และพื้นที่ดิสก์ที่ใช้โดยการบัฟเฟอร์ได้ เมื่อคุณสมบัติเหล่านี้พร้อมใช้งานแล้ว เราจะสามารถปรับปรุงการตอบสนองและความน่าเชื่อถือของเว็บไซต์ต่อไปได้
[บทสรุป]
OSCache สามารถช่วยให้เราสร้างเว็บไซต์ที่มีสีสันและมีประสิทธิภาพสูงขึ้นได้ ด้วยความช่วยเหลือของไลบรารีแท็ก OSCache ตอนนี้เราสามารถใช้เพื่อแก้ไขปัญหาบางอย่างที่ส่งผลต่อการตอบสนองของเว็บไซต์ เช่น ช่วงที่มีการรับส่งข้อมูลสูงสุด เซิร์ฟเวอร์ฐานข้อมูลที่โอเวอร์โหลด เป็นต้น