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?