Saya sedang mempertimbangkan proyek untuk memigrasi bagian dari SOA berbasis WCF kami ke model bus layanan (mungkin nServiceBus) dan menggunakan beberapa pub-sub dasar untuk mencapai Pemisahan Command-Query .
Saya bukan orang baru dalam SOA, atau bahkan untuk model bus servis, tetapi saya akui bahwa hingga saat ini konsep "pemisahan" saya terbatas pada mirroring dan replikasi run-of-the-mill database. Tetap saja, saya tertarik pada ide itu karena tampaknya memberikan semua manfaat dari sistem yang pada akhirnya konsisten sementara menghindari banyak kelemahan yang jelas (terutama kurangnya dukungan transaksional yang tepat).
Saya sudah membaca banyak tentang subjek dari Udi Dahan yang pada dasarnya adalah guru pada arsitektur ESB (setidaknya di dunia Microsoft), tetapi satu hal yang dia katakan benar-benar membingungkan saya:
Ketika kita mendapatkan entitas yang lebih besar dengan lebih banyak bidang pada mereka, kita juga mendapatkan lebih banyak aktor yang bekerja dengan entitas yang sama, dan semakin tinggi kemungkinan bahwa sesuatu akan menyentuh beberapa atribut mereka pada waktu tertentu, meningkatkan jumlah konflik konkurensi.
[...]
Elemen inti dari CQRS adalah memikirkan kembali desain antarmuka pengguna untuk memungkinkan kami menangkap maksud pengguna kami sehingga menjadikan pelanggan lebih disukai adalah unit kerja yang berbeda bagi pengguna daripada menunjukkan bahwa pelanggan telah pindah atau bahwa mereka telah mendapatkan menikah. Menggunakan UI seperti Excel untuk perubahan data tidak menangkap maksud, seperti yang kita lihat di atas.
- Udi Dahan, Klarifikasi CQRS
Dari perspektif yang dijelaskan dalam kutipan, sulit untuk berdebat dengan logika itu. Tapi tampaknya bertentangan dengan SOA. SOA (dan benar-benar layanan pada umumnya) seharusnya berurusan dengan pesan kasar sehingga meminimalkan obrolan jaringan - di antara banyak manfaat lainnya.
Saya menyadari bahwa obrolan jaringan tidak terlalu menjadi masalah ketika Anda memiliki sistem yang sangat terdistribusi dengan antrian pesan yang baik dan tidak ada satu pun bagasi RPC, tetapi tampaknya tidak bijaksana untuk mengabaikan masalah ini sepenuhnya. Udi hampir mengatakan bahwa setiap perubahan atribut (yaitu pembaruan lapangan) harus menjadi perintahnya sendiri, yang sulit dibayangkan dalam konteks satu pengguna yang berpotensi memperbarui ratusan atau ribuan entitas dan atribut gabungan seperti yang sering terjadi dengan tradisional layanan web.
Satu pemutakhiran batch dalam SQL Server dapat mengambil sepersekian detik dari diberikan kueri yang sangat parameter, parameter tabel bernilai atau memasukkan massal ke tabel staging; memproses semua pembaruan ini satu per satu adalah lambat, lambat, lambat , dan perangkat keras database OLTP adalah yang paling mahal dari semua untuk meningkatkan / memperkecil.
Apakah ada cara untuk merekonsiliasi masalah yang saling bersaing ini? Apakah saya memikirkannya dengan cara yang salah? Apakah masalah ini memiliki solusi terkenal di dunia CQS / ESB?
Jika tidak, lalu bagaimana seseorang memutuskan "tingkat yang tepat" dari granularitas dalam sebuah Perintah seharusnya? Apakah ada beberapa "standar" yang dapat digunakan sebagai titik awal - semacam 3NF dalam database - dan hanya menyimpang ketika pembuatan profil yang hati-hati menunjukkan manfaat kinerja yang berpotensi signifikan?
Atau mungkinkah ini salah satu dari hal-hal yang, meskipun beberapa pendapat kuat diungkapkan oleh berbagai ahli, benar-benar hanya masalah pendapat?
sumber
Pesan yang Udi coba sampaikan adalah bahwa CQRS lebih dari sekadar CRUD. Mengapa saya membuat catatan ini? Mengapa saya mengubah catatan ini? Mengapa itu dihapus / ditandai sebagai dihapus?
Perintah harus sesuai dengan kasus tindakan / penggunaan yang dibuat pengguna dengan sistem dan menyatakan maksud tindakan daripada hanya mengatakan ubah ini. Juga, itu mungkin terlihat seperti butiran yang lebih halus tetapi bisa jadi lebih kasar daripada yang pertama kali muncul. Misalnya peningkatan ke status emas mungkin melibatkan perubahan ke beberapa atribut dan sejumlah agregat lainnya bahkan mungkin merespons dan berubah sebagai respons terhadap peristiwa terkait.
CQRS adalah tentang menangkap bahasa bisnis di lapisan Layanan sehingga UI tidak perlu khawatir tentang apa yang terjadi ketika saya membuat peningkatan status emas atau pengiriman telah ditandai sebagai tidak terkirim oleh operator, atau karyawan tersebut telah dipromosikan kepada manajer grup teknologi. Yah secara teknis saya berbicara tentang Event Sourcing sekarang, tetapi Anda mengerti maksud saya. Ada lebih banyak pesan yang berbeda tetapi tidak selalu lebih baik daripada CUD standar.
sumber