Dengan modul nginx, HttpLimitReq, permintaan dapat dibatasi oleh IP. Namun, saya tidak mengerti apa yang dilakukan opsi "nodelay".
Jika kelebihan permintaan dalam batas burst burst tidak diperlukan, Anda harus menggunakan nodelay
limit_req zone=one burst=5 nodelay;
sumber
TL; DR: Opsi nodelay berguna jika Anda ingin memaksakan batas tarif tanpa membatasi jarak yang diizinkan antara permintaan.
Saya kesulitan mencerna jawaban lain, dan kemudian saya menemukan dokumentasi baru dari Nginx dengan contoh-contoh yang menjawab ini: https://www.nginx.com/blog/rate-limiting-nginx/
Inilah bagian yang bersangkutan. Diberikan:
Jika Anda menambahkan nodelay:
sumber
Cara saya melihatnya adalah sebagai berikut:
Permintaan akan dilayani secepat mungkin sampai tingkat zona terlampaui. Nilai zona "rata-rata", jadi jika nilai Anda
1r/s
dan meledak10
Anda dapat memiliki 10 permintaan di jendela 10 detik.Setelah tingkat zona terlampaui:
Sebuah. Tanpa
nodelay
, permintaan lebih lanjut hinggaburst
akan ditunda.b. Dengan
nodelay
, permintaan lebih lanjut hinggaburst
akan dilayani secepat mungkin.Setelah
burst
terlampaui, server akan mengembalikan respons kesalahan hingga jendela burst berakhir. mis. untuk rate1r/s
dan burst10
, klien perlu menunggu hingga 10 detik untuk permintaan yang diterima berikutnya.sumber
Pengaturan menentukan apakah permintaan akan ditunda sehingga mereka sesuai dengan tarif yang diinginkan atau apakah mereka akan ditolak ... agaknya apakah pembatasan tarif dikelola oleh server atau tanggung jawab diteruskan ke klien.
nodelay
menyajikanPermintaan akan ditangani secepat mungkin; setiap permintaan yang dikirim melebihi batas yang ditentukan akan ditolak dengan kode yang ditetapkan sebagai
limit_req_status
nodelay
absen (alias tertunda)Permintaan akan ditangani pada tingkat yang sesuai dengan batas yang ditentukan. Jadi misalnya jika tingkat ditetapkan 10 req / s maka setiap permintaan akan ditangani dalam> = .1 (1 / tingkat) detik, dengan demikian tidak memungkinkan tingkat dilampaui, tetapi memungkinkan permintaan untuk didukung. Jika cukup banyak permintaan kembali untuk meluapkan ember (yang juga akan dicegah dengan batas koneksi bersamaan), maka permintaan ditolak dengan kode yang ditetapkan sebagai
limit_req_status
.Rincian berdarah ada di sini: https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_limit_req_module.c#L263 di mana logika itu menendang ketika batas belum dilewati dan sekarang penundaan secara opsional akan diterapkan pada permintaan. Penerapan
nodelay
khususnya dari arahan mulai berlaku di sini: https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_limit_req_module.c#L495 menyebabkan nilai didelay
atas menjadi 0 yang memicu bahwa handler untuk segera mengembalikanNGX_DECLINED
yang meneruskan permintaan ke handler berikutnya (daripadaNGX_AGAIN
yang secara efektif akan meminta untuk diproses lagi).sumber
Saya tidak mengerti bahwa pada saat pertama kali saya membaca pengantar dari https://www.nginx.com/blog/rate-limiting-nginx/ .
Sekarang saya yakin saya mengerti dan jawaban saya sejauh ini adalah yang terbaik. :)
Misalkan:
10r/s
diatur, kapabilitas maks server adalah mis.10000r/s
Yang ada10r/ms
dan hanya ada 1 klien saat ini.Jadi, inilah perbedaan utama antara
10r/s per IP burst=40 nodelay
dan10r/s per IP burst=40
.Ketika https://www.nginx.com/blog/rate-limiting-nginx/ mendokumentasikan ( Saya sangat menyarankan membaca artikel terlebih dahulu (kecuali bagian Pembatas Tingkat Dua Tahap )), perilaku ini memperbaiki satu masalah. Yang mana?:
Periksa draf yang saya buat,
40th
permintaan mendapat tanggapan1s
sementara yang lain40th
mendapat tanggapan4s
.Ini dapat memanfaatkan kapabilitas server sebaik mungkin: mengirim kembali respons secepat mungkin sambil tetap menjaga
x r/s
batasan untuk klien / IP tertentu.Tetapi ada juga biaya di sini. Biaya akan menjadi:
Jika Anda memiliki banyak klien yang antri di server, misalkan klien
A
,B
danC
.Tanpa
nodelay
, permintaan dilayani dalam urutan yang mirip denganABCABCABC
.Dengan
nodelay
, pesanan lebih mungkin terjadiAAABBBCCC
.Saya ingin meringkas artikel https://www.nginx.com/blog/rate-limiting-nginx/ di sini.
Di atas segalanya, konfigurasi yang paling penting adalah
x r/s
.x r/s
hanya saja, kelebihan permintaan ditolak dengan segera.x r/s
+burst
, kelebihan permintaan diantri.1.
vs2.
, biayanya adalah bahwa di sisi klien, permintaan yang antri mengambil peluang reuqests nanti yang akan memiliki kesempatan untuk dilayani.Misalnya,
10r/s burst=20
vs10r/s
,11th
permintaan seharusnya ditolak segera di bawah kondisi yang terakhir, tetapi sekarang sedang antri dan akan dilayani. The11th
permintaan memakan21th
kesempatan permintaan ini.x r/s
+burst
+nodelay
, sudah dijelaskan.PS Bagian Pembatasan Tingkat Dua Tahap pada artikel ini sangat membingungkan. Saya tidak mengerti tapi sepertinya tidak masalah.
Sebagai contoh:
8 r / d? serius? Ada 17 permintaan dalam 3 detik yang ditunjukkan pada gambar, 17/3 = 8?
sumber