Artikel KRATONBET
Node 01 / Platform Overview
KRATONBET # Event Driven Architecture Bikin Sistem Gaming Nggak Harus Saling Tunggu Buat Kerja
Ada banyak kejadian kecil yang berlangsung setiap detik di dalam sebuah sistem digital. Pengguna masuk ke akun data berubah notifikasi perlu dikirim atau sebuah proses baru selesai dikerjakan. Kalau setiap bagian aplikasi harus langsung memanggil bagian lain lalu menunggu jawabannya alur kerja bisa cepat menjadi panjang. KRATONBET kali ini masuk ke Event Driven Architecture yaitu pendekatan yang membuat sistem dapat bereaksi terhadap kejadian tanpa semua proses harus terus saling menunggu.
Cara berpikirnya cukup berbeda dari alur request dan response biasa. Sebuah layanan dapat memberi tahu bahwa sesuatu sudah terjadi lalu bagian lain yang membutuhkan informasi tersebut mengambil tindakan masing-masing. Dari sinilah muncul istilah event producer consumer message broker sampai asynchronous processing.
KRATONBET Mulai dari Sebuah Event
Event pada dasarnya adalah informasi bahwa sesuatu telah terjadi. Bentuknya bisa sederhana seperti pengguna berhasil login profil diperbarui atau sebuah pekerjaan selesai diproses.
Hal pentingnya adalah event menggambarkan kejadian yang sudah berlangsung. Sistem lain kemudian dapat menggunakan informasi tersebut untuk menentukan apakah mereka perlu melakukan pekerjaan tambahan.
Jadi satu kejadian bisa menjadi awal dari beberapa reaksi tanpa komponen pertama harus mengatur seluruh proses secara langsung.
Producer Cukup Mengabarkan Apa yang Terjadi
Komponen yang menghasilkan event biasa disebut producer. Tugasnya menerbitkan informasi mengenai sebuah kejadian.
Producer nggak selalu harus mengetahui siapa saja yang bakal menggunakan event tersebut. Ia cukup mengirimkannya melalui jalur yang sudah disediakan oleh arsitektur.
Pemisahan seperti ini membantu mengurangi hubungan langsung antarbagian sistem.
Consumer Menunggu Event yang Memang Dibutuhkan
Di sisi lain ada consumer. Komponen ini mendengarkan atau mengambil event yang relevan kemudian menjalankan pekerjaan berdasarkan informasi tersebut.
Satu event bisa mempunyai satu consumer atau beberapa consumer sekaligus. Semuanya tergantung kebutuhan aplikasi.
Misalnya sebuah kejadian dapat digunakan satu layanan untuk memperbarui catatan sementara layanan lain memakainya untuk menjalankan proses berbeda.
Producer dan Consumer Nggak Harus Kerja Bersamaan
Ini bagian yang membuat pendekatan event-driven menarik. Producer dapat menghasilkan event tanpa harus menunggu semua consumer menyelesaikan pekerjaannya pada saat yang sama.
Event dapat masuk ke infrastruktur messaging terlebih dulu lalu diproses sesuai mekanisme sistem.
Buat teknologi KRATONBET model tersebut membuat aliran kerja terasa lebih seperti estafet daripada satu antrean panjang yang semuanya harus menunggu dari awal sampai akhir.
Message Broker Jadi Perantara di Tengah
Producer dan consumer membutuhkan jalur untuk bertukar event. Salah satu komponen yang dapat digunakan adalah message broker.
Broker menerima pesan dari producer lalu membantu menyediakannya untuk consumer berdasarkan mekanisme yang digunakan.
Dengan adanya perantara producer nggak perlu mempunyai koneksi langsung ke setiap consumer yang ada di sistem.
Message Queue Bekerja Seperti Antrean Pekerjaan
Bayangkan ada seratus pekerjaan datang dalam waktu hampir bersamaan sementara worker hanya mampu menyelesaikan sebagian pada satu waktu. Daripada semuanya dipaksa berjalan sekaligus pekerjaan dapat masuk ke antrean.
Consumer kemudian mengambil pesan dari queue sesuai kapasitasnya. Setelah pekerjaan selesai pesan dapat dianggap sudah diproses sesuai mekanisme sistem.
Model seperti ini membantu menyerap lonjakan pekerjaan tanpa memaksa setiap proses selesai pada detik yang sama.
Asynchronous Processing Mengubah Cara Sistem Menunggu
Pada proses synchronous sebuah komponen biasanya mengirim permintaan lalu menunggu hasil sebelum melanjutkan langkah berikutnya.
Asynchronous processing memberi pilihan berbeda. Sebuah pekerjaan dapat diserahkan untuk diproses kemudian sementara bagian lain melanjutkan tugas yang memang tidak bergantung pada hasil tersebut.
Bukan berarti asynchronous selalu lebih bagus. Proses yang benar-benar membutuhkan jawaban langsung tetap cocok menggunakan komunikasi synchronous.
Nggak Semua Pekerjaan Cocok Dijadikan Event
Kesalahan yang gampang terjadi adalah menganggap semua komunikasi harus diubah menjadi event hanya karena arsitekturnya terdengar modern.
Ada proses yang membutuhkan hasil saat itu juga. Ada pula pekerjaan yang aman dijalankan beberapa saat setelah kejadian utama selesai.
Desain yang sehat menentukan batas tersebut berdasarkan kebutuhan bukan memaksakan satu pola untuk semua situasi.
Event Bisa Memicu Lebih dari Satu Reaksi
Salah satu karakter menarik dari event-driven adalah satu kejadian dapat menarik perhatian beberapa consumer.
Producer nggak harus memanggil layanan A lalu B lalu C satu per satu. Ia menerbitkan event kemudian consumer yang berkepentingan bereaksi melalui jalurnya sendiri.
Ketika nanti dibutuhkan fungsi baru sistem juga dapat menambahkan consumer baru tanpa selalu mengubah producer utama.
Kalau Consumer Lagi Sibuk Pesan Bisa Menunggu
Consumer mempunyai kapasitas. Ketika pekerjaan datang lebih cepat daripada kemampuan pemrosesan antrean dapat mulai bertambah.
Kondisi seperti ini biasa disebut backlog. Backlog kecil belum tentu masalah tetapi pertumbuhan yang terus berlangsung bisa menjadi tanda bahwa kapasitas consumer nggak cukup.
Monitoring panjang antrean akhirnya penting untuk mengetahui apakah pekerjaan masih diproses dalam batas yang diharapkan.
Consumer Bisa Ditambah Saat Beban Membesar
Kalau jenis pekerjaan memungkinkan beberapa consumer dapat bekerja terhadap antrean yang sama sehingga pemrosesan dibagi.
Pendekatan ini memungkinkan kapasitas worker ditambah ketika volume pekerjaan meningkat.
Tetapi scaling consumer tetap harus mempertimbangkan hal seperti urutan pesan kapasitas sistem lain dan apakah pekerjaan aman diproses secara paralel.
Pesan Gagal Nggak Boleh Hilang Begitu Saja
Consumer bisa gagal memproses pesan karena berbagai alasan. Bisa ada gangguan sementara data yang tidak sesuai atau dependency lain yang sedang bermasalah.
Sistem messaging biasanya membutuhkan strategi untuk menghadapi kondisi tersebut daripada langsung membuang pekerjaan.
Salah satu pendekatan yang umum adalah mencoba kembali proses setelah kondisi tertentu terpenuhi.
Retry Memberi Kesempatan Kedua
Kalau kegagalan hanya sementara retry bisa menyelesaikan masalah tanpa campur tangan manual.
Tetapi retry juga nggak boleh dilakukan tanpa batas. Pesan yang memang selalu gagal bisa terus berputar dan menghabiskan resource.
Karena itu jumlah percobaan jeda antarpercobaan dan kondisi yang boleh di-retry perlu dirancang dengan jelas.
Dead Letter Queue Jadi Tempat Pesan Bermasalah
Setelah beberapa percobaan sebuah pesan mungkin tetap nggak dapat diproses. Daripada dibuang atau terus dicoba selamanya pesan tersebut dapat dipindahkan ke dead-letter queue.
Antrean ini memisahkan pesan bermasalah supaya tim dapat melakukan pemeriksaan tanpa menghentikan aliran pesan normal.
Dari sini penyebab kegagalan dapat dicari sebelum pesan diproses ulang atau ditangani menggunakan prosedur lain.
Satu Event Bisa Saja Sampai Lebih dari Sekali
Dalam sistem terdistribusi developer juga perlu memikirkan kemungkinan sebuah pesan diterima lebih dari sekali tergantung mekanisme delivery yang digunakan.
Kalau consumer langsung menjalankan tindakan tanpa perlindungan duplikasi bisa menghasilkan efek yang nggak diinginkan.
Karena itu consumer sebaiknya dirancang dengan pemahaman yang jelas mengenai model delivery sistem messaging yang digunakan.
Idempotency Membantu Menghadapi Pesan Duplikat
Idempotency berarti sebuah operasi dirancang sehingga pengulangan input yang sama tidak menghasilkan efek tambahan yang seharusnya hanya terjadi sekali.
Salah satu pendekatan adalah memberikan identitas unik pada event lalu mencatat event mana yang sudah selesai diproses.
Ketika pesan yang sama muncul kembali consumer dapat mengenalinya dan mengambil tindakan yang sesuai.
Urutan Event Bisa Menjadi Masalah Tersendiri
Beberapa pekerjaan tidak peduli event mana yang selesai lebih dulu. Pada proses lain urutan justru sangat penting.
Begitu ada banyak consumer yang bekerja paralel pesan yang dikirim lebih dulu belum tentu selalu selesai diproses lebih dulu.
Kalau aplikasi membutuhkan ordering ketat desain partitioning key urutan atau mekanisme pemrosesan perlu memperhitungkan kebutuhan tersebut.
Event Harus Membawa Informasi yang Jelas
Event yang terlalu minim bisa membuat consumer harus berkali-kali bertanya ke service lain. Sebaliknya memasukkan terlalu banyak informasi dapat membuat pesan berat dan memperbesar ketergantungan pada struktur data tertentu.
Karena itu format event perlu dirancang sebagai kontrak yang jelas. Nama event versi struktur data dan arti setiap field sebaiknya konsisten.
Saat sistem berkembang perubahan format juga perlu dikelola supaya consumer lama nggak langsung rusak.
Monitoring Harus Mengikuti Aliran Event
Pada arsitektur synchronous masalah sering terlihat ketika sebuah request langsung gagal. Di event-driven kegagalan bisa terjadi beberapa langkah setelah event pertama diterbitkan.
Tim perlu memantau jumlah event kecepatan consumer backlog error retry sampai isi dead-letter queue.
Kalau monitoring cuma melihat apakah server hidup masalah bisa tersembunyi sementara antrean terus menumpuk.
Event Driven Membuat Waktu Jadi Bagian Penting Sistem
Ketika pekerjaan tidak lagi harus selesai bersamaan waktu mulai mempunyai peran lebih besar. Sebuah event bisa diterbitkan sekarang lalu consumer memprosesnya beberapa saat kemudian.
Aplikasi perlu mengetahui proses mana yang boleh mempunyai jeda dan proses mana yang harus hampir real-time.
Dari sini target seperti processing delay dan umur backlog menjadi metrik yang lebih berguna daripada sekadar menghitung jumlah pesan.
KRATONBET Mengubah Sistem dari Saling Menunggu Jadi Saling Bereaksi
Tema KRATONBET kali ini punya pola yang benar-benar berbeda. Kita nggak membahas aplikasi yang terus memanggil bagian lain satu per satu tetapi sistem yang bereaksi terhadap kejadian.
Producer mengabarkan event message broker membantu mengalirkannya dan consumer menjalankan pekerjaan yang relevan. Kalau terjadi gangguan ada retry dead-letter queue dan mekanisme lain yang menjaga pesan nggak sekadar menghilang.
Hasilnya adalah arsitektur yang memungkinkan banyak pekerjaan bergerak melalui waktunya masing-masing. Bukan berarti setiap proses harus asynchronous tetapi bagian yang memang nggak membutuhkan jawaban langsung bisa dilepas dari kebiasaan saling menunggu. Buat sistem KRATONBET inilah inti Event Driven Architecture yaitu membuat kejadian menjadi pemicu sehingga bagian sistem dapat bekerja dan bereaksi sesuai tanggung jawabnya sendiri.