Apakah komposisi layanan SOA benar-benar berfungsi dalam praktik?

15

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.

masukkan deskripsi gambar di sini

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:

  1. Terapkan transaksi nyata dengan Transaksi WS-Atomic atau semacamnya
  2. 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?

Janne Mattila
sumber
+1 ini adalah pertanyaan yang sangat bagus, dan sangat disayangkan ia belum memiliki banyak perhatian.
Gaz_Edge

Jawaban:

0

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.

James Anderson
sumber
Tidak banyak diskusi jadi saya pikir saya memilih jawaban Anda. Saya kira komposisi layanan berfungsi jika Anda berupaya keras dan menggunakan alat yang tepat.
Janne Mattila
Sebagai pertanyaan tindak lanjut saya ingin tahu berapa persen implementasi SOA melakukannya "dengan benar" dan menggunakan komposisi layanan nyata? Firasat saya akan sangat rendah, seperti 10% ... Apakah saya salah?
Janne Mattila
4

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:

  1. WS-TX adalah PITA dan saya akan menghindarinya.
  2. Semua layanan Anda dapat berjalan dalam satu server aplikasi, dalam hal ini Anda dapat menjangkau semuanya dengan transaksi XA. Inilah sebabnya mengapa hal-hal seperti server aplikasi diciptakan.

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.

pengguna2800708
sumber
Jawaban bagus! Satu-satunya komentar saya di bagian terakhir di mana Anda berbicara tentang JMS dan pengiriman pesan yang tidak sinkron dengan transaksi, saya khawatir ini mungkin memberikan kesan buruk tentang kemampuan di sini. Transaksi pengguna layanan untuk mengirim pesan hanya akan menjamin bahwa pesan telah dikirim dan dimasukkan ke dalam antrian. Kami tidak memiliki jaminan semacam itu tentang apa yang akan dilakukan konsumen, apalagi jika mereka bahkan akan membaca pesan tersebut.
maple_shaft
Jika Anda memerlukan respons, pesan harus dikirim kembali menggunakan id korelasi untuk mencocokkannya dengan yang asli dikirim. Orkestrasi layanan dapat memastikan bahwa permintaan diproses setelah mendapat respons.
user2800708
+1 untuk "Inilah sebabnya mengapa server aplikasi diciptakan." Saya telah bergumul dengan masalah ini selama berminggu-minggu sekarang. Saya memulai proyek baru dan ingin menggunakan SOA - memiliki semua layanan pada kotak yang sama untuk memungkinkan konsistensi transaksional penuh sepertinya jalan ke depan - terima kasih!
Gaz_Edge
-1

Tidak, ini hanya mitos. Ini niat salah untuk memiliki ketika merancang arsitektur layanan. Ada sejumlah masalah:

  1. Kopling sangat ketat. Jika satu layanan diubah, Anda perlu menguji keseluruhan sistem.
  2. Layanan seperti itu sangat halus sehingga ada banyak komunikasi internal.
  3. Sebagai hasil dari berbutir halus ada banyak layanan. Sistem semakin sulit dimengerti, pertanyaan semakin sulit dilacak.
  4. Layanan entitas tidak dienkapsulasi dengan baik: tidak ada aturan bisnis yang diperiksa di sana, logika ini ada di layanan pengoperasian. Jadi, setiap layanan dapat memanggil entitas-layanan apa pun dan memperbarui datanya dengan kueri-pembaruan umum yang ada di antarmuka-nya. Jenis layanan entitas seperti itu sering disebut sebagai data-centric - bukan layanan-centric, perilaku-sentris layanan.
  5. Sifat alami dari komunikasi antara layanan-layanan ini adalah sinkron. Jadi kemungkinan transpor yang dipilih adalah http. Karenanya semua kekurangannya yang akan saya bicarakan sedikit kemudian.

Bahkan ada lebih banyak cara yang salah untuk mendekati arsitektur layanan . Jadi berhati-hatilah.

Zapadlo
sumber
@ downvoter Tidak setuju? Jangan membicarakannya, mengapa repot-repot, hanya downvote!
Zapadlo