Mendesain Event-Driven Architecture — Part 5

Pentingnya Stateful Proses dan Stateful Service

D. Husni Fahri Rizal
The Legend
4 min readOct 31, 2021

--

Gaya pemrograman imperatif atau berdasarkan request-response merupakan gaya pemrograman yang sudah sangat tua. Popularitasnya sampai saat ini masih tinggi dan masih cukup banyak yang menggunakan.

Ketika aplikasi mainstream mulai memperkenalkan aplikasi terdistribusi pada era tahun 1980-an sampai 1990, pada aplikasi berbasis domain pun mulai memperkenalkan pendekatan aplikasi terdistribusi . Sebut aja EJB (enterprise java bean) dan CORBA yang berjaya pada zamannya sehingga membuat aplikasi terdistribusi mudah untuk diakses walaupun cukup susah dalam implementasinya.

Sebenarnya perbaikan dan perkembangan teknologi aplikasi terdistribusi ini terus berlanjut sejak saat EJB berjaya. Sebut saja teknologi gRPC, Finagle, reactive programing (ReactiveX dan Reactor 3) yang telah menambahkan pola asinkron pada gaya pemrograman berbasis request -response.

Akan tetapi, pola pikir dan pendekatan di atas kurang bagus ,tidak cocok, kurang produktif, dan kurang tangguh, ketika diterapkan pada konsep aplikasi terdistribusi atau lebih detil nya microservices. Dua gaya pemrograman yang ternyata lebih cocok untuk aplikasi berbasis service pada microservices adalah gaya pemrograman berbasis data flow dan fungsional (DataFlow and Functional Programming).

Terdapat analogi yang bagus dan berguna pada functional programming dan dataflow yakni state. State ini tidak akan berubah di tempatnya, melainkan berubah dan bermutasi dari fungsi ke fungsi lainnya. Hal ini sangat cocok dengan cara proses stream beroperasi. Jadi, hampir semua keunggulan dari fungsional programming dan data flow dapat digunakan juga pada streaming proses.

Stateful dan Stateless

https://www.xenonstack.com/insights/functional-programming

Berbicara mengenai state maka terdapat duac cara implementasi state ini, yakni stateful dan stateless. State dalam sistem komputer adalah data mengenai keadaan program saat itu. Keadaan di sini bisa berupa apapun tergantung pada konteks program tersebut.

Contohnya, jika aplikasi berupa game, maka state bisa saja jumlah uang yang player kamu miliki, posisi player, dan item apa saja yang dimiliki saat ini. Jika aplikasimu berupa website, state bisa jadi data yang menunjukkan keadaan kamu sedang login.

Aplikasi dikatakan Stateful ketika aplikasi tersebut menyimpan state. Pada aplikasi bersifat state ini, ada data tentang penggunaan aplikasi yang perlu disimpan. Contoh yang paling mudah ditemui adalah aplikasi database seperti MySQL, Postgre, dan MongoDB. Tentu saja aplikasi database haruslah stateful karena kegunaan aplikasi tersebut adalah untuk menyimpan data.

Stateful adalah disaat informasi yang diberikan sebelumnya disimpan dan mempengaruhi konten/informasi/data yang akan diberikan setelahnya.

Adapun Stateless ketika aplikasi tersebut tidak menyimpan state. Tidak ada data yang berkaitan dengan penggunaan aplikasi yang disimpan permanen. Tidak ada data penggunaan yang disimpan dan tidak ada data yang berubah karena penggunaan. Berapa kalipun pengguna mengakses server tersebut, data tersebut akan tetap setia untuk muncul.

Stateles adalah disaat informasi yang diberikan sebelumnya tidak disimpan dan tidak mempengaruhi konten/informasi/data yang akan diberikan setelahnya.

Berikut adalah hal-hal yang terkait stream proses, functional programing, dan state.

  1. Stream proses memiliki kemampuan bawaan untuk paralel proses.
  2. Stream proses secara alami cocok untuk membuat dataset yang ter-cache dan menjaga data tersebut tetap up to date. Hal seperti ini sangat cocok untuk sistem dimana data dan code terpisahkan oleh jaringan.
  3. Proses streaming lebih tangguh daripada pendekatan biasa sama seperti availability yang dibuat secara runtime dan program yang dijalankan secara bebas dan tidak terikat.
  4. Sebuah fungsi dari stream proses mudah dipikirkan dan diperkirakan daripada program biasa. Sebuah fungsi yang benar-benar murni akan terbebas dari segala efek samping. Adapun pada fungsi stateful kita harus menghindari state yang dapat berubah dan di share.
  5. Proses streaming memungkinkan menjalankan polyglot sistem baik secara bahasa pemrograman ataupun secara datastore.
  6. Biasanya fungsional programming ditulis dalam tingkat abstraksi yang tinggi sehingga membuat kita lebih mudah mengerti.

Fungsional programming memiliki juga kelemahan. Salah satunya pada FP kita harus melakukan negosiasi ketika mendapatkan hambatan pada waktu berhadapan dengan banyak element prosedural atau statefull element seperti files sistem dan jaringan.

Pada pendekatan yang sama, sistem streaming kita harus diterjemahkan sebagai request-response style atau REST. Dengan demikian kita harus menghubungkan antara sinkron dan asinkron proses. Pada hal ini maka pendekatan menggunakan message broker sangat membantu sehingga kita dapat mengimplementasikan pada sistem REST tetapi perilaku sistem di sekitar core bersifat event driven atau stream proses.

Membuat Stateful Service

Terdapat pemahaman yang masih dianut sampai sekarang bahwa membuat sebuat sistem yang stateless itu sangat baik. Service yang stateless akan di load atau dijalankan dengan tidak ada ketergantungan terhadap data dan kita dapat melakukan horizontal scaling dengan mudah.

Akan tetapi, pada kenyataannya tidak ada sistem atau service yang full stateless. Sebagai contoh sebuah web aplikasi pada dasarnya dapat dibuat stateless tapi keperluan sistem membuat web aplikasi harus mengelola session, data orang yang login di database, menjaga performance dengan pengelolaan cache. Semua itu membuat web aplikasi yang asalnya stateless mau tidak mau harus diurus secara stateful.

Streaming platform mendekati keadaan di atas dan mengatur state dengan cara yang sedikit berbeda. Kita coba ingat kembali mengenai event yang telah dibahas di artikel sebelumnya. Event membawa fakta yang sangat menyerupai mesin assembly yang bergerak. Dengan demikian, untuk berbagai kasus event akan mentriger semua proses yang mengandung semua data yang diinginkan seperti dataflow program yang telah dijelaskan di atas. Jika yang kita butuhkan adalah memvalidasi isi message maka event stream adalah jawabannya.

Stateful stream proses engine seperti kafka stream API sudah melangkah lebih jauh. Kafka stream API ini menjamin semua data yang dibutuhkan untuk komputasi telah dimasukan ke dalam API terlebih dahulu.

Mengapa kita membutuhkan service yang stateful dan sepertinya bertolak belakang sama intuisi?Jawabannya hampir sama dengan kebutuhan kita menggunakan cache teknologi. Akan tetapi, agar lebih jelas akan kita jelaskan dengan lebih detail di artikel selanjutnya. Stay Tune!!!.

References

  1. Adam Bellemare. 2020. Building Event-Driven Microservices. USA: O’Reilly Media, Inc.
  2. Escoffier, Clement. 2017. Building Reactive Microservices in Java. USA: O’Reilly Media, Inc.
  3. Stopford, Ben. 2018. Designing Event-Driven System. USA: O’Reilly Media, Inc.
  4. Boner, Jonas. 2016. Reactive Microservice Architecture. USA: O’Reilly Media, Inc.

--

--

D. Husni Fahri Rizal
The Legend

Engineering Leader | Start-Up Advisor | Agile Coach | Microservices Expert | Professional Trainer | Investor Pemula