Rumah > Soal Jawab > teks badan
黄舟2017-04-18 09:28:19
Mati pucuk secara amnya bermaksud kaedah tersebut tidak mengubah status perniagaan, jadi ia boleh memastikan kesan panggilan berulang adalah sama dengan kesan panggilan tunggal.
Melihat pada huraian anda, tugas berjadual dan pemprosesan tak segerak anda berkemungkinan mengubah status perniagaan (seperti memasukkan data Berkemungkinan kaedah anda sendiri bukan a kuasa Tunggu. Jika ini berlaku, pada dasarnya tiada penyelesaian.
Saya rasa idea sebenar di sebalik soalan anda mungkin: Dalam persekitaran yang diedarkan, bagaimana untuk memastikan bahawa apabila menghantar permintaan berulang untuk tugas berjadual dan pemprosesan tak segerak, logik perniagaan sebenar dilaksanakan sahaja sekali?
Jika ya, anda boleh menggunakan storan terpusat (seperti redis) untuk menyimpan rekod permintaan pemanggil Selepas menerima permintaan, pelayan menggunakan pertanyaan atom dan menyimpan operasi (seperti perintahsetnx redis) , untuk memastikan bahawa hanya satu permintaan akan berjaya disimpan Ini boleh mencapai kesan hanya melaksanakan perniagaan sebenar sekali.
boolean setSuccess = redis.setnx(request.serializeToString(),"");//原子操作
if(setSuccess){
doBusiness(); //执行业务
}else{
doNothing(); //什么都不做
}
PHPz2017-04-18 09:28:19
Saya tidak mempunyai sebarang pengalaman dalam bidang ini, tetapi pendekatan syarikat adalah menggunakan IP untuk membuat pertimbangan, dan hanya IP yang ditetapkan boleh melaksanakan tugas yang dijadualkan ini.
Berikut ialah fantasi peribadi tanpa pengalaman praktikal:
Bina aplikasi awam khusus untuk mengendalikan tugas yang dijadualkan, dan kemudian sediakan antara muka mesej untuk aplikasi tertentu untuk dipanggil.
迷茫2017-04-18 09:28:19
Gunakan transaksi untuk melaksanakannya, transaksi yang diedarkan atau baris gilir mesej
PHP中文网2017-04-18 09:28:19
Jadikan operasi itu sendiri idempoten, seperti menukar operasi +1 kepada operasi =
Beri setiap operasi ID dan rekod setiap pelaksanaan Sebelum pelaksanaan, semak sama ada operasi dengan ID ini telah dilaksanakan sebelum ini
大家讲道理2017-04-18 09:28:19
Anda boleh mempertimbangkan baris gilir mesej dengan mekanisme ack, seperti RabbitMQ, dsb., yang bukan sahaja memastikan tugasan hanya diberikan kepada seorang pekerja, tetapi juga memastikan integriti kejayaan tugasan
黄舟2017-04-18 09:28:19
Kami mencapai ini melalui penjadualan zk Dalam persekitaran yang diedarkan, tugas hanya boleh dilaksanakan oleh satu mesin paling banyak ZK dapat merealisasikan fungsi ini dengan baik
巴扎黑2017-04-18 09:28:19
Semua jawapan setakat ini adalah salah, termasuk yang diterima. Sebabnya ialah tugas berjadual atau pemprosesan tak segerak tiada kaitan dengan mati pucuk.
PHP中文网2017-04-18 09:28:19
Gunakan baris gilir setelah anda mengambilnya, ia hanya akan dilaksanakan sekali sahaja.