Rumah  >  Artikel  >  pangkalan data  >  Mari kita bincangkan secara ringkas tentang dua penyelesaian untuk Redis mengendalikan mati pucuk antara muka.

Mari kita bincangkan secara ringkas tentang dua penyelesaian untuk Redis mengendalikan mati pucuk antara muka.

WBOY
WBOYke hadapan
2022-08-18 17:57:112551semak imbas

Pembelajaran yang disyorkan: Tutorial video Redis

Kata Pengantar: 接口幂等性Masalah, bagi pembangun, adalah isu awam yang tidak berkaitan bahasa. Untuk sesetengah permintaan pengguna, mereka mungkin dihantar berulang kali dalam beberapa kes Jika ia adalah operasi pertanyaan, ia bukan masalah besar, tetapi sesetengah daripadanya melibatkan operasi tulis Setelah berulang, ia mungkin membawa kepada akibat yang serius, seperti transaksi . Jika antara muka diminta berulang kali, pesanan berulang mungkin dibuat. Idepotensi antara muka bermakna bahawa keputusan satu permintaan atau berbilang permintaan yang dimulakan oleh pengguna untuk operasi yang sama adalah konsisten dan tidak akan ada kesan sampingan yang disebabkan oleh berbilang klik.

1. Idempotensi antara muka

1.1. Apakah itu idempotensi antara muka

Dalam HTTP/1.1, idempotensi telah ditakrifkan. Ia menerangkan bahawa satu dan beberapa permintaan untuk sumber harus mempunyai hasil yang sama untuk sumber itu sendiri, iaitu, permintaan pertama mempunyai kesan sampingan pada sumber, tetapi permintaan berikutnya tidak akan mempunyai kesan sampingan pada sumber. Kesan sampingan di sini tidak merosakkan keputusan atau menghasilkan keputusan yang tidak dapat diramalkan. Dalam erti kata lain, sebarang pelaksanaan berbilang mempunyai kesan yang sama ke atas sumber itu sendiri sebagai satu pelaksanaan.

Masalah jenis ini kebanyakannya berlaku dalam antara muka: operasi

  • insert Dalam kes ini, berbilang permintaan mungkin menghasilkan data pendua. Operasi
  • update, jika hanya mengemas kini data, seperti: update user set status=1 where id=1, tiada masalah. Jika terdapat pengiraan, seperti: update user set status=status 1 where id=1, berbilang permintaan dalam kes ini boleh menyebabkan ralat data.

1.2. Mengapakah perlu untuk melaksanakan mati pucuk? berulang kali. Walau bagaimanapun, apabila menghadapi masalah berikut mungkin timbul dalam situasi tertentu, seperti:

Penyerahan berulang borang di bahagian hadapan: Apabila mengisi beberapa borang, pengguna melengkapkan penyerahan, dan banyak lagi. kali pengguna tidak akan diberi jawapan penyerahan yang berjaya dalam masa disebabkan turun naik rangkaian , menyebabkan pengguna berfikir bahawa penyerahan tidak berjaya, dan kemudian terus mengklik butang serah Pada masa ini, penyerahan berulang permintaan borang akan berlaku.

    Pengguna secara berniat jahat melakukan penipuan: Contohnya, apabila melaksanakan fungsi pengundian pengguna, jika pengguna berulang kali menyerahkan undian untuk pengguna, ini akan menyebabkan antara muka menerima maklumat undian yang dihantar berulang kali oleh pengguna, yang akan menjejaskan keputusan pengundian Serius tidak konsisten dengan fakta.
  • Tamat masa antara muka dan penyerahan berulang: Banyak alatan klien HTTP mendayakan mekanisme percubaan semula tamat masa secara lalai, terutamanya apabila pihak ketiga memanggil antara muka Untuk mengelakkan kegagalan permintaan yang disebabkan oleh turun naik rangkaian, tamat masa, dsb., a mekanisme cuba semula akan ditambahkan, menyebabkan permintaan diserahkan beberapa kali.
  • Penggunaan mesej berulang: Apabila menggunakan perisian tengah mesej MQ, jika ralat berlaku dalam perisian tengah mesej dan maklumat penggunaan tidak diserahkan dalam masa, penggunaan berulang akan berlaku.
  • Artikel ini membincangkan cara mengendalikan situasi mati pucuk antara muka ini secara elegan dan seragam pada bahagian pelayan Cara melarang pengguna daripada mengklik berulang kali dan operasi sisi klien yang lain adalah di luar skop perbincangan ini.

1.3. Kesan pada sistem selepas memperkenalkan mati pucuk

Mati pucuk adalah untuk memudahkan pemprosesan logik pelanggan dan boleh meletakkan operasi seperti penyerahan berulang, tetapi ia meningkat Sebab utama adalah :

Tukar fungsi pelaksanaan selari kepada pelaksanaan bersiri, yang mengurangkan kecekapan pelaksanaan.

    Menambahkan logik perniagaan tambahan untuk mengawal idempotence, merumitkan fungsi perniagaan; bahawa, kecuali untuk keperluan perniagaan khas, secara amnya tidak perlu memperkenalkan mati pucuk antara muka.
  • 2. Bagaimana mereka bentuk mati pucuk
  • Mati pucuk bermaksud keunikan sesuatu permintaan. Tidak kira pelan yang anda gunakan untuk mereka bentuk mati pucuk, anda memerlukan ID unik di peringkat global untuk menandakan permintaan ini sebagai unik.

Jika anda menggunakan indeks unik untuk mengawal mati pucuk, maka indeks unik itu unik

Jika anda menggunakan kunci utama pangkalan data untuk mengawal mati pucuk, maka kunci utama adalah unik

Jika anda menggunakan penguncian pesimis, teg asas masih merupakan ID unik global
  • 2.1, ID unik global
  • ID unik global, Bagaimana adakah kita menjananya? Anda boleh memikirkannya, bagaimanakah Id kunci utama pangkalan data dijana?

Ya, kami boleh menggunakan , tetapi kelemahan UUID adalah jelas. Rentetannya memakan banyak ruang, ID yang dijana terlalu rawak, mempunyai kebolehbacaan yang lemah dan tidak meningkat.

Kami juga boleh menggunakan 雪花算法(Snowflake) untuk menjana ID unik.

Algoritma Kepingan Salji ialah algoritma yang menjana ID unik yang diedarkan secara global ID yang dijana dipanggil Snowflake IDs. Algoritma ini dicipta oleh Twitter dan digunakan untuk ID tweet.

ID Snowflake mempunyai 64 bit.

  • Bit 1: Bit panjang tertinggi di Jawa ialah bit tanda, yang mewakili positif dan negatif Nombor positif ialah 0 dan nombor negatif ialah 1. Secara amnya, ID yang dijana adalah positif nombor, jadi lalainya ialah 0.
  • 41 bit seterusnya ialah cap masa, mewakili bilangan milisaat sejak zaman yang dipilih.
  • 10 digit seterusnya mewakili ID komputer untuk mengelakkan konflik.
  • Baki 12 bit mewakili nombor siri yang ID dijana pada setiap mesin, yang membolehkan berbilang ID Snowflake dibuat dalam milisaat yang sama.

Sudah tentu, anda juga boleh menggunakan Baidu Uidgenerator atau Meituan Leaf untuk ID unik global.

2.2. Proses asas reka bentuk idempoten

Proses pemprosesan idempoten, dalam analisis akhir, adalah untuk menapis permintaan yang diterima A全局唯一的ID标记ha. Kemudian, bagaimana untuk menentukan sama ada permintaan telah diterima sebelum ini? Simpan permintaan. Apabila menerima permintaan, semak rekod storan dahulu. Jika rekod wujud, hasil terakhir akan dikembalikan. Jika rekod tidak wujud, permintaan akan diproses.

Pemprosesan idempoten am adalah seperti ini, seperti berikut:

3 Penyelesaian biasa untuk antara muka mati pucuk

3.1 , Lulus. nombor permintaan unik di hiliran

Apa yang anda fikirkan ialah selagi permintaan itu mempunyai nombor permintaan unik, anda boleh menggunakan Redis untuk melakukan penyahduaan ini - selagi nombor permintaan unik itu wujud dalam Redis, ia terbukti Jika diproses, ia dianggap sebagai pendua.

Penerangan projek:

Apa yang dipanggil nombor urutan permintaan unik sebenarnya bermakna setiap kali permintaan dibuat kepada pelayan, ia disertakan dengan nombor urutan unik dan tidak berulang dalam tempoh masa yang singkat. Nombor jujukan boleh menjadi nombor urutan tertib .

Apabila pelayan huluan menerima maklumat permintaan, ia menggabungkan nombor siri dan ID pengesahan hiliran untuk membentuk Kunci untuk mengendalikan Redis, dan kemudian menanyakan Redis untuk melihat sama ada terdapat pasangan nilai kunci untuk yang sepadan Kunci. Menurut Hasilnya:

  • Jika ia wujud, ini bermakna permintaan hiliran untuk nombor jujukan telah diproses pada masa ini, anda boleh terus membalas mesej ralat permintaan berulang .
  • Jika ia tidak wujud, gunakan Kunci sebagai kunci Redis, gunakan maklumat kunci hiliran sebagai nilai yang disimpan (seperti beberapa maklumat logik perniagaan yang diluluskan oleh vendor hiliran), simpan pasangan nilai kunci dalam Redis, dan kemudian laksanakan logik perniagaan yang sepadan secara normal.

Operasi yang berkenaan:

  • Sisip operasi
  • Kemas kini operasi
  • Padam operasi

Sekatan penggunaan :

  • Memerlukan pihak ketiga untuk lulus nombor siri unik; 🎜>
Langkah utama:

Perkhidmatan hiliran menjana ID yang diedarkan sebagai nombor siri, dan kemudian melaksanakan permintaan untuk memanggil antara muka huluan, bersama-sama dengan "nombor siri unik" dan "ID Bukti Kesahan Pengesahan" yang diminta.

Perkhidmatan huluan melaksanakan pengesahan keselamatan dan mengesan sama ada terdapat "nombor siri" dan "ID bukti kelayakan" dalam parameter yang dihantar ke hiliran.

Perkhidmatan huluan mengesan sama ada terdapat Kunci yang terdiri daripada "nombor siri" dan "ID pengesahan" yang sepadan dalam Redis Jika wujud, ia akan membuang mesej pengecualian pelaksanaan berulang dan kemudian membalas hiliran yang sepadan mesej ralat. Jika ia tidak wujud, gabungan "nombor siri" dan "ID pengesahan" akan digunakan sebagai Kunci, dan maklumat kunci hiliran akan digunakan sebagai Nilai, dan kemudian disimpan dalam Redis, dan kemudian logik perniagaan seterusnya akan dilaksanakan secara normal.
  • Dalam langkah di atas, apabila memasukkan data ke dalam Redis, anda mesti menetapkan masa tamat tempoh. Ini memastikan bahawa dalam julat masa ini, jika antara muka dipanggil berulang kali, pertimbangan dan pengenalan boleh dibuat. Jika masa tamat tempoh tidak ditetapkan, kemungkinan besar jumlah data yang tidak terhad akan disimpan dalam Redis, menyebabkan Redis tidak berfungsi dengan betul.
  • 3.2. Token anti-penduaan

Penerangan program:

Sebagai tindak balas kepada klik berterusan pelanggan atau percubaan tamat masa pemanggil semula, dsb. kerana Menghantar pesanan boleh menggunakan mekanisme Token untuk mengelakkan penyerahan berulang. Ringkasnya, pemanggil terlebih dahulu meminta ID global (Token) dari bahagian belakang apabila memanggil antara muka, dan membawa ID global ini bersama permintaan (sebaik-baiknya letakkan Token dalam Pengepala Bahagian belakang perlu menggunakan Token ini . Sebagai Kunci, maklumat pengguna dihantar ke Redis sebagai Nilai untuk pengesahan kandungan nilai utama Jika Kunci wujud dan Nilai sepadan, perintah padam dilaksanakan, dan kemudian logik perniagaan seterusnya dilaksanakan secara normal. Jika tiada Kunci yang sepadan atau Nilai tidak sepadan, mesej ralat berulang akan dikembalikan untuk memastikan operasi idempoten.

Sekatan penggunaan:

  • Perlu menjana rentetan Token yang unik secara global
  • Perlu menggunakan Redis komponen pihak ketiga untuk pengesahan data

Proses utama:

  • Pelayan menyediakan antara muka untuk mendapatkan Token boleh menjadi nombor siri, ID yang diedarkan atau rentetan UUID.

  • Pelanggan memanggil antara muka untuk mendapatkan Token Pada masa ini, pelayan akan menjana rentetan Token.

  • Kemudian simpan rentetan dalam pangkalan data Redis, menggunakan Token sebagai kekunci Redis (perhatikan masa tamat tempoh).

  • Kembalikan Token kepada pelanggan Selepas pelanggan mendapatnya, ia hendaklah disimpan dalam medan tersembunyi borang.

  • Apabila pelanggan melaksanakan dan menyerahkan borang, ia menyimpan Token dalam pengepala dan membawa pengepala bersamanya apabila melaksanakan permintaan perniagaan.

  • Selepas menerima permintaan, pelayan mendapat Token daripada Pengepala, dan kemudian menyemak sama ada kunci wujud dalam Redis berdasarkan Token.

  • Pelayan menentukan sama ada kunci wujud dalam Redis Jika ia wujud, ia memadamkan kunci dan kemudian melaksanakan logik perniagaan seperti biasa. Jika ia tidak wujud, pengecualian akan dilemparkan dan mesej ralat untuk penyerahan berulang akan dikembalikan.

Perhatikan bahawa dalam keadaan serentak, melaksanakan carian dan pemadaman data Redis perlu memastikan atomicity, jika tidak, mati pucuk mungkin tidak dijamin di bawah konkurensi. Pelaksanaannya boleh menggunakan kunci teragih atau menggunakan ungkapan Lua untuk log keluar pertanyaan dan memadam operasi.

Pembelajaran yang disyorkan: Tutorial video Redis

Atas ialah kandungan terperinci Mari kita bincangkan secara ringkas tentang dua penyelesaian untuk Redis mengendalikan mati pucuk antara muka.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:jb51.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam