Bagaimana Saya Membina Sliding Window Rate Limiter dalam Redis

API video kami sering tergendala setiap petang pada jam 8 malam UTC.

Ia bukan trafik sebenar. Beberapa pengikis (scrapers) menemui titik akhir (endpoint) trending kami dan menyerang secara bertubi-tubi. Pertanyaan pangkalan data kami bertimbun. Pengguna sebenar hanya melihat ikon pemuatan (loading spinners) dan bukannya video.

Kami memerlukan pengehadan kadar (rate limiting). Kebanyakan kaedah mudah hanya memburukkan lagi masalah.

Masalah dengan kaunter Fixed Window: Kebanyakan orang bermula dengan window tetap (fixed windows). Anda mengira permintaan dalam blok masa yang ditetapkan. Jika had anda ialah 100 seminit, seorang pengguna boleh menghantar 100 permintaan pada jam 11:59:59 dan 100 lagi pada jam 12:00:00. Itu bermakna 200 permintaan dalam satu saat. Pengikis mengeksploitasi sempadan ini untuk memintas had anda.

Penyelesaiannya: Sliding Window. Sliding window mengira permintaan dalam N saat terakhir berbanding waktu sekarang. Tiada sempadan untuk dieksploitasi.

Kami menggunakan dua kaedah berbeza berdasarkan keperluan kami:

  1. Sliding Window