Bagaimana Anda dapat secara efektif menggunakan layanan web di lingkungan perusahaan jika Anda tidak dapat menggunakan transaksi?

14

Tempat saya bekerja sedang mencoba untuk membuat beberapa aturan dasar, dan perdebatan yang kita miliki sekarang adalah perpustakaan lokal vs layanan web untuk penggunaan kembali kode. Layanan web tampaknya menjadi pilihan populer di sebagian besar perusahaan, dan itulah yang cenderung dilakukan oleh sebagian besar pengembang.

Saya tidak bisa melihat bagaimana Anda dapat menggunakan layanan web secara efektif untuk pekerjaan serius apa pun. Bagaimana saya dapat dengan aman melakukan beberapa panggilan layanan jika saya tidak dapat menggunakan transaksi?

Katakanlah saya memiliki pekerjaan cron yang mengambil pelanggan dari database kami yang memenuhi persyaratan tertentu yang harus diberitahukan kepada mereka. Mereka mengirim faks, email, dan tiket dibuat untuk melacak masalah secara internal. Itu adalah 3 panggilan layanan berbeda yang akan terjadi untuk setiap pelanggan dalam satu loop.

Jika kesalahan terjadi di mana saja di sana, mungkin saja, misalnya, faks dan email dikirim ke pelanggan, tetapi tiket tidak dibuat. Atau lebih buruk lagi, pekerjaan cron ini dapat mengandung bug yang menyebabkannya gagal pada titik yang sama setiap waktu, dan berulang kali mengirim email ke pelanggan yang sama. Jika perpustakaan itu semuanya lokal, semuanya hanya bisa dibungkus dalam transaksi, dan tidak ada yang terjadi. Tapi kami menggunakan layanan web dalam contoh ini.

Perhatikan bahwa metode email dan faks benar-benar memasukkan data ke dalam tabel antrian yang didukung database, yang pada gilirannya ditangani oleh proses pekerjaan cron yang terpisah. Jadi panggilan ke metode layanan "kirim email" dan "kirim faks" bisa dibatalkan efek sampingnya jika diperlukan.

Sebuah opsi adalah menempatkan seluruh potongan kode ini dalam layanan web itu sendiri, sehingga layanan web itu sendiri akan memanggil metode pembuatan email, faks, dan tiket dalam suatu transaksi. Tapi kemudian kami membuat metode layanan web hanya untuk penggunaan transaksi; tidak ada alasan yang sah bahwa kita akan benar-benar perlu memanggil metode ini dari mana saja kecuali skrip cron yang satu ini.

Bagaimana biasanya Anda menangani metode ini?

ryeguy
sumber
Untuk memberikan jawaban lengkap, saya perlu informasi lebih lanjut. Ada banyak hal yang perlu dipertimbangkan ketika pindah ke arsitektur berbasis layanan. Misalnya, apakah Anda memiliki lingkungan yang heterogen (bahasa dan platform berbeda) atau homogen (bahasa dan platform tunggal). Apakah Anda memiliki sistem bus layanan? Jika tidak, apakah Anda berencana menerapkannya? Bagaimana Anda berencana untuk mengakses layanan Anda (Intranet lokasi tunggal, multi-lokasi ingin, klien terdistribusi memukul api layanan publik). Ada sejumlah variabel yang memengaruhi solusi "optimal".
Michael Brown
@MikeBrown: Semua layanan akan ditulis dalam satu bahasa, tetapi dikonsumsi oleh beberapa platform. Tidak tahu tentang menerapkan EBS, kami bahkan belum memulai jenis layanan apa pun, jadi semuanya mungkin. Layanan tersebut sebagian besar akan dikonsumsi secara internal melalui jaringan lokal kami, tetapi akan ada beberapa yang perlu dihadapkan kepada publik untuk aplikasi mobile.
ryeguy
"Jika perpustakaan semuanya lokal, semuanya hanya bisa dibungkus dalam transaksi, dan tidak ada yang akan terjadi". Salah. Kesalahan dapat terjadi setelah email dikirim tetapi sebelum pembaruan basis data akhir. Transaksi tidak secara surut mencegah email atau faks.
S.Lott
@ S.Lott: Itu akan terjadi, karena panggilan layanan email dan faks sebenarnya hanya memasukkannya ke dalam antrian, yang akan dikirim melalui proses yang berbeda. Jika transaksi yang saya jelaskan di atas terjadi, penyisipan antrian akan dibatalkan.
ryeguy
1
@ryeguy: Harap perbarui pertanyaan. Tolong jangan tambahkan komentar ke pertanyaan. Ini adalah bagian penting dari arsitektur Anda. Harap ungkapkan dalam pertanyaan.
S.Lott

Jawaban:

5

Apa yang Anda jelaskan sebenarnya adalah transaksi terdistribusi yang mengimplementasikan komit dua fase . Beberapa platform olahpesan perusahaan menyertakan manajer transaksi untuk mendukung hal semacam itu, tetapi produk konkret bergantung pada platform / bahasa. Saya tidak memiliki pengalaman konkret dengan alat-alat seperti itu, tetapi berharap petunjuk ini membantu.

Péter Török
sumber
3

Sangat menarik bahwa ketika saya berpartisipasi dalam Tanya Jawab khusus ini, ada utas serupa tentang layanan yang mendukung banyak platform pada milis DDD / CQRS yang saya ikuti. Saya dapat mengulangi kembali beberapa saran saya di sini.

Salah satu opsi untuk mendukung transaksi di lingkungan yang heterogen adalah menggunakan mekanisme transportasi yang mendukung transaksi dan didukung pada semua platform dari mana itu akan digunakan. The Lanjutan Message Queue Protocol (AMQP) melakukan transaksi dukungan dan ada API asli untuk hampir setiap bahasa yang umum digunakan saat ini. RabbitMQ adalah server yang mengimplementasikan AMQP dan telah diperiksa dalam industri sebagai solusi yang kuat.

Memanfaatkan sistem berbasis RabbitMQ menempatkan Anda pada jalur untuk memiliki ESB penuh jika Anda perlu tumbuh ke dalamnya. Anda mempublikasikan pesan ke saluran dan berlangganan antrian. Yang menjadi sangat kuat adalah antara saluran dan antrian, Anda dapat melakukan banyak hal menarik. Saluran dapat memberi makan beberapa antrian (pub / sub) antrian dapat diumpankan oleh beberapa saluran, Anda dapat merutekan pesan ke berbagai antrian berdasarkan konten, dll. Dll.

Saya baru saja membaca tentang alternatif untuk transaksi (yang datang dengan overhead dan mengubah operasi async menjadi op memblokir). RabbitMQ mendukung apa yang disebut konfirmasi penerbit . Pada dasarnya itu memungkinkan Anda untuk mendaftarkan panggilan balik untuk metode yang diterbitkan untuk menangani transaksi yang gagal. Dalam kasus Anda, ini dapat membatalkan permintaan email / faks dan menghapus tiket.

Tentu saja lubang kelinci (maaf pun) lebih dalam dari sana. Anda dapat menggunakan Rabbit untuk melakukan orkestrasi kompleks dengan layanan web internal dan eksternal.

Untuk layanan web Anda yang menghadap publik, itu menjadi sangat sederhana. Layanan Anda (baik SOAP, REST, atau JSON) hanya menerbitkan pesan ke antrian layanan yang sesuai dan biarkan sistem internal Anda menanganinya dari sana.

Ada juga fungsionalitas untuk membuat pesan permintaan / respons untuk skenario di mana Anda mengharapkan informasi kembali dengan cepat.

Michael Brown
sumber
2

Kata kunci yang Anda cari adalah 'koreografi layanan web'.

Lihat artikel Wikipedia tentang itu.

Dibbeke
sumber
Kadang-kadang disebut "orkestrasi", juga.
S.Lott
1

Cara saya menangani ini di aplikasi layanan yang saya tulis adalah membuat pembungkus untuk menangani transaksi yang diperlukan. Dalam kasus saya, permintaan pengguna, yang dibuat oleh situs web, aplikasi desktop atau layanan Windows, harus meminta layanan web dan, berdasarkan hasil dan opsi pengguna, itu harus memperbarui DB lokal dan, secara opsional, yang jauh melalui layanan web. Kemudian harus menghasilkan laporan untuk segera dikembalikan, dikirim melalui email dan / atau faks. Saya memiliki kendali atas DB, email, dan pembuatan laporan lokal tetapi tidak ada pada layanan web atau server faks.

Membuat pembungkus memungkinkan kontrol transaksi dan penanganan kesalahan yang lebih baik. Itu juga memungkinkan keamanan yang lebih baik dengan mengendalikan akses ke layanan jaringan internal dari sumber luar. Secara umum, saya melihat kebutuhan untuk transaksi dan manajemen layanan sebagai alasan yang valid untuk membuat pembungkus yang sesuai untuk solusi tunggal selama kode digunakan kembali dengan benar (tidak ada cut-n-paste coding).

jfrankcarr
sumber
1

Saya tidak bisa melihat bagaimana Anda dapat menggunakan layanan web secara efektif untuk pekerjaan serius apa pun. Bagaimana saya dapat dengan aman melakukan beberapa panggilan layanan jika saya tidak dapat menggunakan transaksi?

Kamu tidak bisa

Pertanyaan yang harus Anda tanyakan adalah: bagaimana cara menerapkan transaksi dengan kerangka layanan web X? Saat ini, Anda hanya berasumsi bahwa itu tidak mungkin.

Mike Baranczak
sumber