Rumah  >  Artikel  >  Fahami had semasa dan penyelesaian biasa dalam sepuluh minit!

Fahami had semasa dan penyelesaian biasa dalam sepuluh minit!

Java后端技术全栈
Java后端技术全栈ke hadapan
2023-08-15 16:15:432008semak imbas

Baru-baru ini, saya menerima maklum balas temu bual daripada beberapa netizen, dan mereka semua ditanya menghadkan semasasoalan berkaitan semasa temu duga Mari kita bercakap tentang pelbagai penyelesaian pengehadan semasa dalam projek kami hari ini.

Konsep asas pengehadan semasa

Untuk senario pengehad arus umum, ia mempunyai dua dimensimaklumat:

  • julat masa tertentu adalah berdasarkan masa tertentu dalam julat masa tertentu , Ia adalah apa yang sering kita panggil "tetingkap masa", seperti mengehadkan tetingkap masa seminit dan sesaat
  • Sumber adalah berdasarkan pengehadan sumber yang ada, seperti menetapkan bilangan maksimum lawatan atau bilangan maksimum sambungan yang tersedia
Menggabungkan dua dimensi di atas, pengehadan semasa adalah untuk mengehadkan akses sumber dalam tetingkap masa tertentu, seperti menetapkan maksimum 100 permintaan akses sesaat. Tetapi dalam senario sebenar, kami bukan sahaja menyediakan satu peraturan pengehad semasa, tetapi juga menyediakan berbilang peraturan pengehadan semasa untuk berfungsi bersama Peraturan pengehad semasa utama adalah seperti berikut:

QPS dan kawalan nombor sambungan

Untuk (

sambungan. Untuk data dan QPS) pengehadan semasa, kita boleh menetapkan pengehadan semasa dalam dimensi IP, atau kita boleh menetapkan pengehadan semasa berdasarkan pelayan tunggal.

Fahami had semasa dan penyelesaian biasa dalam sepuluh minit!Gambar
Dalam persekitaran sebenar, peraturan pengehadan semasa dalam pelbagai dimensi biasanya ditetapkan, seperti menetapkan kekerapan akses IP yang sama kepada kurang daripada 10 sesaat, bilangan sambungan kepada kurang daripada 5, dan kemudian menetapkan QPS maksimum setiap mesin kepada 1000 , bilangan maksimum sambungan dikekalkan pada 200. Tambahan pula, kita boleh merawat kumpulan pelayan atau pelayan di seluruh bilik komputer secara keseluruhan dan menetapkan peraturan pengehad semasa peringkat lebih tinggi Semua peraturan pengehadan semasa ini akan berfungsi bersama untuk kawalan trafik.

Kadar penghantaran

Semua orang biasa dengan "kadar penghantaran", seperti kelajuan muat turun sumber. Sesetengah tapak web mempunyai logik pengehad semasa yang lebih terperinci di kawasan ini Contohnya, kelajuan muat turun untuk pengguna berdaftar biasa ialah 100k/s, dan selepas membeli keahlian, ia adalah 10M/s Di belakang ini adalah logik pengehad semasa berdasarkan kumpulan pengguna atau tag pengguna.

Senarai hitam putih

Senarai hitam putih ialah cara yang sangat biasa untuk mengehadkan dan melepaskan trafik dalam aplikasi perusahaan besar, dan senarai hitam putih sering berubah secara dinamik. Sebagai contoh, jika IP telah dilawati terlalu kerap dalam tempoh masa dan dikenal pasti oleh sistem sebagai pengguna robot atau serangan trafik, maka IP tersebut akan ditambahkan ke senarai hitam, dengan itu menyekat aksesnya kepada sumber sistem apa yang biasa kita kenali sebagai "penyekatan IP".

Atur cara perangkak yang biasa kita lihat, seperti gambar merangkak wanita cantik di Zhihu, atau merangkak maklumat perkongsian masa stok pada sistem pembrokeran, program perangkak ini mesti melaksanakan fungsi menukar IP untuk mengelakkan daripada ditambah ke senarai hitam.

Kadang-kadang kami juga mendapati rangkaian syarikat tidak boleh mengakses laman web awam yang besar seperti 12306. Ini juga kerana alamat IP keluar sesetengah syarikat adalah alamat yang sama, oleh itu, apabila bilangan lawatan terlalu tinggi, alamat IP ini akan digunakan oleh pihak yang satu lagi pengenalan sistem dan kemudian ditambahkan ke senarai hitam. Pelajar yang menggunakan jalur lebar rumah harus tahu bahawa kebanyakan pengendali rangkaian akan memperuntukkan pengguna kepada segmen IP keluar yang berbeza, atau menukar alamat IP pengguna secara dinamik dari semasa ke semasa.

Senarai putih lebih mudah difahami Ia sama dengan memiliki pingat emas yang diberikan oleh keluarga diraja Anda boleh secara bebas melalui pelbagai peraturan had semasa tanpa sebarang halangan. Sebagai contoh, sesetengah syarikat e-dagang akan menambahkan akaun penjual yang sangat besar ke senarai putih, kerana penjual sedemikian sering mempunyai sistem operasi dan penyelenggaraan mereka sendiri dan perlu bersambung dengan sistem IT syarikat untuk melaksanakan sejumlah besar keluaran produk, penambahan semula. , dsb. Di samping itu, cari bahagian belakang akaun awam Bulatan Teknologi Pengaturcaraan dan balas "Java" untuk mendapatkan pakej hadiah kejutan.

Persekitaran teragih

Diedarkan berbeza daripada senario pengehad arus mesin tunggal Ia menganggap semua pelayan dalam keseluruhan persekitaran teragih secara keseluruhan. Sebagai contoh, untuk pengehadan semasa IP, kami mengehadkan satu IP kepada maksimum 10 lawatan sesaat Tidak kira mesin mana permintaan daripada IP ini digunakan, selagi ia mengakses nod perkhidmatan dalam kelompok, ia akan tertakluk kepada. mengehadkan semasa.

Lebih baik kami menyimpan maklumat pengehad semasa dalam komponen "berpusat" supaya ia boleh mendapatkan status akses semua mesin dalam kelompok Pada masa ini, terdapat dua penyelesaian pengehad arus perdana:

  • Penghad arus lapisan gerbang. menggunakan peraturan pengehadan semasa ke pintu masuk semua trafik
  • Penghadan arus perisian tengah menyimpan maklumat pengehad semasa dalam perisian tengah dalam persekitaran teragih (seperti cache Redis), dan setiap komponen boleh mengaksesnya dari sini Dapatkan statistik trafik di masa semasa untuk memutuskan sama ada untuk menafikan perkhidmatan atau membenarkan trafik
  • sentinel, komponen yang dibuat khusus oleh ekosistem springcloud untuk perkhidmatan mikro untuk pengehadan arus teragih, degradasi pemutus litar dan komponen lain

Algoritma yang biasa digunakan untuk pengehadan semasa skema

Algoritma Token Baldi

Token Baldi Algoritma baldi token pada masa ini merupakan algoritma pengehad semasa yang paling banyak digunakan Seperti namanya, ia mempunyai dua peranan penting berikut:

  • Token hanya akan diproses selepas mendapat token Permintaan lain sama ada beratur atau dibuang terus
  • Semua Permintaan mendapatkan token daripada baldi ini
  • Penjanaan token
Proses ini melibatkan penjana token dan baldi token tadi kami sebutkan bahawa baldi token adalah tempat untuk token, maka mesti ada kapasiti, yang bermaksud bahawa bilangan token yang boleh disimpan oleh baldi token adalah nilai tetap.

Untuk penjana token, ia akan menambah token pada baldi mengikut kadar yang telah ditetapkan Sebagai contoh, kita boleh mengkonfigurasinya untuk mengeluarkan token pada kadar 100 permintaan sesaat, atau 50 seminit. Ambil perhatian bahawa kelajuan pengeluaran di sini adalah seragam, yang bermaksud bahawa 50 token ini tidak dikeluarkan sekaligus pada permulaan setiap tetingkap masa, tetapi akan dikeluarkan pada kelajuan seragam dalam tetingkap masa ini.

Dispenser token ialah faucet Jika baldi penampung air di bawah penuh, maka air (token) secara semula jadi akan mengalir ke luar. Perkara yang sama berlaku dalam proses pengeluaran token Kapasiti baldi token adalah terhad Jika token kapasiti undian sedang diisi, token baharu akan dibuang.

  • Pemerolehan token
Selepas setiap permintaan akses tiba, token mesti diperolehi untuk melaksanakan logik seterusnya. Jika bilangan token adalah kecil dan terdapat banyak permintaan akses, sesetengah permintaan secara semula jadi tidak akan dapat mendapatkan token Pada masa ini, kami boleh menyediakan "baris gilir penimbal" untuk menyimpan token berlebihan ini buat sementara waktu.

Baris gilir penimbal sebenarnya adalah pilihan pilihan, dan bukan semua program yang menggunakan algoritma baldi token akan melaksanakan baris gilir. Apabila terdapat baris gilir cache, permintaan yang belum memperoleh token akan dibariskan dalam baris gilir ini sehingga token baharu dijana, dan kemudian permintaan diambil daripada ketua baris gilir untuk memadankan token.

Apabila baris gilir penuh, permintaan akses ini akan dibuang. Dalam aplikasi praktikal, kami juga boleh menambah satu siri kesan khas pada baris gilir ini, seperti menetapkan masa kemandirian permintaan dalam baris gilir, atau menukar baris gilir menjadi PriorityQueue, mengisih mengikut keutamaan tertentu dan bukannya masuk dahulu, keluar dahulu .

Algoritma Baldi Bocor

Algoritma pengehad semasa berkaitan dengan baldi Jadi apakah perbezaan antara baldi bocor dan baldi token? baldi. Tetapi objek operasi adalah berbeza Baldi Token meletakkan token ke dalam baldi, manakala baldi bocor meletakkan paket permintaan akses ke dalam baldi. Begitu juga, jika baldi penuh, paket yang masuk akan dibuang.

Separuh kedua algoritma baldi bocor adalah tersendiri. Ia akan sentiasa mengalir keluar paket data dari baldi pada kadar yang tetap. Sebagai contoh, jika saya menyediakan baldi bocor untuk menyimpan 100 paket data, dan kemudian kelajuan aliran keluar adalah satu sesaat, maka tidak kira kadar aliran paket data ke dalam baldi, atau berapa banyak paket data yang terdapat dalam baldi, baldi bocor boleh menjamin data ini Paket sentiasa diproses pada kadar tetap satu saat. Selain itu, cari bahagian belakang arkitek bahagian belakang akaun awam dan balas "seni bina bersih" untuk mendapatkan pakej hadiah kejutan.

  • Perbezaan antara baldi bocor vs baldi token

Tidak sukar untuk dilihat berdasarkan ciri masing-masing kedua-dua algoritma mempunyai kadar "malar" dan kadar "tidak tentu". Baldi token mencipta token pada kadar yang tetap, tetapi kadar permintaan akses mendapatkan token adalah "tidak tetap". Baldi bocor memproses permintaan pada kadar "malar", tetapi kadar permintaan ini mengalir ke baldi ialah "pembolehubah".

Daripada dua ciri ini, ciri semula jadi baldi bocor menentukan bahawa ia tidak akan mengalami trafik pecah Walaupun 1,000 permintaan sesaat tiba, kadar aksesnya kepada output perkhidmatan latar belakang akan sentiasa tetap. Baldi token adalah berbeza. Cirinya boleh "menyimpan" jumlah token tertentu Oleh itu, semua token boleh digunakan dalam masa yang singkat apabila menangani trafik secara tiba-tiba baldi, tetapi ia dipandu Tekanan pada sistem bahagian belakang juga akan meningkat dengan sewajarnya.

Tetingkap Gelongsor

Sebagai contoh, kami mempunyai 5 pengguna melawat setiap saat, dan 10 pengguna melawat dalam saat ke-5, maka bilangan lawatan dalam tetingkap masa 0 hingga 5 saat ialah 15. Jika antara muka kami menetapkan had atas akses dalam tetingkap masa kepada 20, maka apabila masa mencapai saat keenam, jumlah kiraan dalam tetingkap masa ini menjadi 10, kerana grid 1 saat telah keluar dari tetingkap masa, jadi dalam Nombor daripada lawatan yang boleh diterima dalam saat keenam ialah 20-10=10.

Tetingkap gelongsor sebenarnya adalah algoritma kalkulator Ia mempunyai ciri tersendiri Apabila rentang masa lebih panjang, kesan pengehadan semasa akan menjadi lebih lancar. Sebagai contoh, jika tetingkap masa semasa hanya dua saat, dan semua permintaan akses tertumpu pada saat pertama, apabila masa meluncur ke belakang satu saat, kiraan tetingkap semasa akan berubah dengan banyak Memanjangkan tetingkap masa boleh Mengurangkan kebarangkalian daripada ini berlaku

Penyelesaian pengehad semasa yang biasa digunakan

Pengehadan arus pengesahan kesahihan

Seperti kod pengesahan, senarai hitam IP, dsb. Cara ini boleh menghalang serangan berniat jahat dan pengumpulan semasa crawler

; Dalam bidang pengehadan semasa, Guava menyediakan [

] di bawah modul berbilang benangnya Kedua-dua pelayan telah menggunakan perkhidmatan log masuk Jika saya ingin mengawal trafik kedua-dua mesin ini, sebagai contoh, Jumlah lawatan kedua-dua mesin dikawal dalam masa 20 sesaat Jika anda menggunakan Jambu Batu, anda hanya boleh mengawal bilangan lawatan setiap mesin secara bebas RateLimiter为首的几个限流支持类,但是作用范围仅限于“当前”这台服务器,也就是说Guawa的限流是单机的限流,跨了机器或者jvm进程就无能为力了比如说,目前我有2台服务器[Server 1Server 2

Walaupun Jambu Batu bukanlah penyelesaian untuk sistem teragih, sebagai komponen pengehad arus sisi pelanggan yang ringkas dan ringan, ia amat sesuai untuk menerangkan algoritma pengehad semasa

Penghad arus lapisan gerbang

Gerbang perkhidmatan, kerana keseluruhan sistem yang diedarkan. tahap pertama dalam pautan mengendalikan semua permintaan pengguna, jadi mengehadkan trafik pada tahap get laluan adalah titik permulaan yang baik dari atas ke bawah ialah:

  1. Trafik pengguna dimajukan dari lapisan get laluan ke bahagian belakang
  2. Perkhidmatan latar belakang menerima trafik dan memanggil cache untuk mendapatkan data
  3. Jika tiada data dalam cache, akses pangkalan data
  4. Trafik berkurangan lapisan demi lapisan dari atas ke bawah, dan yang terbesar dan paling padat lalu lintas dikumpulkan pada lapisan get laluan Permintaan akses pengguna, diikuti dengan perkhidmatan latar belakang.

Selepas lulus logik pengesahan perkhidmatan latar belakang, beberapa permintaan yang salah dipadamkan, dan permintaan yang selebihnya jatuh pada cache Jika tiada data dalam cache, pangkalan data di bahagian bawah corong akan diminta, jadi bilangan permintaan di peringkat pangkalan data adalah yang paling kecil (berbanding Untuk komponen lain, pangkalan data selalunya yang mempunyai kapasiti konkurensi yang paling teruk. Walaupun MySQL Alibaba telah mengalami banyak pengubahsuaian, konkurensi mesin tunggal tidak boleh dibandingkan dengan komponen seperti Redis dan Kafka.)

Lapisan gerbang arus perdana semasa ialah Nginx yang diwakili oleh perisian, serta komponen lapisan pintu masuk seperti Gateway dan Zuul dalam Spring Cloud

Menginx mengehadkan arus

Dalam seni bina sistem, Nginx's pemajuan proksi dan penghalaan adalah sangat penting sebagai Fungsi lapisan get laluan, kerana reka bentuk Nginx yang ringan dan cemerlang, ia telah menjadi pilihan pertama banyak syarikat Dari perspektif pintu masuk, Nginx boleh digunakan sebagai gerbang paling hadapan untuk menahan kebanyakan trafik rangkaian, jadi Nginx digunakan untuk Pengehadan semasa juga merupakan pilihan yang baik Dalam Nginx, konfigurasi dasar yang biasa digunakan berkaitan dengan pengehadan semasa juga disediakan

Nginx menyediakan dua kaedah pengehadan semasa: satu adalah untuk mengawal kadar, dan yang lain adalah untuk mengawal nombor sambungan.

Kawal kadar

Kita perlu menggunakan

untuk menghadkan bilangan permintaan setiap unit masa, iaitu had kadar,

limit_req_zoneOleh kerana statistik had semasa Nginx adalah berdasarkan milisaat, kelajuan yang kita tetapkan ialah 2r/s , tukarkannya Iaitu, IP tunggal hanya dibenarkan untuk lulus satu permintaan dalam masa 500 milisaat, dan permintaan kedua hanya dibenarkan lulus bermula dari 501ms.

  • Versi kawalan kadar yang dioptimumkan
  • Walaupun kawalan kadar di atas sangat tepat, ia terlalu keras dalam persekitaran pengeluaran, kita harus mengawal jumlah akses dalam unit IP jumlah masa, bukannya seperti Seperti di atas, ia adalah tepat kepada milisaat Kita boleh menggunakan kata kunci pecah untuk menghidupkan tetapan ini

burst=4bermaksud setiap IP Allow up kepada 4 permintaan pecahburst=4意思是每个IP最多允许4个突发请求

控制并发数

利用 limit_conn_zonelimit_conn 两个指令即可控制并发数

其中 limit_conn perip 10 表示限制单个 IP 同时最多能持有 10 个连接;limit_conn perserver 100

Kawal bilangan konkurensi

Gunakan limit_conn_zone dan limit_conn code > Dua arahan boleh mengawal bilangan concurrency<p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;"><strong>Antaranya<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color : rgba(27, 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb> limit_conn perip 10 bermaksud mengehadkan satu IP untuk menampung sehingga 10 sambungan pada masa yang sama limit_conn perserver 100 bermakna pelayan boleh mengendalikan sejumlah 100 sambungan serentak pada masa yang sama.

Nota: Sambungan ini hanya dikira selepas pengepala permintaan diproses oleh bahagian belakang.

Penghad arus perisian tengah

Untuk persekitaran teragih, ia tidak lebih daripada tempat seperti nod pusat untuk menyimpan data terhad semasa. Sebagai contoh, jika saya ingin mengawal kadar akses antara muka kepada 100 permintaan sesaat, maka saya perlu menyimpan bilangan permintaan yang diterima dalam 1 semasa di suatu tempat, dan membenarkan semua nod dalam persekitaran kluster untuk mengakses. Jadi apakah teknologi yang boleh kita gunakan untuk menyimpan data sementara ini?

Kemudian semua orang mesti berfikir bahawa ia mesti redis Menggunakan ciri masa tamat tempoh Redis, kita boleh menetapkan jangka masa had semasa (seperti 10 permintaan sesaat, atau 10 permintaan setiap 10 saat). Pada masa yang sama, Redis juga mempunyai kemahiran khas - pengaturcaraan skrip Kami boleh menulis logik mengehadkan semasa ke dalam skrip dan menanamnya ke dalam Redis Ini sepenuhnya memisahkan tanggungjawab mengehadkan semasa daripada lapisan perkhidmatan ciri konkurensi yang berkuasa dan tinggi Seni bina kluster yang tersedia juga boleh menyokong akses terhad semasa kepada kluster besar (

reids + lua

). 🎜🎜🎜Komponen pengehad semasa🎜🎜🎜Selain kaedah yang diperkenalkan di atas, pada masa ini terdapat beberapa komponen sumber terbuka yang menyediakan fungsi yang serupa, seperti Sentinel, yang merupakan pilihan yang baik. Sentinel ialah komponen sumber terbuka yang dihasilkan oleh Alibaba dan disertakan dalam pustaka komponen Spring Cloud Alibaba Sentinel menyediakan set API yang kaya untuk pengehadan semasa dan konsol pengurusan visual, yang boleh membantu kami menguruskan pengehadan semasa 🎜

Pertimbangkan reka bentuk mengehadkan semasa daripada dimensi seni bina

Dalam projek sebenar, hanya satu kaedah mengehadkan semasa akan digunakan Beberapa kaedah sering digunakan bersama-sama antara satu sama lain untuk memberikan strategi pengehad semasa rasa hierarki dan mencapai tahap. penggunaan sumber secara maksimum. Dalam proses ini, reka bentuk strategi pengehad semasa juga boleh merujuk kepada model corong yang dinyatakan sebelum ini, yang lebar di bahagian atas dan ketat di bahagian bawah Reka bentuk skema pengehad semasa untuk bahagian corong yang berbeza harus diberi perhatian ketersediaan tinggi komponen semasa.

Ambil projek sebenar yang saya sertai sebagai contoh, kami membangunkan antara muka untuk halaman butiran produk Melalui lencongan Taobao mudah alih, permintaan akses pada bahagian apl akan melalui gerbang mtop Alibaba , pengehadan semasa kami akan dilakukan secara agak longgar, tunggu sehingga permintaan mencapai perkhidmatan halaman butiran produk bahagian belakang melalui gerbang, dan kemudian gunakan satu siri komponen pengehad perisian tengah + semasa untuk melaksanakan kawalan pengehadan arus yang lebih terperinci pada perkhidmatan

. Cara khusus untuk melaksanakan pengehadan semasa

1) Tomcat menggunakan maxThreads untuk melaksanakan pengehadan semasa.

2) Nginx limit_req_zonedan pecah ke melaksanakan pengehadan kadar. limit_req_zone和 burst来实现速率限流。

3)Nginx的limit_conn_zonelimit_conn两个指令控制并发连接的总数。

4)时间窗口算法借助 Redis的有序集合可以实现。

5)漏桶算法可以使用Redis-Cell来实现。

6)令牌算法可以解决Google的guava包来实现。

需要注意的是借助Redis实现的限流方案可用于分布式系统,而guava实现的限流只能应用于单机环境。如果你觉得服务器端限流麻烦,可以在不改任何代码的情况下直接使用容器限流(Nginx或Tomcat),但前提是能满足项目中的业务需求。

Tomcat限流

Tomcat 8.5 版本的最大线程数在 conf/server.xml

3) Nginx limit_conn_zoneandlimit_connKedua-dua arahan mengawal jumlah bilangan sambungan serentak .

4) Algoritma tetingkap masa boleh dilaksanakan dengan bantuan koleksi pesanan Redis. 🎜🎜5) Algoritma baldi bocor boleh dilaksanakan menggunakan Redis-Cell. 🎜🎜6) Algoritma token boleh dilaksanakan dengan menyelesaikan pakej jambu Google. 🎜
Perlu diambil perhatian bahawa skim pengehadan semasa yang dilaksanakan dengan Redis boleh digunakan Sistem teragih, dan pengehadan semasa yang dilaksanakan oleh jambu batu hanya boleh digunakan pada persekitaran yang berdiri sendiri. Jika anda mendapati pengehadan semasa sebelah pelayan menyusahkan, anda boleh terus menggunakan pengehadan arus kontena (Nginx atau Tomcat) tanpa mengubah sebarang kod, tetapi hanya jika ia dapat memenuhi keperluan perniagaan projek. 🎜

Had semasa Tomcat h4 >🎜Bilangan maksimum utas dalam versi Tomcat 8.5 ialah conf / Dalam konfigurasi server.xml, maxThreads ialah bilangan maksimum utas Tomcat Apabila konkurensi permintaan lebih besar daripada nilai ini (maxThreads), permintaan akan dibariskan untuk pelaksanaan, sekali gus melengkapkan tujuan semasa. mengehadkan. 🎜🎜Nota:🎜Nilai

MaxThreads boleh dinaikkan secara lalai kepada 150 (Tomcat versi 8.5), tetapi nilai ini tidak lebih besar, lebih baik Ia bergantung pada konfigurasi pelayan tertentu ruang memori digunakan sebagai timbunan benang, dan lebih banyak benang, semakin berat beban GC.

Akhir sekali, perlu diingatkan bahawa sistem pengendalian mempunyai sekatan tertentu pada bilangan utas dalam proses. Bilangan utas dalam setiap proses Windows tidak dibenarkan melebihi 2000, dan bilangan utas dalam setiap proses. Linux tidak dibenarkan melebihi 1000.

Atas ialah kandungan terperinci Fahami had semasa dan penyelesaian biasa dalam sepuluh minit!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:Java后端技术全栈. Jika ada pelanggaran, sila hubungi admin@php.cn Padam