Distributed System merupakan salah satu arsitektur aplikasi yang populer diterapkan saat ini karena mendukung skalabilitas (scalability) dan ketersediaan (high availability). Arsitektur microservices merupakan salah satu bentuk implementasi dari distributed system, dimana sebuah aplikasi enterprise dibagi-bagi menjadi modul-modul yang independen yang memiliki fungsi spesifik. Setiap modul ini disebut dengan microservice, di dalamnya memiliki database yang khusus sesuai dengan tanggung jawab dari modul tersebut (single bounded context).

Microservice A tidak dapat mengakses langsung data dari microservice B tanpa melalui endpoint yang telah disediakan oleh microservice B, dan sebaliknya. Hal ini dapat akan menjadi tantangan ketika kita membutuhkan laporan yang datanya merupakan hasil penggabungan dari kedua microservice tersebut atau lebih.

Menurut Mark Richards, terdapat empat teknik dalam membuat laporan dalam arsitektur microservice, yaitu database pull model, HTTP pull model, batch pull model, dan event-based push model. Ketiga teknik pertama melakukan pengambilan data dari database microservice lain, ini merupakan sebuah ANTIPATTERN yang dinamakan “reach-in reporting”. Ketiga ini merupakan teknik yang harus dihindari dan akan dibahas lebih dalam sebelum mengakibatkan masalah lebih lanjut.

Isu utama dalam pembuatan laporan pada microservice architecture

Terdapat dua masalah yaitu pertama, bagaimana mendapatkan laporan secara tepat waktu dan tetap mempertahankan bounded context pada microservice dan datanya?

Antipattern 1: Database pull model

Terdapat sebuah microservice yang secara langsung mengakses database dari microservice lainnya (Gambar 1).

Gambar 1: Database pull model

Metode ini merupakan cara termudah dan tercepat untuk mendapatkan laporan dalam waktu yang tepat. Namun ini berdampak pada coupling / ketergantungan yang sangat tinggi antara microservices dan reporting service. Metode ini biasanya diimplementasikan dengan mudah pada shared database, dimana beberapa aplikasi berbagi database. Namun ini berarti integritas data juga dapat diragukan karena setiap microservice dapat berubah, dan terjadilah ketergantungan dalam melakukan modifikasi, serta ini juga merusak prinsip bounded context pada arsitektur microservices.

Antipattern 2: HTTP pull model

Teknik HTTP pull model ini dapat menghindari isu pada antipattern 1 yaitu ketergantungan dan pelanggaran bounded context. Teknik ini tidak mengakses database dari microservice secara langsung, tetapi reporting service akan memanggil data menggunakan endpoint microservices sumber (biasanya menggunakan RESTful HTTP call) (Gambar 2).

Gambar 2: HTTP pull model

Teknik ini terbilang lambat dan kompleks ketika kita memerlukan laporan dengan kebutuhan khusus. Sebagai contoh reporting service ini harus melakukan join data dari dua atau lebih sumber data dengan volume yang cukup besar. Selain itu volume data yang besar juga menjadi isu tersendiri ketika melakukan transfer melalui simple HTTP call.

Antipattern 3: Batch pull model

Teknik ketiga ini merupakan workaround dari antipattern 1, yaitu dengan mengambil data secara bertahap (batch). Umumnya batch job ini dilakukan menggunakan agent secara periodik di waktu tertentu yang telah ditentukan dan akan melakukan agregasi terkait perubahan data (tambah, hapus, rubah) dan dimasukkan ke reporting database atau data warehouse.

Gambar 3: Batch pull model

Teknik ini memiliki masalah yang sama dengan database pull model yaitu terdapat batch data upload service akan mengakses database microservices lain secara langsung.

Event-based model (Asynchronous event push)

Solusi dari antipattern reach-in pada perancangan sistem laporan ini adalah dengan event-based push model. Teknik ini disebut juga data pump, yaitu data dipompa ke reporting service yang membutuhkan. Pengiriman dilakukan dengan menggunakan event yang berisi data (message) secara asynchronous yang nanti pada akhirnya (eventually) akan diterima oleh reporting service (Gambar 4).

Gambar 4: Event based push model

Implementasi teknik ini cukup kompleks, namun ini akan mempertahankan prinsip bounded context dari microservices lain serta data akan terkirim dalam waktu yang relatif cepat. Terdapat kontrak antara data capture service dengan microservices yang harus disepakati yaitu topik event-nya.

Komparasi kelebihan dan kekurangan dari keempat teknik

Gambar 4. Komparasi kelebihan dan kekurangan dari keempat teknik

Pada Gambar 4, database pull method memiliki ketepatan waktu yang sangat tinggi (timeliness of data), namun melanggar prinsip bounded context. HTTP pull model mempertahankan bounded context, namun memiliki isu dengan waktu dan volume data. Batch pull model merupakan pola yang paling kurang baik, karena ketepatan waktu yang rendah dan melanggar bounded context. Sedangkan event-based push model ini memaksimalkan ketepatan waktu dan juga mempertahankan bounded context. Namun secara effort dalam membangun dengan event-based push model ini relatif lebih kompleks dibanding yang lain.

Sumber Referensi:
https://www.oreilly.com/library/view/microservices-antipatterns-and/9781492042716/ch04.html
https://medium.com/@muneeb.ahmed20/building-a-reporting-service-in-microservice-architecture-8d5bf3b90fb7