Google AppEngine adalah sebuah layanan Google, di mana kita bisa membuat aplikasi dalam Python atau Java (atau bahasa lain yang memakai virtual machine Java) di infrastruktur milik Google. Secara teori, Anda akan bisa melayani 5 juta pengunjung per bulan secara gratis. Anda bisa membayar ekstra jika ingin mendapatkan resource yang lebih banyak.
Saya akan menceritakan salah satu pengalaman development dengan google appengine, yaitu mengenai bagian pembuatan aplikasi yang scalable, dengan fokus pada DataStore. Menurut saya DataStore merupakan implementasi penyimpanan data yang menarik, yang berbeda dari database relasional yang umum dipakai saat ini.
Ilmu relational database dan SQL hampir tidak dipakai sama sekali di sini. Bahkan operasi Join yang sangat lazim di basis data tidak bisa dilakukan dengan DataStore. Lalu apa kelebihan DataStore? datastore memiliki aneka batasan yang memungkinan Google mendistribusikan data di berbagai server di seluruh dunia. DataStore diiimplementasikan di atas teknologi google yang sudah terbukti, yaitu BigTable.
Di DataStore kita bisa menyimpan banyak jenis entitas, setiap entitas punya satu atau lebih property. Sebuah property berupa nama dengan tipe tertentu, atau bisa merujuk ke entitas lain. Setiap entitas merupakan instance dari suatu Kind. Entitas dalam kind yang sama tidak selalu memiliki property yang sama.
Dari sudut pandang praktis: kind itu seperti tabel di database, entitas itu seperti row/record dalam sebuah tabel. Berbeda dengan model relasional, di mana jumlah kolom di setiap baris tabel harus sama, jumlah properti dalam sebuah entitas boleh tidak sama dengan entitas lain dengan kind yang sama.
Kita bisa menambah dan menghapus entitas, dan kita bisa melakukan query untuk mendapatkan entitas tertentu. Kita juga bisa mendapatkan sebuah entitas berdasarkan key entitas tersebut. Setiap entitas pasti punya key, jika tidak didefinisikan, maka sistem akan menciptakan sebuah key secara otomatis.
Berikut ini beberapa batasan query terhadap entitas: Query terhadap entitas tidak bisa menggunakan join. Query tertentu misalnya untuk pengurutan ascending/descending)membutuhkan indeks. Jadi kita tidak bisa mengquery “order by purchase_date desc” jika indeks purchase_date tidak ada. Sebuah query hanya bisa mengembalikan maksimum 1000 entitas. Query agregasi, seperti misalnya COUNT atau SUM tidak ada. Kita tidak bisa melakukan query yang berulang karena ada batasan waktu eksekusi untuk setiap request.
Jadi bagaimana kita bisa hidup dengan aneka batasan tersebut? Jawabannya adalah dengan berpikir panjang. Saya tidak akan membahas secara mendalam aneka hal yang berhubungan dengan DataStore, tapi mari kita ambil satu contoh: agregasi.
Sebuah query agregasi di RDBMS memiliki kompleksitas O(n) dengan n adalah jumlah data di tabel. Dalam suatu sistem dengan data yang terdistribusi, ini akan sangat menyulitkan, data harus di kumpulkan dari semua server untuk bisa menghitung agregasinya. Lalu bagaimana solusi yang baik? jawabannya adalah dengan memindah proses agregasi, yang tadinya dilakukan pada query, sekarang dilakukan ketika menyisipkan/menghapus data.
Tapi masalah lainnya adalah: kalau hanya punya satu akumulator/counter , maka entitas itu akan diakses terus menerus dan bisa menjadi bottleneck. Bagaimana solusinya? dengan sharding, yaitu dengan memecah entitas data menjadi beberapa entitas. Untuk mendapatkan total data, kita perlu mengquery dan menjumlahkan semua entitas.
Kedengarannya rumit? ya memang rumit. Tapi begitulah jika kita ingin membuat aplikasi yang scalable. Segala batasan DataStore akan memaksa kita berpikir agar aplikasi kita scalable.
Cara berpikir kebanyakan orang dalam mengelola data sudah sangat terpengaruh oleh cara berpikir RDBMS, padahal cara berpikir itu bukanlah satu-satunya cara, dan bahkan mungkin bukan cara terbaik untuk semua aplikasi.
DataStore ini apakah sejenis Object Oriented Data Base (OODB) atau bukan ya? Sepertinya mirip…
Google datastore ini gabungan dari berbagai pendekatan, ada sedikit OO di dalamnya, tapi tidak bisa disebut sebagai Object Oriented Database, banyak fitur OODB yang tidak ada di Google datastore. Datastore juga mendukung query seperti SQL, tapi bukan SQL.
Agak sulit menjelaskannya kalo belum dicoba. Coba aja, gratis kok. Bisa dicoba di komputer lokal, dan kemudian bisa di upload ke server Google.
Google App Engine ini menarik sekali. Saya sendiri sedang ngoprek-ngoprek fitur-fiturnya. Yang sedang saya coba-coba sekarang adalah bagaimana membuat semacam ThreadPool di GAE mengingat Threading tidak disupport oleh GAE. Ide saya adalah dengan mencoba menggunakan CronJob/Task sebagai pengganti thread.