Sunday, December 18, 2016

Implementasi Full-text Search dengan ElasticSearch dan Firebase

Kembali lagi pada sesi pembahasan mengenai implementasi Firebase pada blog Nostra ini. Seperti yang pernah dibahas pada beberapa tulisan sebelumnya, Firebase merupakan sebuah layanan Backend as a Service (Baas) yang sudah diakuisisi oleh Google. Oke, kalau Firebase merupakan layanan BaaS, lalu apakah kita masih perlu sebuah server dengan Backend yang kita kembangkan sendiri? Jawabannya adalah tergantung pada desain/arsitektur aplikasi yang dikembangkan.

Pada dasarnya Firebase dapat diimplementasikan dengan tiga pilihan cara, sesuai dengan tulisan pada artikel milik Firebase. Berdasarkan artikel tersebut, bagaimana caranya untuk mengimplementasikan ElasticSearch (ES) bersamaan dengan Firebase? dan apa sebenarnya ES itu sendiri? Pada tulisan ini, kami akan mencoba untuk menjelaskan secara singkat mengenai ES dan bagaimana mengimplementasikannya dengan Firebase.

Pertama mari kita bahas terlebih dahulu mengenai ES. Secara sederhana ES adalah sebuah open source search engine yang dibangun diatas Apache Lucene. ES juga dapat dikatakan sebagai sebuah RESTful search engine, karena ES berkomunikasi dengan menggunakan RESTful API. Secara arsitektur ES terdiri atas node dan cluster sehingga ES sebaiknya dipasang pada Virtual Machine (VM) tersendiri, sehingga ES dapat memiliki performa maksimal. Apakah sudah terbayang mengenai apa itu ES? Jika belum, maka sebaiknya melakukan eksperimen dengan mengikuti panduan resmi milik ES.

Apabila ES dipasang sebagai sebuah VM tersendiri, lalu bagaimana ES dapat diimplementasikan bersama dengan Firebase? berdasarkan artikel yang telah diberikan pada bagian awal tulisan ini, maka implementasi tersebut berada pada arsitektur kedua, yang dapat dilihat pada gambar berikut.


Lalu dengan arsitektur tersebut, dimana letak VM dari ES seperti yang telah disebutkan?
.
.
.
.
.
.
.
Benar sekali, berdasarkan arsitektur tersebut maka tidak terdapat VM terpisah dari ES, melainkan ES dipasang langsung pada VM yang sama dengan server. Apabila menggunakan arsitektur tersebut maka ES dan Backend (BE) dari aplikasi kita akan berada pada satu VM yang sama. Hal tersebut sebaiknya dihindari, kenapa? Karena apabila salah satu dari ES ataupun BE aplikasi kita mengalami workload yang berlebihan, maka hal tersebut akan saling mengacaukan performa satu sama lainnya. Oleh karena itu sebaiknya ES dipasang pada VM yang terpisah.

Lalu?
.
.
.
.
.
.
.
Jika kita mengimplementasikan BE dan ES pada dua VM yang berbeda, maka arsitektur dari aplikasi kita kurang lebih akan seperti pada gambar berikut.


Berdasarkan arsitektur tersebut, maka ES akan berkomunikasi secara langsung dengan BE, sedangkan BE juga akan berkomunikasi dengan Firebase. Mengapa kita menggunakan arsitektur model kedua pada artikel diatas? Kenapa bukan arsitektur ketiga? Good questions.

Alasannya adalah karena pada implementasi ini BE akan bersikap sama seperti Fronted (FE), yaitu BE akan me-listen pada node di Firebase. Dengan implementasi tersebut maka kita akan menyimpan konfigurasi search query dan juga search request serta search result pada Firebase Real-time Database seperti pada contoh di bawah.


Seperti yang dapat dilihat, secara realtime Firebase akan mencatat search request yang selanjutnya akan dibaca oleh BE dan kemudian dilemparkan kepada ES untuk melakukan pencarian. Implementasi tersebut dapat dilakukan dengan beberapa tahapan, antara lain:

1. Sinkronisasi data antara Firebase dengan ES yang dapat dilakukan dengan memanfaatkan listener terhadap node yang akan dilakukan pencarian, seperti pada contoh berikut.

2. Memasang listener pada node search request, sehingga setiap ada input pencarian maka BE akan langsung melemparkan query tersebut pada ES untuk mencari data yang dimaksud. Contoh implementasi pada tahap ini dapat dilihat pada gambar berikut.

3. Setelah terdapat pencarian pada node search request, maka langkah selanjutnya adalah melakukan proses pencarian pada ES berdasarkan masukan pada node tersebut. Karena search query sudah kita simpan pada Firebase Real-time Database, maka implementasi pencarian pada ES dapat kita implementasikan seperti pada contoh berikut.

4. Ketika proses pencarian pada ES telah selesai, maka BE akan mengembalikan hasil pencarian ES pada node search result di Firebase seperti pada contoh implementasi berikut.

5. Selanjutnya pada sisi Frontend (FE) juga akan memasang listener pada node search result sehingga ketika BE mengembalikan hasil pencarian pada Firebase maka FE akan langsung mendapatkan hasil tersebut.


Bagaimana? semoga tulisan ini dapat membantu kalian yang ingin mencoba untuk mengimplementasikannya. Good luck and have a nice app!


Sampai berjumpa pada tulisan-tulisan berikutnya.






P.S.
Contoh implementasi lain dari ElasticSearch dengan Firebase dapat dilihat pada link ini.


Referensi:
https://www.elastic.co/guide/en/elasticsearch/guide/current/intro.html
https://qbox.io/blog/what-is-elasticsearch
http://stackoverflow.com/questions/671118/what-exactly-is-restful-programming

No comments:

Post a Comment