Salah satu prinsip desain layanan SOA utama adalah prinsip Kompabilitas Layanan ( https://en.wikipedia.org/wiki/Service_composability_principle ).
Idenya adalah bahwa dengan menyusun layanan baru menggunakan yang sudah ada sebagai blok bangunan, seseorang dapat dengan cepat mengembangkan layanan baru. Jenis analog dengan bagaimana Anda memanggil metode objek yang ada ketika Anda menerapkan metode baru. Di sinilah banyak dorongan produktivitas dari SOA seharusnya berasal.
Apakah seseorang benar-benar melakukan ini dalam praktik? Saya telah melihat ini berulang tanpa henti dalam teks tertulis, tetapi belum mengalami implementasi dunia nyata yang bekerja sendiri. Sebagian besar teks juga menghilangkan menyebutkan penanganan transaksi , yang menurut saya menjadi hambatan terbesar dalam mewujudkan layanan yang dapat dikomposit.
Pertama, Anda benar-benar perlu mengatasi masalah transaksi sebelum Anda dapat membuat layanan non-sepele. Tentu, jika contoh memiliki layanan "findCurrentTime ()" dan "writeLogMessage ()" mudah untuk tidak khawatir tentang transaksi, tetapi tidak ketika memiliki contoh dunia nyata seperti "depositMoney ()" dan "withdrawMoney ()".
Saya tahu dua opsi:
- Terapkan transaksi nyata dengan Transaksi WS-Atomic atau semacamnya
- Terapkan solusi berbasis kompensasi yang mengkompensasi panggilan ke A dengan "cancelA ()" atau semacamnya jika panggilan ke B gagal
Kedua hal ini tampaknya sangat bermasalah / hampir tidak dapat digunakan oleh saya:
- Transaksi WS-Atomic
- a banyak kompleksitas, paling saran yang saya temukan hanya memperingatkan "rasa sakit di pantat, dont melakukannya"
- dukungan terbatas, misalnya jika Anda mengambil ESB open source, alternatif utama ServiceMix, Mule atau WSO2 tidak mendukungnya
- kompensasi
- menerapkan penanganan kompensasi tampaknya sangat rumit bagi saya. Apa yang kita lakukan jika layanan A berhasil dan kita tidak pernah mendapatkan jawaban dari layanan B dan tidak tahu apakah itu gagal atau berhasil? Menangani logika semacam itu secara manual (sebagai implementor layanan pengomposisian) membuat saya ingin memotong pergelangan tangan saya - ini adalah jenis pekerjaan yang harus dilakukan beberapa alat bagi saya !.
- Saya juga tidak melihat bagaimana Anda dapat memiliki metode kompensasi dalam layanan non-sepele. Katakanlah layanan Anda A adalah "depositMoney ()" dan itu berhasil, beberapa tindakan lain dengan cepat mentransfer uang di tempat lain, dan kemudian kami menerima "kompensasiDepositMoney ()", apa yang kita lakukan sekarang? Sepertinya kaleng besar cacing.
Bagi saya sepertinya komposisi layanan adalah prinsip SOA yang mendasar sehingga Anda benar-benar tidak mendapatkan manfaat dari SOA jika Anda tidak dapat (dengan mudah) membuat layanan . Apa kenyataannya? 90% pengguna SOA menggunakan "criplled SOA" tanpa layanan yang sebenarnya? Atau sebagian besar pengguna memang menggunakan komposisi layanan dan saya melebih-lebihkan kesulitannya?
sumber
Jawaban:
Jawaban singkatnya adalah Ya!
Saya telah melihat ini dilakukan di beberapa organisasi keuangan besar, dan, itu telah bekerja dengan baik.
Masalah-masalah transaksi itu rumit tetapi biasanya ditangani oleh middleware (mahal) seperti Oracles WebLogic EAI atau IBMs Websphere ESB.
sumber
Ya, itu bisa dibuat untuk bekerja dalam praktik. Namun, ini mungkin bukan pendekatan terbaik dan mungkin digunakan sebagai opsi default lebih dari yang seharusnya. Menurut pendapat saya, SOA menjadi populer sebagai cara mengintegrasikan sistem warisan ketika organisasi mengembangkan TI mereka untuk mengotomatisasi tugas yang semakin besar. Ini bisa sangat berantakan tetapi mungkin layak jika sistem warisan dapat digunakan kembali. Jika Anda cukup beruntung untuk memulai proyek lapangan hijau, pendekatan lain harus dipertimbangkan sebelum menganggap itu adalah cara terbaik untuk melangkah.
Untuk menjawab beberapa masalah spesifik Anda ...
Anda dapat menggunakan transaksi:
Mempertimbangkan pendekatan berbasis kompensasi:
Tindakan mengkompensasi hanya perlu dipertimbangkan ketika ada kegagalan. Apakah alat komposisi layanan memiliki flag yang dapat dikontrolnya yang dihapus saat menjalankan langkah alur kerja pertama kali, tetapi ditetapkan pada pemanggilan berikutnya? Seperti kemungkinan mengirim ulang flag di JMS. Kemudian Anda dapat menggunakan apa yang disebut komit 1,5 fase, yang pada dasarnya berarti meneruskan jika flag jelas, tetapi jika flag ditetapkan, pertama-tama buat panggilan untuk memeriksa apakah keadaan sudah diperbarui dan perlu dibuat untuk kedua kalinya. . Ini masih membutuhkan penanganan kesalahan secara manual, dan bisa rumit atau bahkan tidak mungkin seperti yang Anda tunjukkan.
Dalam beberapa situasi tidak masalah:
Ini adalah pendekatan yang akhirnya konsisten. Misalkan satu layanan mengirim email. Jika komposisi layanan gagal dan dimulai kembali, email akan dikirim lagi. Itu agak menjengkelkan bagi penerima, tetapi mereka mungkin menyadari itu duplikat dan semuanya bisa berlanjut tanpa banyak masalah.
Anda juga dapat menyimpan log email yang dikirim, dan menggunakannya untuk menghapus dup ketika flag diatur, dan dengan cara itu hanya mengirim email satu kali.
Anda dapat menggunakan perpesanan asinkron untuk memecah transaksi menjadi lebih kecil:
Pertimbangkan antrian JMS yang bersifat transaksional. Koordinator layanan Anda dapat memperbarui statusnya dan mengirim pesan ke antrian dalam satu Tx. Layanan hilir dapat menghapus pesan, dan memperbarui statusnya dalam satu Tx. Sekarang Anda mengoordinasikan layanan di beberapa unit kerja, tetapi masing-masing adalah atom. Jika ada yang gagal dan harus dimulai ulang tidak ada masalah.
Ini masih berarti bahwa Anda melakukan transaksi XA melalui database dan antrian JMS, tetapi ini masih bisa efisien menggunakan sumber daya gambit terakhir untuk menghindari kepala penuh XA.
Atau Anda dapat menggunakan pola ini tetapi dengan komit 1,5 fase ke database dan JMS. ATAU Anda dapat menjalankan JMS tanpa transaksi tetapi membuatnya lebih dapat diandalkan dengan pengelompokan.
Olahpesan Async juga dapat membantu memisahkan sistem, karena produsen dan konsumen dapat menjadi lebih independen satu sama lain, mengurangi jumlah sambungan dalam sistem yang semuanya, dan membuatnya lebih fleksibel. Jenis decoupling ini sangat penting ketika datang ke organisasi besar dengan banyak layanan yang beragam.
sumber
Tidak, ini hanya mitos. Ini niat salah untuk memiliki ketika merancang arsitektur layanan. Ada sejumlah masalah:
Bahkan ada lebih banyak cara yang salah untuk mendekati arsitektur layanan . Jadi berhati-hatilah.
sumber