Rumah  >  Soal Jawab  >  teks badan

java - 分布式环境下,定时任务或异步处理如何保持幂等性?

天蓬老师天蓬老师2763 hari yang lalu785

membalas semua(9)saya akan balas

  • 黄舟

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

    balas
    0
  • PHPz

    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.

    balas
    0
  • 迷茫

    迷茫2017-04-18 09:28:19

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

    balas
    0
  • PHP中文网

    PHP中文网2017-04-18 09:28:19

    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

    balas
    0
  • 大家讲道理

    大家讲道理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

    balas
    0
  • 黄舟

    黄舟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

    balas
    0
  • 巴扎黑

    巴扎黑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.

    balas
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:28:19

    redis + token sudah memadai

    balas
    0
  • PHP中文网

    PHP中文网2017-04-18 09:28:19

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

    balas
    0
  • Batalbalas