{"id":5181,"date":"2025-05-03T20:17:22","date_gmt":"2025-05-03T13:17:22","guid":{"rendered":"https:\/\/www.linuxid.net\/istilah\/?p=5181"},"modified":"2025-05-03T20:17:22","modified_gmt":"2025-05-03T13:17:22","slug":"cqrs-command-query-responsibility-segregation","status":"publish","type":"post","link":"https:\/\/www.linuxid.net\/istilah\/cqrs-command-query-responsibility-segregation\/","title":{"rendered":"CQRS (command query responsibility segregation)"},"content":{"rendered":"<h2>Apa itu CQRS (Command Query Responsibility Segregation)?<\/h2>\n<p>CQRS (Command Query Responsibility Segregation) adalah pola desain dan arsitektur pemrograman yang memisahkan proses pengambilan data (query) dan perubahan data (command). Pola ini menggunakan <i>command handler<\/i> untuk menyederhanakan proses <a href=\"https:\/\/www.linuxid.net\/istilah\/query\/\">query<\/a> dan menyembunyikan kompleksitas perubahan data yang bisa melibatkan banyak sistem.<\/p>\n<p>Saat digabungkan dengan pola <i>event sourcing<\/i>, CQRS bisa menjamin adanya <a href=\"https:\/\/www.linuxid.net\/istilah\/log-log-file\/\">log<\/a> audit terhadap perubahan di <a href=\"https:\/\/www.linuxid.net\/istilah\/database\/\">database<\/a>. Ini berguna untuk menjaga konsistensi transaksi. Selain itu, model pembacaannya (read model) bisa berisi, atau digunakan untuk membentuk, <i>materialized view<\/i> dari data model penulisan (write model).<\/p>\n<p>Pola ini bekerja dengan cara memisahkan logika aplikasi secara vertikal: satu sisi untuk command, satu lagi untuk query. Jadi, kita bisa memisahkan operasi membaca dan memperbarui data di sistem. Tujuan utama CQRS adalah untuk meningkatkan performa, keamanan, dan skalabilitas aplikasi.<\/p>\n<p>Dalam CQRS, <i>command<\/i> mewakili niat pengguna\u2014instruksi untuk melakukan sesuatu di sistem. Command tidak menghasilkan output dan merupakan bagian dari write model. Sebaliknya, <i>query<\/i> adalah permintaan informasi oleh user, yang mengembalikan hasil tapi tidak mengubah data\u2014bagian dari read model.<\/p>\n<p>Greg Young mengembangkan pola desain CQRS sekitar tahun 2010, berbarengan dengan munculnya pola <a href=\"https:\/\/www.theserverside.com\/tip\/How-the-event-sourcing-design-pattern-works-with-example\/\"><i>event sourcing<\/i><\/a>. Menurutnya, \u201c[CQRS] menggunakan definisi command dan query seperti yang dijelaskan Meyer, dan memisahkan objek menjadi dua: satu untuk command dan satu untuk query.\u201d Yang dimaksud adalah Bertrand Meyer, pencetus pola sebelumnya yaitu Command Query Separation (CQS).<\/p>\n<h2>CQRS vs. CQS<\/h2>\n<p>Meski CQRS terinspirasi dari CQS, keduanya berbeda. Pada CQRS, objek dipecah menjadi dua: command dan query. Pemisahan ini bikin CQRS cocok banget untuk aplikasi berbasis event sourcing atau UI berbasis tugas (<a href=\"https:\/\/www.linuxid.net\/istilah\/user-interface-UI\/\">UI<\/a>). Sementara itu, CQS lebih fokus pada pemisahan logika yang mengubah state dengan yang tidak.<\/p>\n<p>Bertrand Meyer memperkenalkan CQS dalam bukunya <i>Object-Oriented Software Construction<\/i> dan merupakan bagian dari kontribusinya di bahasa pemrograman Eiffel. Ia menyarankan agar metode yang mengubah state dipisahkan dari yang tidak, agar query bisa digunakan secara aman dalam berbagai konteks.<\/p>\n<h2>Kapan Sebaiknya Menggunakan CQRS?<\/h2>\n<p>Pola CQRS cocok digunakan dalam situasi berikut:<\/p>\n<ul class=\"default-list\/\">\n<li><b>Kolaborasi antar pengguna.<\/b> Banyak pengguna bisa mengakses data yang sama secara bersamaan.<\/li>\n<li><b>UI berbasis tugas.<\/b> Pengguna dibimbing melalui serangkaian langkah untuk menyelesaikan tugas.<\/li>\n<li><b>Sistem dengan trafik tinggi.<\/b> Beban kerja antara operasi baca\/tulis bisa dibagi, meningkatkan performa dan skalabilitas.<\/li>\n<li><b>Query ke repositori.<\/b> Data bisa ditarik dari repositori sesuai kebutuhan pengguna.<\/li>\n<li><b>Logika bisnis kompleks.<\/b> Memisahkan proses baca\/tulis mempermudah manajemen logika yang rumit.<\/li>\n<li><b>Optimasi proses baca.<\/b> Bisa membuat read model khusus yang lebih efisien.<\/li>\n<li><b>Model data yang berbeda untuk baca\/tulis.<\/b> CQRS memungkinkan pemisahan model data untuk masing-masing proses.<\/li>\n<li><b>Dukungan untuk event sourcing.<\/b> Bisa dikombinasikan dengan event sourcing untuk menangani banyak event dan query.<\/li>\n<\/ul>\n<p>Meski powerful, CQRS tidak cocok untuk semua kasus. Jangan digunakan untuk sistem sederhana yang hanya butuh CRUD (create, read, update, delete).<\/p>\n<h2>Bagaimana CQRS Dieksekusi<\/h2>\n<p>Cara paling umum menerapkan CQRS adalah dengan menggunakan <i>command pattern<\/i>, yaitu sistem yang mendefinisikan interface tingkat tinggi. Saat runtime, kelas dasar (base class) mengambil command, membuat handler yang sesuai (seperti update, delete, atau create), lalu menjalankan perintah itu.<\/p>\n<p>Sebelum dan sesudah eksekusi, base class bisa mencatat log pemanggilan. Log ini bisa di-*replay* kapan pun. Program yang menjalankan event dari log ini biasanya berupa <i>for loop<\/i>, membaca file baris per baris dan mengeksekusi command sesuai datanya. Kompleksitasnya disembunyikan atau <a href=\"https:\/\/www.linuxid.net\/istilah\/encapsulation\/\">dienkapsulasi<\/a> oleh handler.<\/p>\n<p>Handler akan menjalankan semua langkah untuk membuat, memperbarui, atau menghapus item dalam sistem. Handler ini bisa juga menangani kesalahan dan rollback bila diperlukan. Dalam kasus kompleks, handler menulis hasilnya ke dalam <a href=\"https:\/\/www.linuxid.net\/istilah\/two-phase-commit-2PC\/\">two-phase commit<\/a> (atau saga), mencatat semua perubahan di event log. Jika log ini bisa dibaca dan di-*replay*, maka sistem mendukung event sourcing.<\/p>\n<h2>Contoh Penggunaan CQRS: Proses Pemesanan Pelanggan<\/h2>\n<p>Saat pelanggan melihat pesanan, sistem hanya melakukan proses baca dari database. Misalnya menggunakan <a href=\"https:\/\/www.linuxid.net\/istilah\/NoSQL-Not-Only-SQL\/\">NoSQL<\/a> seperti Redis. Informasi dibaca oleh <a href=\"https:\/\/www.linuxid.net\/istilah\/microservices\/\">microservice<\/a>, lalu ditampilkan oleh website.<\/p>\n<p>Namun, sisi tulisannya jauh lebih kompleks. Misalnya jika pelanggan membatalkan pesanan sebelum dikirim:<\/p>\n<ul class=\"default-list\/\">\n<li>Pesanan harus dibatalkan di cache dan sumber data utama.<\/li>\n<li>Jika ada <a href=\"https:\/\/www.linuxid.net\/istilah\/data-warehouse\/\">data warehouse<\/a>, data juga harus dihapus dari sana.<\/li>\n<li>Gudang dan bagian pengiriman harus diberi tahu agar tidak mengirim barang.<\/li>\n<li>Transaksi kartu kredit harus dibatalkan, jumlah stok diperbarui, dan pesanan ke supplier dikurangi.<\/li>\n<\/ul>\n<p>Karena satu perubahan berdampak ke banyak sistem, maka command handler seperti saga pattern atau <a href=\"https:\/\/www.linuxid.net\/istilah\/Enterprise-Service-Bus-ESB\/\">ESB<\/a> sangat dibutuhkan untuk mengatur proses ini. Di sinilah CQRS membantu.<\/p>\n<h2>Tantangan dalam Menggunakan CQRS<\/h2>\n<ul class=\"default-list\/\">\n<li><b>Kompleksitas.<\/b> CQRS menambah layer tambahan ke sistem seperti handler, dispatcher, dan logging.<\/li>\n<li><b>Messaging.<\/b> Biasanya butuh sistem messaging untuk proses command dan broadcast update.<\/li>\n<li><b>Konversi sistem lama.<\/b> Sulit diterapkan ke sistem sederhana yang tidak pakai event log.<\/li>\n<li><b>Konsistensi data.<\/b> Karena read\/write model terpisah, data bisa jadi tidak sinkron.<\/li>\n<li><b>Delay sinkronisasi.<\/b> Perubahan di write model bisa butuh waktu sebelum muncul di read model.<\/li>\n<li><b>Biaya.<\/b> Implementasi CQRS bisa butuh lebih banyak resource dan infrastruktur.<\/li>\n<\/ul>\n<h2>Menggabungkan CQRS dengan Pola Lain: Event Sourcing<\/h2>\n<p>CQRS sering digabung dengan <i>event sourcing<\/i>. Setiap perubahan pada data disimpan sebagai event. Sistem bisa direkonstruksi dari rangkaian event tersebut, membentuk log transaksi yang bisa di-*replay*\u2014bahkan kadang bisa di-*rollback*.<\/p>\n<p>Untuk mendukung event sourcing, command handler akan menulis setiap perubahan ke log. Setiap event bisa dijalankan ulang, menjadikan log tersebut sebagai catatan hidup dari seluruh histori data.<\/p>\n<p>Keduanya saling melengkapi: CQRS memisahkan tanggung jawab, dan event sourcing menyimpan semua perubahan yang terjadi dari waktu ke waktu.<\/p>\n<h2>Pola-Pola Terkait<\/h2>\n<p>CQRS cocok digabungkan dengan <a href=\"https:\/\/www.linuxid.net\/istilah\/domain-driven-design\/\">domain-driven design<\/a>, event sourcing, dan <i>command pattern<\/i>. Dalam arsitektur yang lebih luas, pola ini biasanya berada dalam konteks <a href=\"https:\/\/www.linuxid.net\/istilah\/service-oriented-architecture-SOA\/\">service-oriented architecture<\/a> (SOA).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Apa itu CQRS (Command Query Responsibility Segregation)? CQRS (Command Query Responsibility Segregation) adalah pola desain dan arsitektur pemrograman yang memisahkan proses pengambilan data (query) dan perubahan data (command). Pola ini menggunakan command handler untuk menyederhanakan proses query dan menyembunyikan kompleksitas perubahan data yang bisa melibatkan banyak sistem. Saat digabungkan dengan pola event sourcing, CQRS bisa [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[271],"tags":[48],"class_list":["post-5181","post","type-post","status-publish","format-standard","hentry","category-software-development","tag-api-design-and-management"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Apa itu CQRS (command query responsibility segregation)? - Istilah Komputer<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.linuxid.net\/istilah\/cqrs-command-query-responsibility-segregation\/\" \/>\n<meta property=\"og:locale\" content=\"id_ID\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Apa itu CQRS (command query responsibility segregation)? - Istilah Komputer\" \/>\n<meta property=\"og:description\" content=\"Apa itu CQRS (Command Query Responsibility Segregation)? CQRS (Command Query Responsibility Segregation) adalah pola desain dan arsitektur pemrograman yang memisahkan proses pengambilan data (query) dan perubahan data (command). Pola ini menggunakan command handler untuk menyederhanakan proses query dan menyembunyikan kompleksitas perubahan data yang bisa melibatkan banyak sistem. Saat digabungkan dengan pola event sourcing, CQRS bisa [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.linuxid.net\/istilah\/cqrs-command-query-responsibility-segregation\/\" \/>\n<meta property=\"og:site_name\" content=\"Istilah Komputer\" \/>\n<meta property=\"article:published_time\" content=\"2025-05-03T13:17:22+00:00\" \/>\n<meta name=\"author\" content=\"adhit\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Ditulis oleh\" \/>\n\t<meta name=\"twitter:data1\" content=\"adhit\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimasi waktu membaca\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 menit\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.linuxid.net\/istilah\/cqrs-command-query-responsibility-segregation\/\",\"url\":\"https:\/\/www.linuxid.net\/istilah\/cqrs-command-query-responsibility-segregation\/\",\"name\":\"Apa itu CQRS (command query responsibility segregation)? - Istilah Komputer\",\"isPartOf\":{\"@id\":\"https:\/\/linuxid.net\/istilah\/#website\"},\"datePublished\":\"2025-05-03T13:17:22+00:00\",\"author\":{\"@id\":\"https:\/\/linuxid.net\/istilah\/#\/schema\/person\/ec7c6c711087fb70886ff5a4fe68e83d\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.linuxid.net\/istilah\/cqrs-command-query-responsibility-segregation\/#breadcrumb\"},\"inLanguage\":\"id\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.linuxid.net\/istilah\/cqrs-command-query-responsibility-segregation\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.linuxid.net\/istilah\/cqrs-command-query-responsibility-segregation\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/linuxid.net\/istilah\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"CQRS (command query responsibility segregation)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/linuxid.net\/istilah\/#website\",\"url\":\"https:\/\/linuxid.net\/istilah\/\",\"name\":\"Istilah Komputer\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/linuxid.net\/istilah\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"id\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/linuxid.net\/istilah\/#\/schema\/person\/ec7c6c711087fb70886ff5a4fe68e83d\",\"name\":\"adhit\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"id\",\"@id\":\"https:\/\/linuxid.net\/istilah\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.linuxid.net\/istilah\/wp-content\/litespeed\/avatar\/808829c8eb1b70c161b392916104c2ba.jpg?ver=1778403130\",\"contentUrl\":\"https:\/\/www.linuxid.net\/istilah\/wp-content\/litespeed\/avatar\/808829c8eb1b70c161b392916104c2ba.jpg?ver=1778403130\",\"caption\":\"adhit\"},\"sameAs\":[\"https:\/\/linuxid.net\/istilah\"],\"url\":\"https:\/\/www.linuxid.net\/istilah\/author\/xsandradietsax\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Apa itu CQRS (command query responsibility segregation)? - Istilah Komputer","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.linuxid.net\/istilah\/cqrs-command-query-responsibility-segregation\/","og_locale":"id_ID","og_type":"article","og_title":"Apa itu CQRS (command query responsibility segregation)? - Istilah Komputer","og_description":"Apa itu CQRS (Command Query Responsibility Segregation)? CQRS (Command Query Responsibility Segregation) adalah pola desain dan arsitektur pemrograman yang memisahkan proses pengambilan data (query) dan perubahan data (command). Pola ini menggunakan command handler untuk menyederhanakan proses query dan menyembunyikan kompleksitas perubahan data yang bisa melibatkan banyak sistem. Saat digabungkan dengan pola event sourcing, CQRS bisa [&hellip;]","og_url":"https:\/\/www.linuxid.net\/istilah\/cqrs-command-query-responsibility-segregation\/","og_site_name":"Istilah Komputer","article_published_time":"2025-05-03T13:17:22+00:00","author":"adhit","twitter_card":"summary_large_image","twitter_misc":{"Ditulis oleh":"adhit","Estimasi waktu membaca":"4 menit"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.linuxid.net\/istilah\/cqrs-command-query-responsibility-segregation\/","url":"https:\/\/www.linuxid.net\/istilah\/cqrs-command-query-responsibility-segregation\/","name":"Apa itu CQRS (command query responsibility segregation)? - Istilah Komputer","isPartOf":{"@id":"https:\/\/linuxid.net\/istilah\/#website"},"datePublished":"2025-05-03T13:17:22+00:00","author":{"@id":"https:\/\/linuxid.net\/istilah\/#\/schema\/person\/ec7c6c711087fb70886ff5a4fe68e83d"},"breadcrumb":{"@id":"https:\/\/www.linuxid.net\/istilah\/cqrs-command-query-responsibility-segregation\/#breadcrumb"},"inLanguage":"id","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.linuxid.net\/istilah\/cqrs-command-query-responsibility-segregation\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.linuxid.net\/istilah\/cqrs-command-query-responsibility-segregation\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/linuxid.net\/istilah\/"},{"@type":"ListItem","position":2,"name":"CQRS (command query responsibility segregation)"}]},{"@type":"WebSite","@id":"https:\/\/linuxid.net\/istilah\/#website","url":"https:\/\/linuxid.net\/istilah\/","name":"Istilah Komputer","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/linuxid.net\/istilah\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"id"},{"@type":"Person","@id":"https:\/\/linuxid.net\/istilah\/#\/schema\/person\/ec7c6c711087fb70886ff5a4fe68e83d","name":"adhit","image":{"@type":"ImageObject","inLanguage":"id","@id":"https:\/\/linuxid.net\/istilah\/#\/schema\/person\/image\/","url":"https:\/\/www.linuxid.net\/istilah\/wp-content\/litespeed\/avatar\/808829c8eb1b70c161b392916104c2ba.jpg?ver=1778403130","contentUrl":"https:\/\/www.linuxid.net\/istilah\/wp-content\/litespeed\/avatar\/808829c8eb1b70c161b392916104c2ba.jpg?ver=1778403130","caption":"adhit"},"sameAs":["https:\/\/linuxid.net\/istilah"],"url":"https:\/\/www.linuxid.net\/istilah\/author\/xsandradietsax\/"}]}},"_links":{"self":[{"href":"https:\/\/www.linuxid.net\/istilah\/wp-json\/wp\/v2\/posts\/5181","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxid.net\/istilah\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxid.net\/istilah\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.linuxid.net\/istilah\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxid.net\/istilah\/wp-json\/wp\/v2\/comments?post=5181"}],"version-history":[{"count":1,"href":"https:\/\/www.linuxid.net\/istilah\/wp-json\/wp\/v2\/posts\/5181\/revisions"}],"predecessor-version":[{"id":5821,"href":"https:\/\/www.linuxid.net\/istilah\/wp-json\/wp\/v2\/posts\/5181\/revisions\/5821"}],"wp:attachment":[{"href":"https:\/\/www.linuxid.net\/istilah\/wp-json\/wp\/v2\/media?parent=5181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxid.net\/istilah\/wp-json\/wp\/v2\/categories?post=5181"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxid.net\/istilah\/wp-json\/wp\/v2\/tags?post=5181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}