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.
Untuk senario pengehad arus umum, ia mempunyai dua dimensimaklumat:
sambungan. Untuk data dan QPS) pengehadan semasa, kita boleh menetapkan pengehadan semasa dalam dimensi IP, atau kita boleh menetapkan pengehadan semasa berdasarkan pelayan tunggal.
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 penghantaranSemua 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 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.
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:
Token Baldi Algoritma baldi token pada masa ini merupakan algoritma pengehad semasa yang paling banyak digunakan Seperti namanya, ia mempunyai dua peranan penting berikut:
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.
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
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 1
,Server 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
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:
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 arusDalam 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 kadarKita perlu menggunakan
untuk menghadkan bilangan permintaan setiap unit masa, iaitu had kadar,limit_req_zone
Oleh 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.
burst=4
bermaksud setiap IP Allow up kepada 4 permintaan pecahburst=4
意思是每个IP最多允许4个突发请求
控制并发数
利用 limit_conn_zone
和 limit_conn
两个指令即可控制并发数
其中 limit_conn perip 10
表示限制单个 IP 同时最多能持有 10 个连接;limit_conn perserver 100
Kawal bilangan konkurensiGunakan
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 🎜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
1) Tomcat menggunakan maxThreads untuk melaksanakan pengehadan semasa.
2) Nginx limit_req_zone
dan pecah ke melaksanakan pengehadan kadar. limit_req_zone
和 burst来实现速率限流。
3)Nginx的limit_conn_zone
和 limit_conn
两个指令控制并发连接的总数。
4)时间窗口算法借助 Redis的有序集合可以实现。
5)漏桶算法可以使用Redis-Cell来实现。
6)令牌算法可以解决Google的guava包来实现。
需要注意的是借助Redis实现的限流方案可用于分布式系统,而guava实现的限流只能应用于单机环境。如果你觉得服务器端限流麻烦,可以在不改任何代码的情况下直接使用容器限流(Nginx或Tomcat),但前提是能满足项目中的业务需求。
Tomcat 8.5 版本的最大线程数在 conf/server.xml
limit_conn_zone
andlimit_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. 🎜
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!