如图所示,bool withdraw(account_id, amount)函数表示:从account_id对应的账户中扣除amount数额的钱;如果扣除成功则返回true,账户余额减少amount;如果扣除失败则返回false,账户余额不变。
如果withdraw请求已经被服务器端正确处理,但服务器端的返回结果由于网络等原因被掉丢了,导致客户端无法得知处理结果。如果是在网页上,一些不恰当的设计可能会使用户认为上一次操作失败了,然后刷新页面,这就导致了withdraw被调用两次,账户也被多扣了一次钱。因此我们要做幂等控制。
问题:
如果采用采用分布式事务,通过引入支持分布式事务的中间件来保证withdraw功能的事务性,有哪些中间件可以提供这些功能?具体怎么实现的啊?
Pertama sekali, RocketMQ, perisian tengah mesej sumber terbuka Alibaba, pada asalnya dipanggil MetaQ Dokumen itu menyatakan bahawa ia menyokong transaksi yang diedarkan, kerana semua aspek RocketMQ, termasuk pengeluar, pengguna dan broker, diedarkan, jadi pada asasnya Ia boleh. dijamin bahawa ia akan hilang kerana sebab rangkaian, tetapi kami tidak menggunakan ciri ini dalam projek Selain itu, RocketMQ mempunyai masalah penggunaan berulang, jadi dokumen itu dengan jelas menunjukkan bahawa pihak perniagaan harus melaksanakan mati pucuk dengan sendirinya >
Kedua, saya berpendapat bahawa dalam kebanyakan kes, urus niaga yang diedarkan jarang dilaksanakan Dalam kebanyakan kes, konsistensi akhir sudah mencukupi, dan prestasi urus niaga yang diedarkan adalah rendah.Selain itu, mati pucuk sebenarnya tidak mempunyai kaitan dengan masalah tersebut. urus niaga teragih yang anda nyatakan dalam senario yang sama, walaupun sistem anda semuanya bersama-sama, apakah yang perlu anda lakukan jika anda menerima dua permintaan yang sama 🎜> Dan mati pucuk boleh dicapai dengan mengeluarkan token (sebenarnya terdapat banyak artikel yang diperkenalkan)
Pertama sekali, senario ini tiada kaitan dengan transaksi yang diedarkan!
Kedua, mengenai idempotence perkhidmatan, terdapat banyak cara untuk menjaminnya Khusus untuk senario anda, anda boleh menentukan permintaan dalam protokol untuk mewakili requestID Di bahagian pelayan, sahkan requestID ini redis Kunci yang diedarkan atau kunci yang diedarkan lain boleh disahkan untuk mati pucuk
Ia melibatkan percubaan semula pada kegagalan, jadi antara muka penyedia mestilah idempoten Walau bagaimanapun, antara muka seperti potongan inventori sukar untuk mencapai idempoten, jadi disyorkan untuk menutup percubaan semula yang gagal pada antara muka yang gagal.
Untuk senario penyoal ini, sebab utama adalah pemanggil gagal kerana tamat masa dan tidak berpatah balik
amount
, kerana jika tekaan saya betul, ini sepatutnya panggilan RPC, jadi penyoal sangat memerlukan Transaksi Teragih digunakan untuk melakukan rollback transaksi Untuk butiran, anda boleh merujuk kepada ByteTCC Menggunakan TCC juga merupakan penyelesaian