Mendesain Event-Driven Architecture — Part 6

Stateful Proses dan Stateful Service pada Microservices

D. Husni Fahri Rizal
The Legend
4 min readNov 7, 2021

--

https://blog.harbur.io/demystifying-stateful-apps-on-kubernetes-by-deploying-an-etcd-cluster-b85bf8c16fea

Pada penjelasan sebelumnya yang berjudul Mendesign Event-Driven Architecture — Part 5 telah dibahas akan pentingnya Stateful Proses dan Stateful Service. Sekarang akan dijelaskan dengan lebih detil alasan dari pentingnya stateful service ini khususnya pada event-driven arsitektur.

Kita akan membahas dua contoh yaitu, event-driven dengan stateless dan event-driven dengan stateful.

Pendekatan Event Driven

Misalkan kita memiliki sebuah service yang bertugas mendengar event stream dari beberapa order dan mengirimkan konfirmasi email setelah customer beres melakukan pembelian.

Proses ini membutuhkan informasi mengenai data order dan data pembayaran yang terkait dengan order tersebut. Seperti kita ketahui bahwa email service ini dapat kita buat dengan berbagai cara.

Kita mulai dengan contoh email service ini di buat dengan cara event driven yang sederhana tanpa menggunakan streaming API. Terdapat dua skenario yaitu akan beraksi bedasarkan event order dan akan mencari data pembayaran yang sesuai atau sebaliknya akan beraksi berdasarkan event payment dan akan mencari data ordernya.

Event driven yang akan mecari data yang di butuhkan ( cara pertama)

Pada gambar di atas satu event stream akan di proses serta melakukan lookup atau pencarian data yang dibutuhkan secara langsung. Cara ini akan mengalami dua permasalahan yakni.

  1. Ada keperluan secara terus menurus dan konstan pecarian data ke service lain.
  2. Proses order dan payment akan di proses pada waktu yang hampir bersamaan sehingga ada kemungkinan proses order akan beres terlebih dahulu dari proses payment. Dengan demikian, ada kemungkinan kita harus melakukan bloking (mengunggu) sementara sebelum data payment tersedia di database.

Pendekatan Streaming- Stateless

Pendekatan streaming secara stateless akan menjawab permasalah di atas dengan cara sudut pandang yang berbeda.

Kita kan menyelesaikan permasalah di atas dengan pendekatan event driven tanpa ada proses melakukan pencarian dan menyelesaikan permasalahan pertama.

Kedua event akan di kirim secara sekaligus dan email service akan beraksi berdasarkan dua event tersebut. Stream proses di bagian email service akan melakukan buffer sampai kedua event ini di terima dan di join berdasarkan key tertentu lalu proses kirim email di lakukan.

Dengan cara ini juga tidak ada pemasalahan order atau payment yang datang lebih dulu serta menyelesaikan permasalahan kedua. Hal yang sangat penting ketika kita bekerja dengan proses asingkron adalah tidak ada jaminan semua event akan datang dengan urutan yang benar.

Sebenarnya pendekatan ini tidak terjadi secara murni stateless. Jika sitem di restart maka ada keperluan sistem harus load data buffer jika ada event yang belum terkirim.

Pedekatan Streaming Stateful

Terdapat kondisi dimana pada event stream masih terdapat proses pecarian data ke service lain atau pengayaan lainnnya. Sebagai contoh pada email service kita akan mengirimkan email dan membutuhkan data email address dari customer. Umumnya pedekatan yang digunakan adalah mencari dengan REST ke service Customer.

Event-driven stateless dengan masih ada look up ke cutomer service via REST

Umumnya proses yang terjadi yang banyak di gunakan adalah proses dengan diagram di atas. Akan tetapi, pendekatan streaming stateful akan memberikan solusi yang lebih bagus. Pendekatan streaming stateful dapat di lihat pada gambar di bawah ini.

Pada gambar di atas proses buffer di pindah ke dalam kafka Stream dan table Customer juga di replikasi ke dalam local table yang ada didalam Kafka Stream API. Penjelasan detil mengenai Kafka stream API akan kita coba jelaskan di artikel tersendiri.

Pendekatan streaming stateful memiliki beberapa kelebihan sebagai berikut.

  1. Service tidak lagi tergantung pada service lain dan tidak akan mengalami kondisi terburuk dari performance karena bergantung pada service lain.
  2. Service akan memproses event dengan lebih cepat karena setiap operasi dijalankan tanpa ada pemanginggal lewat jaringan.
  3. Service dapat melakukan pengelolaan data secara terpusat pada sistemnya karena memiliki data tersendiri secara local.

Adapun kekurangan dari streaming stateful adalah karena statefull maka ketika kondisi terburuk harus ada proses memuat data set ketika sistem dinyalakan kembali. Untuk dapat mengoptimalkan proses ketika kondisi terburuk ini sudah ada beberapa teknik dan pendekatan yang dapat diterapkan dan akan kita kaji lebih detil ketika pembahasan mengenai Kafka stream API.

Perlu di perhatikan baik itu statefull atau stateless stream jika ada keperluan untuk mengjaga keutuhan data transaksi dapat di gabungkan dengan Saga Pattern.

Apa Selanjutanya

Kita telah membahas mengenai bergunanya stateful event dan stream stateful proses. Di pembahasan selanjutnya kita akan membahas mengenai beberapa pattern yang termasuk kedalam Stateful Pattern. 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.

Sponsor

Membutuhkan kaos dengan tema pemrograman :

Kafka T-shirt

Elastic T-shirt

Dapat menghubungi The Legend.

--

--

D. Husni Fahri Rizal
The Legend

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