{"id":7969,"date":"2020-12-17T13:16:38","date_gmt":"2020-12-17T06:16:38","guid":{"rendered":"http:\/\/binus.ac.id\/knowledge\/?p=7969"},"modified":"2020-12-17T13:23:30","modified_gmt":"2020-12-17T06:23:30","slug":"membangun-sistem-pelaporan-pada-distributed-system","status":"publish","type":"post","link":"https:\/\/binus.ac.id\/knowledge\/2020\/12\/membangun-sistem-pelaporan-pada-distributed-system\/","title":{"rendered":"Membangun Sistem Pelaporan pada Distributed System"},"content":{"rendered":"<p><em>Distributed System<\/em> merupakan salah satu arsitektur aplikasi yang populer diterapkan saat ini karena mendukung skalabilitas <em>(scalability)<\/em> dan ketersediaan (<em>high availability<\/em>). Arsitektur <em>microservices<\/em> merupakan salah satu bentuk implementasi dari <em>distributed system<\/em>, dimana sebuah aplikasi <em>enterprise<\/em> dibagi-bagi menjadi modul-modul yang independen yang memiliki fungsi spesifik. Setiap modul ini disebut dengan <em>microservice,<\/em> di dalamnya memiliki <em>database<\/em> yang khusus sesuai dengan tanggung jawab dari modul tersebut (<em>single bounded context<\/em>).<\/p>\n<p><em>Microservice<\/em> A tidak dapat mengakses langsung data dari <em>microservice<\/em> B tanpa melalui <em>endpoint<\/em> yang telah disediakan oleh <em>microservice<\/em> B, dan sebaliknya. Hal ini dapat akan menjadi tantangan ketika kita membutuhkan laporan yang datanya merupakan hasil penggabungan dari kedua <em>microservice<\/em> tersebut atau lebih.<\/p>\n<p>Menurut Mark Richards, terdapat empat teknik dalam membuat laporan dalam arsitektur <em>microservice,<\/em> yaitu <em>database pull model, HTTP pull model, batch pull model,<\/em> dan <em>event-based push model<\/em>. Ketiga teknik pertama melakukan pengambilan data dari <em>database microservice<\/em> lain, ini merupakan sebuah <em><strong>ANTIPATTERN<\/strong><\/em> yang dinamakan <strong><em>&#8220;reach-in reporting&#8221;.<\/em><\/strong> Ketiga ini merupakan teknik yang harus dihindari dan akan dibahas lebih dalam sebelum mengakibatkan masalah lebih lanjut.<\/p>\n<h3>Isu utama dalam pembuatan laporan pada <em>microservice architecture<\/em><\/h3>\n<p>Terdapat dua masalah yaitu pertama, bagaimana mendapatkan laporan secara tepat waktu dan tetap mempertahankan <em>bounded context<\/em> pada <em>microservice<\/em> dan datanya?<\/p>\n<h4><em>Antipattern 1: Database pull model<\/em><\/h4>\n<p>Terdapat sebuah microservice yang secara langsung mengakses <em>database<\/em> dari <em>microservice<\/em> lainnya (Gambar 1).<\/p>\n<p><strong><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/www.oreilly.com\/library\/view\/microservices-antipatterns-and\/9781492042716\/assets\/mapr_0401.png\" width=\"541\" height=\"397\" \/><\/strong><\/p>\n<p style=\"text-align: center;\"><strong>Gambar 1: <em>Database pull model<\/em><\/strong><\/p>\n<p>Metode ini merupakan cara termudah dan tercepat untuk mendapatkan laporan dalam waktu yang tepat. Namun ini berdampak pada <em>coupling<\/em> \/ ketergantungan yang sangat tinggi antara <em>microservices<\/em> dan <em>reporting service.<\/em> Metode ini biasanya diimplementasikan dengan mudah pada <em>shared database<\/em>, dimana beberapa aplikasi berbagi <em>database.<\/em> Namun ini berarti integritas data juga dapat diragukan karena setiap <em>microservice<\/em> dapat berubah, dan terjadilah ketergantungan dalam melakukan modifikasi, serta ini juga merusak prinsip <em>bounded context<\/em>\u00a0pada arsitektur <em>microservices.<\/em><\/p>\n<h4><em>Antipattern 2: HTTP pull model<\/em><\/h4>\n<p>Teknik <em>HTTP pull model<\/em> ini dapat menghindari isu pada <em>antipattern<\/em> 1 yaitu ketergantungan dan pelanggaran <em>bounded context.<\/em> Teknik ini tidak mengakses <em>database<\/em> dari <em>microservice<\/em> secara langsung, tetapi <em>reporting service<\/em> akan memanggil data menggunakan <em>endpoint microservices<\/em> sumber (biasanya menggunakan <em>RESTful HTTP call)<\/em> (Gambar 2).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/www.oreilly.com\/library\/view\/microservices-antipatterns-and\/9781492042716\/assets\/mapr_0402.png\" width=\"536\" height=\"394\" \/><\/p>\n<p style=\"text-align: center;\"><strong>Gambar 2: <em>HTTP pull model<\/em><\/strong><\/p>\n<p>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.<\/p>\n<h4><em>Antipattern 3: Batch pull model<\/em><\/h4>\n<p>Teknik ketiga ini merupakan <em>workaround<\/em> dari <em>antipattern<\/em> 1, yaitu dengan mengambil data secara bertahap <em>(batch).<\/em> Umumnya <em>batch job<\/em> ini dilakukan menggunakan <em>agent<\/em> secara periodik di waktu tertentu yang telah ditentukan dan akan melakukan agregasi terkait perubahan data (tambah, hapus, rubah) dan dimasukkan ke <em>reporting database<\/em> atau <em>data warehouse.<\/em><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/www.oreilly.com\/library\/view\/microservices-antipatterns-and\/9781492042716\/assets\/mapr_0403.png\" width=\"552\" height=\"423\" \/><\/p>\n<p style=\"text-align: center;\"><strong>Gambar 3: Batch pull model<\/strong><\/p>\n<p>Teknik ini memiliki masalah yang sama dengan <em>database pull model<\/em> yaitu terdapat<em> batch data upload service<\/em> akan mengakses <em>database microservices<\/em> lain secara langsung.<\/p>\n<h4><em>Event-based model (Asynchronous event push)<\/em><\/h4>\n<p>Solusi dari <em>antipattern reach-in<\/em> pada perancangan sistem laporan ini adalah dengan <em>event-based push model<\/em>. Teknik ini disebut juga <em>data pump<\/em>, yaitu data dipompa ke <em>reporting service<\/em> yang membutuhkan. Pengiriman dilakukan dengan menggunakan <em>event<\/em> yang berisi data <em>(message)<\/em> secara <em>asynchronous<\/em> yang nanti pada akhirnya <em>(eventually)<\/em> akan diterima oleh <em>reporting service<\/em> (Gambar 4).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/www.oreilly.com\/library\/view\/microservices-antipatterns-and\/9781492042716\/assets\/mapr_0404.png\" width=\"549\" height=\"425\" \/><\/p>\n<p style=\"text-align: center;\"><strong>Gambar 4: Event based push model<\/strong><\/p>\n<p>Implementasi teknik ini cukup kompleks, namun ini akan mempertahankan prinsip <em>bounded context<\/em> dari <em>microservices<\/em> lain serta data akan terkirim dalam waktu yang relatif cepat. Terdapat kontrak antara data <em>capture service<\/em> dengan <em>microservices<\/em> yang harus disepakati yaitu topik <em>event-nya.<\/em><\/p>\n<h4>Komparasi kelebihan dan kekurangan dari keempat teknik<\/h4>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/www.oreilly.com\/library\/view\/microservices-antipatterns-and\/9781492042716\/assets\/mapr_0405.png\" width=\"575\" height=\"380\" \/><\/p>\n<p style=\"text-align: center;\"><strong>Gambar 4. Komparasi kelebihan dan kekurangan dari keempat teknik<\/strong><\/p>\n<p>Pada Gambar 4, <em>database pull method<\/em> memiliki ketepatan waktu yang sangat tinggi (<em>timeliness of data<\/em>), namun melanggar prinsip <em>bounded context<\/em>. <em>HTTP pull model<\/em> mempertahankan <em>bounded context<\/em>, namun memiliki isu dengan waktu dan volume data. <em>Batch pull model<\/em> merupakan pola yang paling kurang baik, karena ketepatan waktu yang rendah dan melanggar <em>bounded context<\/em>. Sedangkan <em>event-based push model<\/em> ini memaksimalkan ketepatan waktu dan juga mempertahankan <em>bounded context<\/em>. Namun secara <em>effort<\/em> dalam membangun dengan <em>event-based push model<\/em> ini relatif lebih kompleks dibanding yang lain.<\/p>\n<p><strong>Sumber Referensi:<\/strong><br \/>\n<a href=\"https:\/\/www.oreilly.com\/library\/view\/microservices-antipatterns-and\/9781492042716\/ch04.html\">https:\/\/www.oreilly.com\/library\/view\/microservices-antipatterns-and\/9781492042716\/ch04.html<\/a><br \/>\n<a href=\"https:\/\/medium.com\/@muneeb.ahmed20\/building-a-reporting-service-in-microservice-architecture-8d5bf3b90fb7\">https:\/\/medium.com\/@muneeb.ahmed20\/building-a-reporting-service-in-microservice-architecture-8d5bf3b90fb7<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>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 [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":7973,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[83],"tags":[459,458,454,457],"class_list":["post-7969","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news","tag-distributed-system","tag-microservices","tag-reporting","tag-system-design"],"_links":{"self":[{"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/posts\/7969","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/comments?post=7969"}],"version-history":[{"count":5,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/posts\/7969\/revisions"}],"predecessor-version":[{"id":7975,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/posts\/7969\/revisions\/7975"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/media\/7973"}],"wp:attachment":[{"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/media?parent=7969"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/categories?post=7969"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/binus.ac.id\/knowledge\/wp-json\/wp\/v2\/tags?post=7969"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}