1. Ikhtisar
Dalam aplikasi Web, pembuatan beberapa laporan mungkin memerlukan waktu lama untuk dihitung oleh database; beberapa situs web menyediakan informasi cuaca, yang memerlukan akses ke server jarak jauh untuk membuat panggilan SOAP guna memperoleh informasi suhu. Semua ini adalah contoh informasi yang kompleks. Menambahkan terlalu banyak informasi kompleks ke halaman Web dapat menyebabkan server Web dan server database kelebihan beban. Buffer blok kode JSP memberi pengembang kebebasan untuk menambahkan semua jenis informasi kompleks sesuka hati.
JSP dapat merangkum dan menjalankan kode Java yang kompleks di perpustakaan tag, yang membuat file halaman JSP lebih mudah dipelihara dan memudahkan pengembang non-profesional untuk menggunakan file halaman JSP. Sudah ada banyak perpustakaan tag, baik produk komersial maupun produk sumber terbuka. Namun sebagian besar produk ini hanya menggunakan perpustakaan tag untuk mengimplementasikan fungsi yang dapat diimplementasikan dengan Java Scriptlet sederhana.Beberapa produk menggunakan tag khusus dalam beberapa cara yang kreatif, menyediakan fungsi yang hampir sama sebelum munculnya perpustakaan tag khusus JSP.
Pustaka tag OSCache, dirancang oleh OpenSymphony, adalah aplikasi tag kustom JSP inovatif yang menyediakan cache memori cepat dalam halaman JSP yang ada. Meskipun ada beberapa vendor yang menawarkan produk caching dalam berbagai bentuk, semuanya merupakan produk khusus vendor. OSCache dapat berjalan di server apa pun yang mendukung JSP 1.1, dan dapat melakukan cache blok kode JSP yang ada tidak hanya untuk semua pengguna, tetapi juga pada basis per pengguna. OSCache juga menyertakan beberapa fitur lanjutan untuk meningkatkan skalabilitas, seperti buffering ke disk, buffer flushing yang dapat diprogram, kontrol pengecualian, dll. Selain itu, seperti produk OpenSymphony lainnya, kode OSCache didistribusikan secara bebas di bawah lisensi sumber terbuka.
Artikel ini mengambil contoh proses desain situs lelang imajiner untuk memperkenalkan proses kerja OSCache. Situs Web imajiner ini akan mencakup: halaman manajemen yang melaporkan aktivitas lelang terkini; halaman beranda yang berfungsi penuh dengan berbagai informasi promosi; dan bilah navigasi khusus yang berisi informasi tentang semua aktivitas lelang pengguna yang belum diselesaikan.
2. Halaman manajemen
Situs lelang berisi laporan manajemen, dan server database memerlukan beberapa detik untuk membuat laporan tersebut. Penting agar laporan membutuhkan waktu lama untuk dibuat, karena kami mungkin memiliki banyak administrator yang memantau pengoperasian sistem, dan kami ingin menghindari pembuatan ulang laporan setiap kali administrator berkunjung. Untuk mencapai hal ini, kami akan merangkum seluruh halaman ke dalam tag buffer tingkat aplikasi yang disegarkan setiap jam. Beberapa produk dari vendor lain mempunyai fungsi serupa, hanya saja OSCache melakukannya lebih baik dari mereka.
Demi kesederhanaan, kami tidak akan terlalu fokus pada masalah pemformatan. Saat menulis halaman manajemen, pertama-tama kita menambahkan deklarasi perpustakaan tag ke halaman:
<%@ taglib uri="cachetags" prefix="cache" %>
Selanjutnya kita harus mengelilingi seluruh halaman dengan tag cache. Waktu cache default untuk tag cache adalah 1 jam.
<cache:cache> .... Laporan manajemen yang kompleks.... </cache:cache>
Halaman manajemen kini telah di-cache. Jika administrator mengakses halaman yang sama lagi dalam waktu satu jam setelah halaman dibuat, dia akan melihat halaman yang di-cache sebelumnya, dan server database tidak perlu membuat laporan ini lagi.
3. Halaman Beranda
Halaman beranda situs lelang menampilkan aktivitas situs web dan mempromosikan lelang yang akan segera berakhir. Kami ingin menampilkan jumlah lelang yang sedang berlangsung, jumlah pengguna yang login saat ini, daftar lelang yang akan berakhir dalam waktu dekat, dan waktu saat ini. Pesan-pesan ini memiliki persyaratan akurasi waktu yang berbeda. Lelang di website biasanya berlangsung selama beberapa hari, jadi kita bisa mengatur waktu buffer jumlah lelang yang valid menjadi 6 jam. Jumlah pengguna jelas akan lebih sering berubah, tapi di sini kita akan buffer nilai ini selama 15 menit setiap kalinya. Terakhir, kami ingin waktu saat ini yang ditampilkan pada halaman selalu sama dengan waktu saat halaman diakses.
Setelah mendeklarasikan perpustakaan tag di halaman beranda, pertama-tama kita langsung menampilkan tanggal saat ini tanpa buffering:
sekarang menjadi: <%=new java.util.Date()%>
Selanjutnya, kita ingin menampilkan daftar tanggal yang akan dilelang yang berakhir dalam jangka pendek:
<cache:cache> <ul> <% // Buatlah Iterator yang berisi lelang terbaru Iterator Auctions = .... while (auctions.hasMore()) { Auction Auction = (Auction) Auctions .next(); %><li><%=auction%></li%< } %> </ul> </cache:cache>
Terakhir, kami ingin menampilkan jumlah aktivitas lelang yang sedang berlangsung untuk dibuffer selama 6 jam. Karena penandaan cache memerlukan jumlah detik untuk menyimpan data dalam cache, kami mengubah 6 jam menjadi 21600 detik:
<cache:cache time="21600"> <% //Meminta database untuk mendapatkan jumlah total aktivitas lelang int AuctionCount = .. .. %> Ada <%=auctionCount%> lelang yang sedang berlangsung di situs web ini! </cache>
Seperti yang Anda lihat, kami hanya menggunakan sejumlah kecil kode untuk membuat beranda dengan sistem buffering yang kompleks. Sistem buffering ini melakukan buffering pada setiap bagian halaman secara terpisah, dan waktu buffering pada setiap bagian sepenuhnya konsisten dengan frekuensi perubahan informasi masing-masing. Berkat buffering, sekarang kita dapat menempatkan lebih banyak konten di beranda; tanpa buffering sebelumnya, menempatkan terlalu banyak konten di beranda akan menyebabkan akses halaman melambat, dan bahkan dapat menyebabkan masalah pada server database.
4. Bilah Navigasi
Misalkan saat merencanakan situs web, kita memutuskan untuk menampilkan konten keranjang belanja di bawah bilah navigasi kiri. Kami akan menampilkan jumlah tawaran dan harga saat ini untuk setiap item dalam lelang oleh pengguna, serta daftar semua item yang tawaran tertingginya dimiliki oleh pengguna saat ini.
Kami menggunakan kemampuan buffering tingkat sesi untuk membangun fungsionalitas di atas di bilah navigasi. Masukkan kode berikut ke dalam templat atau sertakan file sehingga halaman lain di situs web dapat mereferensikan bilah navigasi ini:
<cache:cache key="navbar" scope="session" time="300"> <% //Ekstrak dan tampilkan informasi Penawaran saat ini%> </cache:cache>
Di sini kami memperkenalkan dua atribut penting, yaitu kunci dan cakupan. Pada kode sebelumnya di artikel ini, karena tag cache dapat secara otomatis membuat kunci unik untuk blok kode, kita tidak perlu menyetel atribut kunci ini secara manual. Namun di sini, kami ingin mereferensikan blok kode yang di-cache ini dari seluruh situs, jadi kami secara eksplisit mendefinisikan atribut key dari tag cache. Kedua, atribut scope digunakan untuk memberi tahu cache untuk menandai bahwa blok kode saat ini harus di-buffer per pengguna, bukan buffering satu kali untuk semua pengguna.
Anda harus sangat berhati-hati saat menggunakan buffering tingkat sesi, dan ini harus jelas: meskipun kita dapat membuat bilah navigasi yang rumit mengurangi beban server sebanyak 5x atau 10x, ini akan sangat meningkatkan ruang memori yang dibutuhkan per sesi. Tidak diragukan lagi, meningkatkan jumlah kemungkinan pengguna secara bersamaan dalam hal kemampuan CPU adalah hal yang ideal, tetapi setelah jumlah pengguna secara bersamaan dikurangi hingga batas CPU dalam hal kemampuan dukungan memori, solusi ini tidak lagi ideal.
Seperti disebutkan sebelumnya dalam artikel ini, kami ingin mereferensikan blok kode yang di-buffer ini dari seluruh situs. Hal ini karena ketika pengguna menambahkan item untuk dilelang, atau menawar item yang dilelang oleh pengguna lain, kami ingin menyegarkan buffer sehingga bilah navigasi memiliki konten terbaru saat dibaca lagi. Meskipun data ini dapat berubah karena aktivitas pengguna lain, mungkin akan sangat membingungkan bagi pengguna untuk melihat bahwa daftarnya tetap tidak berubah setelah melakukan tindakan di situs.
Tag flush yang disediakan oleh perpustakaan OSCache dapat menyegarkan konten buffer. Kita dapat menambahkan kode berikut ke halaman yang menangani tindakan pengguna dan mungkin memengaruhi area ini:
<cache:flush key="navbar" scope="session" />
Saat pengguna mengaksesnya di lain waktu, blok buffer navbar akan disegarkan .
Sejauh ini pembangunan website contoh kami telah selesai dan dapat mulai berjalan. Mari kita lihat kemampuan penanganan pengecualian OSCache. Sekalipun konten yang dibuffer telah tidak valid, seperti pengecualian Java yang terjadi dalam blok buffer, pustaka tag OSCache masih memungkinkan kita untuk menampilkan konten secara terprogram. Dengan fitur kontrol pengecualian ini, kita dapat memutus koneksi antara server database dan server web, dan website akan tetap dapat terus berjalan. Spesifikasi JSP 1.2 memperkenalkan antarmuka TryCatchFinally, yang memungkinkan tag itu sendiri mendeteksi dan menangani pengecualian Java. Oleh karena itu, markup dapat digabungkan dengan kode penanganan pengecualian ini untuk membuat halaman JSP lebih sederhana dan terorganisir.
OpenSymphony berencana untuk mengimplementasikan mekanisme buffering tambahan serta sistem utama yang lebih mudah dikelola yang memungkinkan kita mengelola RAM dan ruang disk yang digunakan oleh buffering. Setelah fitur-fitur ini diterapkan, kami akan dapat lebih meningkatkan daya tanggap dan keandalan situs web.
[Kesimpulan]
OSCache dapat membantu kami membangun situs web yang lebih berwarna dan berkinerja lebih tinggi. Dengan bantuan perpustakaan tag OSCache, sekarang kita dapat menggunakannya untuk menyelesaikan beberapa masalah yang mempengaruhi respons situs web, seperti periode lalu lintas puncak, server database yang kelebihan beban, dll.