Messaging and Event Driven Architecture


Overview

Messaging adalah salah satu metode komunikasi antara software komponen atau aplikasi. Messaging client dapat mengirimkan dan menerima pesan dari messaging client yang lain. Dengan messaging komunikasi terdistribusi dapat di lakukan. Message receiver tidak harus available saat message sender mengirimkan pesan. Message Sender mengirimkan pesan ke destination (lokasi dimana message tersebut dikirimkan) yang terdapat di messaging agent, saat receiver available messaging agent mengirimkan pesan tersebut ke receiver.

Messaging ini benar benar loosely coupled, sender tidak berinteraksi langsung dengan receiver, sender tidak perlu tahu menahu tentang receiver ataupun sebaliknya. Yang menjadi kontrak/yang harus diketahui oleh sender dan receiver adalah message format dan destination.

messaging itu asynchronous (fire and forget) , sender hanya mengirimkan message ke destination. sender tidak harus harus menunggu message tersebut selesai proses oleh receiver, dan receiver tidak harus available saat pesan tersebut di kirim. Misalkan aplikasi receiver down, receiver akan tetap mendapat message setelah aplikasi receiver available.

Terdapat dua messaging pattern:

  1. Point to Point: Sender hanya mengirimkan message ke satu receiver
  2. Publish and Subscribe: publisher/sender mempublish message ke banyak subscriber/receiver. Jika ada subscriber yang baru masuk, subscriber cukup mensubscribe destination, tidak ada perubahan terhadap publisher. Saat publisher mengirimkan message lagi maka subscriber yang baru secara automatis akan mendapatkan message tersebut.

Real World Implementation

Kebanyakan eksekusi proses dalam software dilakukan secara sequential dan juga synchronous. Misalkan proses create Purchase Order, input proses nya adalah POCommand.

  1. Eksekusi POService men transform POCommand menjadi Domain model PO, rubah status PO menjadi created
  2. Eksekusi EmailService untuk mengirimimkan email notification ke manager
  3. Eksekusi ServiceNotifikasi untuk mempublish notifikasi ke webiste, jadi setiap kali user membuka aplikasi akan muncul notifikasi approval terhadap notifikasi yang baru di create.

Bayangkan apa yang terjadi bila tiga proses di atas di eksekusi secara synchronous. Ketika user submit POCommand, aplikasi harus menunggu POService menyimpan data PO ke storage, memanggil service email untuk mengirimkan email notifikasi. Saat email service di eksekusi email melakukan open koneksi, otentikasi ke email server, lalu mengirimkan email ke mail server. Setelah itu lanjut dengan memanggil service NotificationSrevice untuk menghandle open database connection, insert data ke tabel notifikasi. Long chain proses execution right ? ditiap proses harus menunggu proses selesai, lalu melanjutkan eksekusi proses lain. Waktu yang dibutuhkan untuk eksekusi proses lama, terdapat locking proses, out memory exception karena banyak proses yang di hold datanya juga ikut di hold di memory. Hal ini adalah mimpi buruk, user bakal sering complain dan bilang `koq aplikasinya lambat ya ?, koq aplikasinya sering out memory exception ya `.

Secara bisnis dan arsitektur proses sending email dan notifikasi sebenarnya tidak harus satu sequence. Asynchronous adalah solusi terbaik untuk memecahkan masalah diatas. Solusi asynchronous benar-benar loosely couple, setiap service meproses sesuai dengan context nya masing-masing. Context kerjaan POService itu memproses Create PO, memproses Update PO, memproses Cancel PO. Untuk mentriger email notification sebenarnya bukan tugas POService, apa lagi menginvoke NotificationService untuk menyimpan notifikasi ke tabel notification. Kerjaan POService memproses PO dan , mempublish event terhadap PO yang di proses tersebut. Misalnya memproses POCreateCommand setelah itu mempublish event POCreated, meproses POCancelCommand setelah itu mempublish event POCanceled. Event-event itu adalah message yang di publish oleh service, dan di consume oleh service yang interest terhadap event itu. Mislakan EmailService, ketikan service tersebut menerima event POCreated, service tersebut akan mengirimkan email notification. Saat NotificationService mendapat event POCreated akan meninsert tabel notification, agar saat manager membuka aplikasi akan langsung mendapat notifikasi ada PO yang harus di approve oleh manager tersebut. Dengan messaging tidak akan terjadi locking proses yang terlalu lama, memory yang digunakan juga lebih efisien karena di proses oleh masing-masing proses. Jika Email Service mati, atau Notification Service mati, tidak akan menggangu proses CreatePO.

Suatu saat ada permintaan untuk order statistik untuk mengidentifikasi product yang sering di order oleh customer. Jika menggunakan messaging, tinggal develop service order statstic yang interest terhadap event POCreate, setelah itu deploy service OrderStatistic. Jadi tidak akan menggangu bisnis yang sedang berjalan, tidak ada down aplikasi dan deploy ulang. Bayangan jika menggunakan sequential process execution, setelah develop OrderStatisticService, OrderService harus di rubah karena di order service harus meng invoke OrderStatisticService. OrderService harus di down, lalu di deploy OrderService yang terbaru. Jadi complecated, belum lagi alau ada keputusan kalau aplikasi ga boleh down, karena terlalu banyak transaksi didalamnya, kalau aplikasi down warung bisa-bisa jadi tutup, hahaha.

Banyak contoh penggunaan asynchronous messaging ini. Mislakan ada aplikasi penerimaan mahasiswa baru, ketika calon mahasiswa di approve menjadi mahasiswa di universitas tersebut, aplikasi penerimaan mahasiswa baru mempublish event StudentApproved. Setelah itu terdapat service RegistrationAcademicInformationSystem yang automatis meregistrasi mahasiswa baru ke sistem informasi akadmik, RegistrationOnlineLibrary meregistrasi mahasiswa baru ke online library, EmailService mengirimkan email notifikasi yang berisi approval, dan default username dan password untuk mengakses sistem informasi akademik.

Kesimpulan

Banyak bisnis proses yang tidak harus di proses secara sequential

Gunakan messaging untuk scalabilitas sistem, miningkatkan performansi sistem, dan service loosely coupled

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s