java - 分布式环境下,定时任务或异步处理如何保持幂等性?
天蓬老师
天蓬老师 2017-04-18 09:26:19
0
9
798
天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

membalas semua(9)
黄舟

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 perintah

setnx 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(); //什么都不做
}
PHPzhong

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.

迷茫

Gunakan transaksi untuk melaksanakannya, transaksi yang diedarkan atau baris gilir mesej

洪涛
  1. Jadikan operasi itu sendiri idempoten, seperti menukar operasi +1 kepada operasi =

  2. Beri setiap operasi ID dan rekod setiap pelaksanaan Sebelum pelaksanaan, semak sama ada operasi dengan ID ini telah dilaksanakan sebelum ini

大家讲道理

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

黄舟

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

巴扎黑

Semua jawapan setakat ini adalah salah, termasuk yang diterima. Sebabnya ialah tugas berjadual atau pemprosesan tak segerak tiada kaitan dengan mati pucuk.

巴扎黑

redis + token sudah memadai

洪涛

Gunakan baris gilir setelah anda mengambilnya, ia hanya akan dilaksanakan sekali sahaja.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan