Gunakan Memcached untuk kinerja perusahaan Java, Bagian 1: Arsitektur dan penyiapan

Dikembangkan oleh Danga Interactive untuk meningkatkan kinerja situs di LiveJournal.com, arsitektur terdistribusi Memcached saat ini mendukung skalabilitas eksponensial aplikasi web sosial seperti Twitter, Facebook, dan Wikipedia. Dalam tutorial dua bagian ini, Sunil Patil memperkenalkan arsitektur hashtable terdistribusi dari Memcached dan membantu Anda mulai menggunakannya untuk menyimpan data dalam cache untuk aplikasi perusahaan Java berbasis database Anda sendiri.

Tutorial ini memperkenalkan Anda untuk menggunakan Memcached untuk meningkatkan kinerja aplikasi perusahaan Java. Paruh pertama dimulai dengan gambaran umum arsitektur cache Java tradisional dibandingkan dengan arsitektur Memcached. Kami juga akan mendapatkan Memcached terinstal di mesin Anda dan saya akan memperkenalkan Anda pada pengaturan dan perintah untuk bekerja dengan Memcached melalui Telnet. Di babak kedua kita akan mengembangkan program klien "Hello Memcached" di Java, yang akan kita gunakan untuk melihat di balik kap klien yang di-cache. Anda juga akan belajar tentang menggunakan Memcached untuk mengurangi beban pada server database Anda, dan menggunakannya untuk menyimpan markup halaman yang dibuat secara dinamis. Terakhir, kami akan mempertimbangkan beberapa opsi lanjutan untuk mengonfigurasi klien yang di-cache.

Selengkapnya tentang penyimpanan cache Java di JavaWorld

  • Lihat "Arsitektur load balancing server, Bagian 1: load balancing tingkat transportasi" untuk diskusi yang lebih mendalam tentang cache terdistribusi dengan Memcached.
  • Lihat juga "Proyek Java sumber terbuka: Sistem Cache Java" untuk mempelajari tentang penyimpanan cache Java tradisional.

Gambaran umum arsitektur cache Memcache dan Java

Kerangka kerja cache Java seperti EHCache dan OSCache pada dasarnya adalah HashMapobjek dalam kode aplikasi Anda. Setiap kali Anda menambahkan objek baru ke cache, objek itu akan disimpan di memori aplikasi Anda. Strategi ini berfungsi dengan baik untuk menyimpan data dalam jumlah kecil, tetapi tidak berfungsi untuk menyimpan lebih dari beberapa gigabyte (GB). Perancang server Memcached mengambil pendekatan arsitektur terdistribusi, yang memungkinkan skalabilitas sistem. Hasilnya, Anda dapat menggunakan Memcached untuk menyimpan sejumlah besar data ke dalam cache.

Arsitektur Memcached terdiri dari dua bagian. Pertama adalah server Memcached yang berjalan dalam prosesnya sendiri. Jika Anda ingin menskalakan aplikasi Anda, Anda dapat menginstal dan menjalankan server Memcached di mesin tambahan. Contoh dari server Memcached tidak sadar satu sama lain. Klien memcached, bagian kedua dari sistem memcached, tidak tahu tentang masing-masing server. Klien bertanggung jawab untuk mengambil server untuk setiap entri cache dan menyimpan atau mendapatkan entri cache - proses yang akan saya bahas secara rinci nanti di artikel.

Jika Anda memiliki pengalaman bekerja pada aplikasi web Java EE, kemungkinan besar Anda sebelumnya telah menggunakan kerangka caching Java open source seperti EHCache atau OSCache. Anda mungkin juga telah menggunakan kerangka kerja cache komersial yang dikirimkan sebagai bagian dari server aplikasi Anda, seperti DynaCache (yang disertakan dengan IBM WebSphere Application Server) atau JBoss Cache (yang disertakan dengan JBoss AS). Sebelum kita masuk ke bagian pembelajaran langsung dari tutorial ini, penting untuk memahami bagaimana Memcached berbeda dari kerangka kerja cache Java tradisional ini.

Menggunakan cache Java tradisional

Menggunakan kerangka kerja caching Java tradisional cukup mudah, terlepas dari apakah Anda memilih opsi open source atau komersial. Untuk kerangka kerja sumber terbuka seperti EHCache atau OSCache, Anda perlu mengunduh binari dan menambahkan file JAR yang diperlukan ke jalur kelas aplikasi Anda. Anda mungkin juga perlu membuat file konfigurasi, yang akan Anda gunakan untuk mengonfigurasi ukuran cache, pembongkaran disk, dan sebagainya. Untuk kerangka caching yang dibundel dengan server aplikasi, Anda biasanya tidak perlu mengunduh JAR tambahan karena JAR tersebut akan digabungkan dengan perangkat lunak.

Setelah menambahkan dukungan untuk kerangka kerja cache di aplikasi Anda, Anda dapat mulai menggunakannya dengan membuat CacheManagerobjek dan mendapatkan serta menyetel entri cache di dalamnya. Di balik terpal, kerangka kerja cache akan membuat CacheManagerobjek di JVM yang sama tempat aplikasi Anda berjalan. Setiap kali Anda menambahkan entri cache, objek itu juga akan ditambahkan ke beberapa jenis hashtable yang dipelihara oleh kerangka caching.

Jika server aplikasi Anda berjalan di beberapa node, Anda mungkin juga menginginkan dukungan untuk cache terdistribusi. Dalam sistem cache terdistribusi, saat Anda menambahkan objek dalam cache di AppServer1, objek tersebut juga tersedia di AppServer2 dan AppServer3. Cache Java tradisional menggunakan replikasi untuk cache terdistribusi, yang berarti bahwa saat Anda menambahkan entri cache di AppServer1, entri cache tersebut secara otomatis direplikasi ke server aplikasi lain di sistem Anda. Hasilnya, entri akan tersedia di semua node Anda.

Menggunakan Memcached

Untuk menggunakan Memcached untuk caching Anda harus mengunduh dan menginstal server Memcached untuk platform pilihan Anda terlebih dahulu. Setelah Anda menginstal server Memcached, itu akan mendengarkan baik pada port TCP atau UDP untuk panggilan cache.

Selanjutnya, Anda akan mengunduh klien Java untuk Memcached dan menambahkan JAR klien ke aplikasi Anda. Setelah itu, Anda dapat membuat objek klien Memcached dan mulai memanggil metodenya untuk mendapatkan dan menyetel entri cache. Saat Anda menambahkan objek ke cache, klien Memcached akan mengambil objek itu, membuat serialnya, dan mengirim array byte ke server Memcached untuk penyimpanan. Pada saat itu, objek yang di-cache mungkin sampah yang dikumpulkan dari JVM tempat aplikasi Anda berjalan.

Saat Anda membutuhkan objek yang di-cache itu, Anda bisa memanggil metode klien Memcached get(). Klien akan menerima getpermintaan tersebut, membuatnya berseri, dan mengirimkannya ke server Memcached. Server Memcached akan menggunakan permintaan untuk mencari objek dari cache. Setelah memiliki objek, itu akan mengembalikan array byte kembali ke klien Memcached. Objek klien Memcached kemudian akan mengambil array byte dan deserialisasinya untuk membuat objek dan mengembalikannya ke aplikasi Anda.

Meskipun aplikasi Anda berjalan di lebih dari satu server aplikasi, semuanya dapat mengarah ke server Memcached yang sama dan menggunakannya untuk mendapatkan dan menyetel entri cache. Jika Anda memiliki lebih dari satu server Memcache, server tidak akan tahu satu sama lain. Sebagai gantinya, Anda akan mengonfigurasi klien Memcached Anda sehingga ia mengetahui semua server Memcached yang tersedia. Misalnya, jika aplikasi Anda membuat objek Java di AppServer1 dan memanggil set()metode Memcached, maka klien Memcached akan mencari tahu ke server mana yang dituju entri itu. Ini kemudian akan mulai berkomunikasi dengan server Memcached itu saja. Demikian juga, ketika kode Anda di AppServer2 atau AppServer3 mencoba getmasuk, klien Memcached pertama-tama akan mencari tahu di server mana entri itu disimpan, dan kemudian berkomunikasi dengan server itu saja.

Logika klien memcache

Dalam konfigurasi defaultnya, klien Memcached menggunakan logika yang sangat sederhana untuk memilih server untuk operasi get atau set. Saat Anda membuat get()atau set()memanggil, klien mengambil kunci cache dan memanggil hashCode()metodenya untuk mendapatkan bilangan bulat seperti 11. Kemudian mengambil nomor itu dan membaginya dengan jumlah server Memcached yang tersedia, katakanlah dua. Kemudian mengambil nilai sisanya, yaitu 1 dalam kasus ini. Entri cache akan masuk ke server Memcached 1. Algoritme sederhana ini memastikan bahwa klien Memcached di setiap server aplikasi Anda selalu memilih server yang sama untuk kunci cache yang diberikan.

Menginstal Memcached

Memcached berjalan di Unix, Linux, Windows, dan MacOSX. Anda dapat mengunduh sumber Memcached dan mengkompilasinya atau Anda dapat mengunduh binari yang dikompilasi oleh orang lain dan menggunakannya untuk menginstal Memcached. Di sini saya akan memandu proses mengunduh binari untuk platform pilihan Anda; lihat Sumber jika Anda lebih suka mengompilasi dari sumber.

Petunjuk penginstalan berikut ditujukan untuk mesin Windows XP 32-bit. Lihat Sumber untuk petunjuk instalasi untuk platform lain seperti Linux. Perhatikan juga bahwa kode contoh untuk artikel ini dikembangkan pada mesin Windows XP 32-bit, meskipun seharusnya bekerja pada platform lain.

  1. Kode Jellycan memiliki versi Memcached yang dimodifikasi yang mudah dan efisien untuk digunakan. Mulailah di sini dengan mengunduh file ZIP biner win32
  2. Perluas Memcached--win32-bin.ziphard disk Anda. Perhatikan bahwa semua isinya adalah memcached.exe. Jalankan file ini untuk memulai server Memcached.
  3. Sekarang jalankan memcached.exe -d installuntuk mendaftarkan memcached.exe sebagai layanan. Anda akan dapat menggunakan konsol Layanan untuk memulai dan menghentikan server Memcache.

CL mulai / berhenti

Coba mulai dan hentikan server Memcached dari baris perintah alih-alih dari panel layanan. Melakukan itu akan memberi Anda lebih banyak fleksibilitas untuk mencoba berbagai opsi baris perintah dan mencari tahu konfigurasi terbaik untuk kebutuhan Anda.

Ketika Anda menjalankan memcached.exetanpa opsi baris perintah, secara default server Memcached akan mulai pada port 11211 dengan 64 MB memori. Dalam beberapa kasus, Anda mungkin ingin memiliki kontrol konfigurasi yang lebih terperinci. Sebagai contoh, katakanlah port 11211 digunakan oleh beberapa proses lain pada mesin Anda dan Anda ingin server Memcached menggunakan port 12000; atau jika Anda memulai server Memcached di QA atau lingkungan produksi, Anda ingin memberinya lebih banyak memori daripada 64 MB default. Dalam kasus ini, Anda dapat menggunakan opsi baris perintah untuk menyesuaikan perilaku server. Menjalankan memcache.exe -helpperintah akan menghasilkan daftar lengkap opsi baris perintah seperti yang ditunjukkan pada Gambar 3.

Terhubung dengan Memcached melalui Telnet

Setelah server Memcached dimulai, ia mendengarkan pada port yang Anda tetapkan. Klien Memcached menyambung ke server pada port TCP atau UDP, mengirim perintah dan menerima tanggapan, dan akhirnya menutup sambungan. (Lihat Sumberdaya untuk rincian protokol yang digunakan klien untuk berkomunikasi dengan server.)

Anda dapat terhubung ke server Memcached Anda dengan berbagai cara. Jika Anda menggunakan klien Java, seperti yang akan kita lakukan di paruh kedua tutorial ini, Anda akan dapat mengakses API sederhana untuk menyimpan dan mendapatkan objek dari cache. Sebagai alternatif, Anda dapat menggunakan klien Telnet untuk terhubung ke server secara langsung. Mengetahui cara menggunakan klien Telnet untuk berkomunikasi dengan server Memcached penting untuk men-debug klien Java, jadi kami akan mulai dari sana.

Perintah Telnet

Pertama, Anda harus menggunakan klien Telnet pilihan Anda untuk terhubung ke server Memcached. Pada mesin Windows XP, Anda dapat dengan mudah menjalankan telnet localhost 11211dengan asumsi server Memcached berjalan pada mesin yang sama dan mendengarkan pada port default 11211. Perintah berikut ini penting untuk bekerja dengan Memcached melalui Telnet:

  • setmenambahkan item baru ke cache. Panggilan tersebut: Set . Anda dapat mengetikkan nilai sebenarnya yang harus disimpan di baris berikutnya. Jika Anda tidak ingin entri cache kedaluwarsa, masukkan 0 sebagai nilainya.
  • getmengembalikan nilai kunci cache. Gunakan get untuk mendapatkan nilai keyName.
  • addmenambahkan kunci baru hanya jika belum ada. Misalnya:add
  • replaceakan mengganti nilai hanya jika kuncinya ada. Misalnya:replace
  • deletemenghapus entri cache untuk kunci tersebut. Anda dapat menggunakan panggilan tersebut delete untuk menghapus nilai keyName.

Tangkapan layar pada Gambar 4 merupakan contoh interaksi dengan server Memcached melalui Telnet. Seperti yang Anda lihat, server memcached memberikan umpan balik untuk setiap perintah, seperti STORED, NOT_STORED, dan sebagainya.

Kesimpulan untuk Bagian 1

Sejauh ini kita telah membahas secara singkat perbedaan antara arsitektur terdistribusi Memcached dan sistem cache Java yang lebih tradisional. Kami juga telah menyiapkan implementasi Memcached di lingkungan pengembangan Anda, dan Anda telah berlatih menghubungkan ke Memcached melalui Telnet. Di bagian selanjutnya dari tutorial ini kita akan menggunakan klien Java spymemcache untuk menyiapkan solusi cache terdistribusi untuk aplikasi Java sampel. Dalam prosesnya, Anda akan belajar lebih banyak tentang Memcached dan bagaimana itu dapat meningkatkan kinerja aplikasi Java EE Anda.

Sunil Patil adalah Arsitek Java EE yang bekerja untuk Avnet Technology di San Francisco, California. Dia adalah penulis Java Portlets 101 (SourceBeat, April 2007) dan telah menulis banyak artikel yang diterbitkan oleh JavaWorld, IBM developerWorks, dan O'Reilly Media. Selain menjadi Pengembang dan Administrator Aplikasi Server Portal WebSphere Bersertifikat IBM, ia adalah Pemrogram Java Bersertifikat Sun Microsystems, pengembang komponen Web, dan pengembang komponen bisnis. Anda dapat melihat blog Sunil di //www.webspherenotes.com.