Beri ruang untuk JavaSpaces, Bagian 1

Artikel ini memulai utas kedua dari seri Jiniologi . Pada bulan Juni, Bill Venners meluncurkan Jiniology dengan ikhtisar teknologi Jini - infrastruktur baru yang kuat untuk membangun dan menerapkan sistem terdistribusi yang diatur sebagai federasi layanan. Utas ini, yang akan ditampilkan setiap bulan di kolom ini, berfokus pada JavaSpaces,layanan inti Jini dari Sun Microsystems yang menyediakan sarana tingkat tinggi untuk membuat aplikasi kolaboratif dan terdistribusi. Jika Anda membuat aplikasi dengan Jini, Anda pasti ingin tahu cara menggunakan JavaSpaces untuk mengoordinasikan peserta dalam federasi Jini. Tetapi penting juga untuk diingat bahwa Anda dapat menggunakan JavaSpaces secara terpisah dari Jini, sebagai alat untuk membangun sistem terdistribusi umum di Java. Dalam kedua kasus tersebut, JavaSpaces layak untuk dilihat, karena dapat secara signifikan memudahkan desain dan pengkodean aplikasi terdistribusi.

Beri ruang untuk JavaSpaces: Baca seluruh seri!

  • Bagian 1. Kemudahan pengembangan aplikasi terdistribusi dengan JavaSpaces
  • Bagian 2. Bangun server komputasi dengan JavaSpaces
  • Bagian 3. Koordinasikan aplikasi Jini Anda dengan JavaSpaces
  • Bagian 4. Jelajahi transaksi Jini dengan JavaSpaces
  • Bagian 5. Buat server komputasi Anda kuat dan terukur

Dalam seri ini, kami akan mulai dengan memperkenalkan Anda pada model pemrograman JavaSpaces yang unik, yang sangat berbeda dari jaringan dan alat terdistribusi lain yang mungkin Anda kenal. Di artikel berikutnya, kami akan membahas detail JavaSpaces API dan bagaimana Anda dapat menggunakannya untuk merekatkan proses menjadi aplikasi terdistribusi, dan menjelaskan bagaimana JavaSpaces berinteraksi dengan komponen Jini lainnya. Sepanjang seri, Anda akan melihat bahwa JavaSpaces itu sederhana (API hanya terdiri dari beberapa operasi), ekspresif (sejumlah besar masalah dapat diselesaikan menggunakan JavaSpaces), dan kuat (Anda dapat membangun sistem terdistribusi canggih dengan jumlah kecil dari kode JavaSpaces).

Mari kita mulai.

Model komputasi terdistribusi baru

Membangun aplikasi terdistribusi dengan alat jaringan konvensional biasanya memerlukan pengiriman pesan antar proses atau metode pemanggilan pada objek jarak jauh. Dalam aplikasi JavaSpaces, sebaliknya, proses tidak berkomunikasi secara langsung, tetapi mengoordinasikan aktivitasnya dengan bertukar objek melalui ruang, atau memori bersama. Suatu proses dapat writeberupa objek baru menjadi ruang, takeobjek dari suatu ruang, atauread(membuat salinan dari) objek di ruang; Gambar 1 menggambarkan beberapa proses (diwakili oleh Dukes) yang berinteraksi dengan ruang menggunakan operasi ini. Saat mengambil atau membaca objek, proses menggunakan pencocokan sederhana, berdasarkan nilai bidang, untuk menemukan objek yang penting bagi mereka. Jika objek yang cocok tidak segera ditemukan, maka proses dapat menunggu hingga objek tersebut tiba. Di JavaSpaces, tidak seperti penyimpanan objek konvensional, proses tidak memodifikasi objek dalam ruang atau memanggil metode mereka secara langsung - sementara di sana, objek hanyalah data pasif. Untuk memodifikasi objek, proses harus secara eksplisit menghapusnya, memperbaruinya, dan memasukkannya kembali ke dalam ruang.

Spasi adalah penyimpanan objek dengan beberapa properti penting yang berkontribusi untuk membuat JavaSpaces menjadi alat ekspresif yang kuat. Mari kita lihat lebih dekat:

  • Spasi dibagikan: Banyak proses jarak jauh dapat berinteraksi dengan ruang secara bersamaan - ruang itu sendiri menangani detail akses bersamaan, membuat Anda fokus pada desain protokol tingkat tinggi di antara proses Anda.

  • Spasi bersifat persisten: Spasi menyediakan penyimpanan yang andal untuk objek. Saat Anda menyimpan objek di suatu ruang, objek tersebut akan tetap ada di sana tanpa batas waktu hingga dihapus. Anda juga dapat meminta waktu sewa selama suatu objek harus disimpan. Setelah disimpan di dalam ruang, sebuah objek akan tetap di sana sampai waktu sewa (yang dapat diperbarui) selesai, atau sampai suatu proses secara eksplisit menghapusnya. Kami akan membahas sewa lebih mendalam nanti di seri ini.

  • Spasi bersifat asosiatif: Objek dalam ruang ditempatkan melalui pencarian asosiatif, bukan berdasarkan lokasi memori atau pengenal. Pencarian asosiatif menyediakan cara sederhana untuk menemukan objek yang Anda minati menurut isinya, tanpa harus mengetahui apa nama objek itu, siapa yang membuatnya, atau di mana disimpan. Untuk mencari objek, Anda membuat templat (objek dengan beberapa atau semua bidangnya disetel ke nilai tertentu, dan yang lain dibiarkan nullsebagai karakter pengganti). Objek di ruang tersebut cocok dengan templat jika sama persis dengan bidang yang ditentukan templat itu. Anda akan melihat bahwa, dengan pencarian asosiatif, Anda dapat dengan mudah mengekspresikan kueri untuk objek seperti "Adakah tugas yang harus dihitung?" atau "Apakah ada jawaban untuk faktor prima yang saya minta? "

  • Spasi aman secara transaksional: JavaSpaces menggunakan layanan transaksi Jini untuk memastikan bahwa operasi pada spasi adalah atom (baik operasi diterapkan, atau tidak). Transaksi didukung untuk operasi tunggal pada satu ruang, serta beberapa operasi pada satu atau lebih ruang (baik semua operasi diterapkan, atau tidak ada). Seperti yang akan Anda lihat nanti dalam seri ini, transaksi adalah cara penting untuk menangani kegagalan sebagian.

  • Spaces memungkinkan Anda bertukar konten yang dapat dieksekusi: Saat berada di dalam spasi, objek hanyalah data pasif - Anda tidak dapat mengubahnya atau menjalankan metodenya. Namun, saat Anda membaca atau mengambil objek dari suatu ruang, salinan lokal dari objek tersebut dibuat. Seperti objek lokal lainnya, Anda dapat memodifikasi kolom publiknya dan menjalankan metodenya, meskipun Anda belum pernah melihat objek seperti itu sebelumnya. Kemampuan ini memberi Anda mekanisme yang kuat untuk memperluas perilaku aplikasi Anda melalui suatu ruang.

Seiring perkembangan rangkaian ini, kami akan menunjukkan kepada Anda bagaimana properti ini memainkan peran penting dalam memungkinkan Anda membuat aplikasi terdistribusi yang bekerja dengan baik di lingkungan Jini, di mana jaringan sering kali terjadi secara spontan, dan proses bergabung dan keluar dari komputasi secara dinamis, terkadang karena perangkat atau kesalahan jaringan.

Asal-usul JavaSpaces

Kami telah mendeskripsikan JavaSpaces sebagai model komputasi terdistribusi baru, tetapi asal-usulnya dapat ditelusuri kembali ke Universitas Yale pada awal 1980-an. Di sana, Dr. David Gelernter mengembangkan alat yang disebut Linda untuk membuat aplikasi terdistribusi. Linda terdiri dari sejumlah kecil operasi yang digabungkan dengan penyimpanan persisten yang disebut ruang tuple. Operasi ini ortogonal untuk bahasa pemrograman tertentu; mereka adalah bagian dari bahasa koordinasi yang dapat ditambahkan ke bahasa komputasi lainnya .Hasil penelitian Linda mengejutkan: dengan menggunakan penyimpanan objek bersama dengan sejumlah kecil operasi sederhana, Anda dapat dengan mudah menerapkan kelas besar masalah paralel dan terdistribusi menggunakan teknik yang mengurangi banyak perangkap dalam membangun sistem jaringan. Dengan kata lain, sistem berbasis ruang tidak hanya sederhana (hanya membutuhkan sedikit operasi), tetapi juga ekspresif (membantu diri mereka sendiri dengan baik untuk memecahkan banyak masalah terdistribusi).

Karya Dr. Gelernter menginspirasi layanan JavaSpaces Sun, dan juga memengaruhi desain komponen pencarian dan penemuan dari teknologi inti Jini (yang akan Anda lihat saat rangkaian Jiniology berkembang). Sementara JavaSpaces mewarisi model ruang dari Linda, desainer JavaSpaces telah memperbarui model dengan cara yang signifikan, memanfaatkan kekuatan objek Java, Jini, RMI, dan serialisasi objek.

JavaSpaces dalam konteks

Deskripsi kami sejauh ini sedikit abstrak, jadi mari pertimbangkan beberapa contoh aplikasi terdistribusi nyata yang dapat Anda modelkan sebagai proses pertukaran objek melalui ruang.

Sistem obrolan

Pertimbangkan sistem obrolan multipengguna sederhana, di mana spasi berfungsi sebagai area obrolan yang menampung semua pesan yang membentuk diskusi. Untuk berbicara, peserta menitipkan objek pesan ke ruang angkasa. Semua anggota obrolan menunggu objek pesan baru muncul, membacanya, dan menampilkan isinya. Kedatangan terlambat dapat memeriksa objek pesan yang ada di ruang untuk meninjau diskusi sebelumnya. Faktanya, karena ruangnya tetap, peserta baru dapat melihat diskusi lama setelah semua orang pergi, dan peserta bahkan dapat kembali nanti untuk melanjutkan percakapan yang mereka tinggalkan. Daftar peserta obrolan juga dapat disimpan di ruang dan diperbarui setiap kali seseorang bergabung atau meninggalkan percakapan.

Hitung server

Sekarang pertimbangkan untuk menganalisis data teleskop radio waktu nyata untuk tanda-tanda kehidupan di luar bumi (seperti yang dilakukan proyek SETI @ home). Data tersebut sangat banyak, dan menganalisanya adalah pekerjaan intensif secara komputasi yang sangat cocok untuk komputasi paralel oleh jaringan komputer - dengan kata lain, "server komputasi". Menggunakan teknologi JavaSpaces, serangkaian tugas - misalnya, satu tugas per potongan data yang perlu dianalisis - ditulis ke dalam ruang. Setiap komputer yang berpartisipasi mencari ruang untuk tugas, menghapusnya, menyelesaikan pekerjaan komputasi yang diperlukan, mengembalikan hasilnya ke ruang, dan kemudian melanjutkan untuk mencari lebih banyak tugas. Pendekatan ini berskala secara alami: ia bekerja dengan cara yang sama apakah ada 10 komputer atau 1.000. Pendekatan ini juga memberikan keseimbangan beban alami , karena setiap pekerja mengambil pekerjaan sebanyak yang dapat ditangani dalam waktu tertentu, dengan komputer yang lambat melakukan lebih sedikit pekerjaan dan komputer cepat melakukan lebih banyak.

Sistem broker

Sebagai contoh ketiga, pertimbangkan sistem lelang online yang mempertemukan pembeli dan penjual barang dan jasa. Misalkan Anda, sebagai calon pembeli, mendeskripsikan barang (seperti mobil) yang ingin Anda beli dan harga yang bersedia Anda bayarkan, masukkan informasi tersebut ke dalam entri, dan tulis entri ingin-beli yang dihasilkan. ke luar angkasa. Pada saat yang sama, calon penjual terus memantau ruang untuk kedatangan entri yang ingin dibeli yang cocok dengan item dalam inventaris mereka. Misalnya, dealer Mazda memantau ruang untuk entri yang menggambarkan Mazda, sementara dealer mobil bekas memantau ruang untuk semua permintaan mobil bekas. Ketika permintaan yang cocok ditemukan dan dibaca, penjual potensial menulis entri penawaran ke ruang, menyatakan harga penawaran. Sebagai calon pembeli, Anda terus memantau ruang untuk tawaran atas permintaan Anda yang belum terselesaikan, dan,ketika Anda menemukan satu yang dapat diterima, Anda menghapus tawaran dan menghubungi penjual (mungkin melalui ruang melalui entri lain).

Ringkasan singkat tentang API

Sekarang saatnya memperkenalkan JavaSpaces API. Seperti yang telah kami katakan, itu sederhana; sebenarnya, di sisa artikel ini kami akan membahas semua yang perlu Anda ketahui (kecuali beberapa detail kecil) tentangnya. Namun, sebelum kita menjelaskan JavaSpaceantarmuka dan metodenya, pertama-tama kita perlu membicarakan tentang entri.

Entri

Objek yang disimpan dalam ruang disebut

masuk.

Untuk menjadi entri, sebuah objek hanya perlu mengimplementasikan

Entry

antarmuka. Sebagai contoh, mari kita tentukan entri pesan yang dapat Anda tulis ke dalam spasi:

impor net.jini.core.entry.Entry;

public class Message mengimplementasikan Entry {public String content;

// pesan publik konstruktor no-arg () {}}

Di sini kami telah mendefinisikan Messagekelas dengan bidang string yang akan menampung konten pesan. Karena kami ingin menggunakan kelas ini dengan spasi, kami perlu mengimplementasikan antarmuka net.jini.core.entry.Entry, yang ditemukan dalam paket net.jini.core.entry. Penting untuk diketahui bahwa itu Entryadalah antarmuka penanda; dengan kata lain, antarmuka tidak berisi konstanta atau metode dan oleh karena itu tidak memerlukan pekerjaan khusus untuk diterapkan, selain menambahkan implements Entrydefinisi kelas Anda.

Selain mengimplementasikan Entryantarmuka, ada beberapa konvensi lain yang harus diikuti oleh entri kita. Kami akan berbicara lebih banyak tentang alasannya di artikel selanjutnya, tetapi untuk saat ini kami hanya akan melihat garis besarnya. Entri harus memiliki konstruktor publik yang tidak membutuhkan argumen (yang disebut no-arg konstruktor); persyaratan ini berasal dari serialisasi yang mendasari yang terjadi ketika entri ditransfer masuk dan keluar dari spasi. Perhatikan bahwa definisi kami Messageberisi konstruktor no-arg. Ketentuan lain adalah bahwa bidang entri harus dideklarasikanpublic; ini memungkinkan proses lain menemukan entri Anda di spasi melalui pencarian asosiatif, berdasarkan nilai bidang tersebut. Konvensi ketiga adalah bahwa bidang entri harus berisi referensi ke objek, bukan tipe primitif (yaitu, jika Anda perlu mendefinisikan bidang tipe primitif seperti int, Anda harus menggunakan kelas pembungkus yang sesuai Integer). Untuk memastikan Anda mencakup semua basis Anda dalam menentukan entri, kami merekomendasikan Anda untuk merujuk ke Prinsip, Pola, dan Praktik JavaSpaces, atau Spesifikasi JavaSpaces Sun Microsystems untuk detailnya. Kami juga akan, seperti yang disebutkan, menyentuh beberapa poin penting di artikel selanjutnya.

Selain persyaratan ini, entri seperti kelas Java lainnya; Anda dapat membuat instance, menjalankan metodenya, dan menetapkan nilai ke bidang publiknya. Sekarang kita telah mendefinisikan Messagekelas entri, mari kita lihat operasi apa yang tersedia untuk berinteraksi dengan entri dalam spasi.

Antarmuka JavaSpace

Untuk berinteraksi dengan ruang, Anda perlu mendapatkan akses ke objek yang mengimplementasikan JavaSpaceantarmuka. Ada banyak cara untuk mendapatkan akses ke objek semacam itu (Anda dapat, misalnya, menggunakan pencarian Jini atau registri RMI) dan kami akan membahas detailnya di artikel berikutnya. Untuk saat ini, kami akan berkonsentrasi pada JavaSpaceantarmuka itu sendiri.