Ini adalah pertanyaan klasik yang saya tanyakan saat wawancara baru-baru ini. Bagaimana cara memanggil beberapa layanan web dan masih mempertahankan beberapa jenis penanganan kesalahan di tengah tugas. Saat ini, dalam komputasi kinerja tinggi, kami menghindari komitmen dua fase. Saya membaca makalah bertahun-tahun yang lalu tentang apa yang disebut "model Starbuck" untuk transaksi: Pikirkan tentang proses pemesanan, pembayaran, persiapan dan penerimaan kopi yang Anda pesan di Starbuck ... Saya terlalu menyederhanakan berbagai hal tetapi model dua fase komit akan sarankan bahwa seluruh proses akan menjadi transaksi pembungkus tunggal untuk semua langkah yang terlibat sampai Anda menerima kopi Anda. Namun, dengan model ini, semua karyawan akan menunggu dan berhenti bekerja sampai Anda mendapatkan kopi Anda. Anda melihat gambarnya?
Sebagai gantinya, "model Starbuck" lebih produktif dengan mengikuti model "usaha terbaik" dan mengkompensasi kesalahan dalam proses. Pertama, mereka memastikan bahwa Anda membayar! Lalu, ada antrian pesan dengan pesanan Anda terlampir pada cangkir. Jika ada yang salah dalam proses, seperti Anda tidak mendapatkan kopi Anda, bukan itu yang Anda pesan, dll, kami masuk ke dalam proses kompensasi dan kami memastikan Anda mendapatkan apa yang Anda inginkan atau mengembalikan uang Anda, Ini adalah model yang paling efisien untuk peningkatan produktivitas.
Terkadang, starbuck membuang-buang kopi tetapi proses keseluruhannya efisien. Ada trik lain untuk dipikirkan ketika Anda membangun layanan web Anda seperti mendesainnya sedemikian rupa sehingga mereka dapat dipanggil berapa kali dan masih memberikan hasil akhir yang sama. Jadi, rekomendasi saya adalah:
Jangan terlalu baik ketika mendefinisikan layanan web Anda (saya tidak yakin tentang hype layanan mikro yang terjadi hari ini: terlalu banyak risiko terlalu jauh);
Async meningkatkan kinerja jadi lebih suka menjadi async, kirim pemberitahuan melalui email kapan pun memungkinkan.
Bangun layanan yang lebih cerdas untuk menjadikannya "dapat diingat" beberapa kali, diproses dengan uid atau taskid yang akan mengikuti urutan bottom-top hingga akhir, memvalidasi aturan bisnis di setiap langkah;
Gunakan antrian pesan (JMS atau yang lain) dan alihkan ke prosesor penanganan kesalahan yang akan menerapkan operasi ke "kembalikan" dengan menerapkan operasi yang berlawanan, omong-omong, bekerja dengan urutan async akan memerlukan semacam antrian untuk memvalidasi keadaan proses saat ini, jadi pertimbangkan itu;
Dalam upaya terakhir, (karena mungkin tidak sering terjadi), masukkan ke dalam antrian untuk pemrosesan kesalahan secara manual.
Mari kita kembali dengan masalah awal yang diposting. Buat akun dan buat dompet dan pastikan semuanya sudah selesai.
Katakanlah layanan web dipanggil untuk mengatur seluruh operasi.
Kode semu layanan web akan terlihat seperti ini:
Panggil layanan pembuatan akun mikro, berikan informasi dan id tugas unik 1.1 Layanan pembuatan akun akan terlebih dahulu memeriksa apakah akun itu sudah dibuat. Id tugas dikaitkan dengan catatan akun. Layanan microsoft mendeteksi bahwa akun tidak ada sehingga membuatnya dan menyimpan id tugas. CATATAN: layanan ini dapat dipanggil 2000 kali, ia akan selalu melakukan hasil yang sama. Layanan menjawab dengan "tanda terima yang berisi informasi minimal untuk melakukan operasi pembatalan jika diperlukan".
Panggil pembuatan Dompet, berikan ID akun dan id tugas. Katakanlah suatu kondisi tidak valid dan pembuatan dompet tidak dapat dilakukan. Panggilan kembali dengan kesalahan tetapi tidak ada yang dibuat.
Orkestra diberitahu tentang kesalahan tersebut. Ia tahu ia harus membatalkan pembuatan Akun tetapi tidak akan melakukannya sendiri. Ia akan meminta layanan dompet untuk melakukannya dengan mengirimkan "tanda terima minimal yang dibatalkan" yang diterima pada akhir langkah 1.
Layanan Akun membaca tanda terima undo dan tahu cara membatalkan operasi; tanda terima yang dibatalkan bahkan dapat menyertakan informasi tentang layanan microsoft lain yang dapat disebut sebagai bagian dari pekerjaan tersebut. Dalam situasi ini, tanda terima yang dibatalkan dapat berisi ID Akun dan mungkin beberapa informasi tambahan yang diperlukan untuk melakukan operasi yang berlawanan. Dalam kasus kami, untuk mempermudah, katakanlah cukup hapus akun menggunakan id akunnya.
Sekarang, katakanlah layanan web tidak pernah menerima keberhasilan atau kegagalan (dalam hal ini) bahwa pembatalan pembuatan Akun dilakukan. Itu hanya akan memanggil layanan membatalkan Akun lagi. Dan layanan ini seharusnya tidak pernah gagal karena tujuannya adalah agar akun tidak ada lagi. Jadi ia memeriksa apakah ada dan melihat tidak ada yang bisa dilakukan untuk membatalkannya. Jadi kembalinya operasi itu sukses.
Layanan web kembali ke pengguna bahwa akun tidak dapat dibuat.
Ini adalah contoh sinkron. Kami bisa mengelolanya dengan cara yang berbeda dan memasukkan kasus ke antrian pesan yang ditargetkan ke help desk jika kami tidak ingin sistem menyelesaikan kesalahan ". Saya telah melihat ini dilakukan di perusahaan di mana tidak cukup kait dapat diberikan ke sistem ujung belakang untuk memperbaiki situasi. Meja bantuan menerima pesan yang berisi apa yang dilakukan dengan sukses dan memiliki informasi yang cukup untuk memperbaiki hal-hal seperti tanda terima undo kami dapat digunakan dengan cara yang sepenuhnya otomatis.
Saya telah melakukan pencarian dan situs web microsoft memiliki deskripsi pola untuk pendekatan ini. Ini disebut pola transaksi kompensasi:
Mengkompensasi pola transaksi