Nginx - Apa yang dilakukan opsi nodelay ketika membatasi permintaan?


11

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;

Jawaban:


11

Dokumentasi di sini memiliki penjelasan yang terdengar seperti apa yang ingin Anda ketahui:

Arahan menentukan zona (zona) dan semburan permintaan maksimum (burst). Jika nilai melebihi permintaan yang diuraikan dalam zona, permintaan ditunda, sehingga permintaan diproses dengan kecepatan tertentu

Dari apa yang saya mengerti, permintaan lebih meledak akan tertunda (mengambil lebih banyak waktu dan menunggu sampai mereka dapat dilayani), dengan nodelayopsi penundaan itu tidak digunakan dan permintaan berlebih ditolak dengan kesalahan 503.

Posting blog ini ( archive.org ) memberikan penjelasan yang bagus bagaimana pembatasan kecepatan berfungsi pada nginx:

Jika Anda seperti saya, Anda mungkin bertanya-tanya apa arti sebenarnya sih meledak. Berikut adalah triknya: ganti kata 'burst' dengan 'bucket', dan anggap setiap pengguna diberi sebuah ember dengan 5 token. Setiap kali mereka melebihi tingkat 1 permintaan per detik, mereka harus membayar token. Setelah mereka menghabiskan semua token mereka, mereka diberi pesan kesalahan HTTP 503, yang pada dasarnya telah menjadi standar untuk 'mundur, man!'.


4
Saya pikir Anda salah, manual nginx menyatakan: "Permintaan berlebihan ditunda hingga jumlahnya melebihi ukuran burst maksimum". Perhatikan bahwa hingga melebihi burst maksimum, artinya sama sekali berbeda dengan over burst yang Anda katakan. Anda juga menyatukan burst dengan permintaan berlebih , saya yakin permintaan berlebih berarti itu di atas zona, sementara itu mungkin masih di bawah burst maksimum .
Hendy Irawan

10

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:

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;

location /login/ {
  limit_req zone=mylimit burst=20;
  ...
}

Parameter burst mendefinisikan berapa banyak permintaan yang dapat dibuat klien melebihi tingkat yang ditentukan oleh zona (dengan zona mylimit sampel kami, batas laju adalah 10 permintaan per detik, atau 1 setiap 100 milidetik). Permintaan yang tiba lebih cepat dari 100 milidetik setelah yang sebelumnya dimasukkan dalam antrian, dan di sini kami menetapkan ukuran antrian menjadi 20.

Itu berarti jika 21 permintaan tiba dari alamat IP yang diberikan secara bersamaan, NGINX meneruskan yang pertama ke grup server hulu segera dan menempatkan 20 sisanya dalam antrian. Kemudian meneruskan permintaan yang antri setiap 100 milidetik, dan mengembalikan 503 ke klien hanya jika permintaan masuk membuat jumlah permintaan yang antri melebihi 20.

Jika Anda menambahkan nodelay:

location /login/ {
  limit_req zone=mylimit burst=20 nodelay;
  ...
}

Dengan parameter nodelay, NGINX masih mengalokasikan slot dalam antrian sesuai dengan parameter burst dan memaksakan batas tingkat yang dikonfigurasi, tetapi tidak dengan menjabarkan penerusan permintaan antrian. Alih-alih, ketika permintaan tiba "terlalu cepat", NGINX langsung meneruskannya selama ada slot yang tersedia untuk itu dalam antrian. Ini menandai slot itu sebagai "diambil" dan tidak membebaskannya untuk digunakan oleh permintaan lain sampai waktu yang sesuai telah berlalu (dalam contoh kami, setelah 100 milidetik).


6

Cara saya melihatnya adalah sebagai berikut:

  1. Permintaan akan dilayani secepat mungkin sampai tingkat zona terlampaui. Nilai zona "rata-rata", jadi jika nilai Anda 1r/sdan meledak 10Anda dapat memiliki 10 permintaan di jendela 10 detik.

  2. Setelah tingkat zona terlampaui:

    Sebuah. Tanpa nodelay, permintaan lebih lanjut hingga burstakan ditunda.

    b. Dengan nodelay, permintaan lebih lanjut hingga burstakan dilayani secepat mungkin.

  3. Setelah burstterlampaui, server akan mengembalikan respons kesalahan hingga jendela burst berakhir. mis. untuk rate 1r/sdan burst 10, klien perlu menunggu hingga 10 detik untuk permintaan yang diterima berikutnya.


3

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 menyajikan

Permintaan akan ditangani secepat mungkin; setiap permintaan yang dikirim melebihi batas yang ditentukan akan ditolak dengan kode yang ditetapkan sebagailimit_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 nodelaykhususnya 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 di delayatas menjadi 0 yang memicu bahwa handler untuk segera mengembalikan NGX_DECLINEDyang meneruskan permintaan ke handler berikutnya (daripada NGX_AGAINyang secara efektif akan meminta untuk diproses lagi).


1

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/sdiatur, kapabilitas maks server adalah mis. 10000r/sYang ada 10r/msdan hanya ada 1 klien saat ini.

Jadi, inilah perbedaan utama antara 10r/s per IP burst=40 nodelaydan 10r/s per IP burst=40.

masukkan deskripsi gambar di sini

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?:

Dalam contoh kami, paket ke-20 dalam antrian menunggu 2 detik untuk diteruskan, di mana pada saat itu respons terhadapnya mungkin tidak lagi berguna bagi klien.

Periksa draf yang saya buat, 40thpermintaan mendapat tanggapan 1ssementara yang lain 40thmendapat tanggapan 4s.

Ini dapat memanfaatkan kapabilitas server sebaik mungkin: mengirim kembali respons secepat mungkin sambil tetap menjaga x r/sbatasan 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, Bdan C.

Tanpa nodelay, permintaan dilayani dalam urutan yang mirip dengan ABCABCABC.
Dengan nodelay, pesanan lebih mungkin terjadi AAABBBCCC.


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.

  1. x r/s hanya saja, kelebihan permintaan ditolak dengan segera.

  2. x r/s+ burst, kelebihan permintaan diantri.

1.vs 2., biayanya adalah bahwa di sisi klien, permintaan yang antri mengambil peluang reuqests nanti yang akan memiliki kesempatan untuk dilayani.

Misalnya, 10r/s burst=20vs 10r/s, 11thpermintaan seharusnya ditolak segera di bawah kondisi yang terakhir, tetapi sekarang sedang antri dan akan dilayani. The 11thpermintaan memakan 21thkesempatan permintaan ini.

  1. 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:

Dengan konfigurasi ini, klien yang membuat aliran permintaan berkelanjutan pada 8 r / s mengalami perilaku berikut.

8 r / d? serius? Ada 17 permintaan dalam 3 detik yang ditunjukkan pada gambar, 17/3 = 8?

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.