Rate Limiting dalam Manajemen API

Qi Guo

Qi Guo

September 16, 2022

Technology

Dengan perkembangan internet, semakin banyak perusahaan yang mulai mengadopsi cloud-native dan microservices. Namun, karena fitur teknis dari cloud-native dan microservices, kita harus mengelola ratusan layanan yang berbeda secara bersamaan. Oleh karena itu, kita tidak hanya perlu mempertimbangkan kelancaran operasi seluruh sistem, tetapi juga harus memperhatikan keamanan dan stabilitas setiap layanan berbasis API.

Pembatasan laju (rate limiting) adalah salah satu solusi paling kritis untuk memastikan stabilitas layanan berbasis API. Namun, aplikasi akan menjadi sangat besar jika setiap layanan memerlukan pembatasan laju. Sebagai pintu masuk dan keluar semua lalu lintas di dunia digital, API gateway membantu mencapai manajemen API terpadu dari semua layanan. Ini melindungi operasi stabil dari layanan sistem. Artikel ini menunjukkan bagaimana kita mencapai pembatasan laju melalui API gateway Apache APISIX dan menjelaskan strategi serta teknik pembatasan laju.

Apa Itu Pembatasan Laju

Pembatasan laju adalah strategi untuk mengontrol lalu lintas internet dan memaksimalkan throughput. Dengan menggunakan pembatasan laju, hanya permintaan yang memenuhi batasan tertentu yang diizinkan mengakses sistem; sistem akan mengantre permintaan tambahan yang melebihi batasan, menurunkan prioritasnya, atau bahkan menolak atau membuangnya. Pembatasan laju juga melindungi sistem dari kejadian tak terduga seperti lonjakan lalu lintas atau serangan berbahaya, dan memungkinkan sistem untuk menyediakan layanan yang konsisten dan stabil.

Misalnya, ketika tweet yang sedang tren menciptakan lonjakan lalu lintas, Twitter harus menerapkan pembatasan laju untuk mencegah server crash karena kelebihan lalu lintas.

Mengapa Anda Membutuhkannya

Pertama, mari kita lihat beberapa kasus penggunaan sederhana dalam kehidupan nyata yang menggunakan pembatasan laju. Misalnya, tempat wisata hanya bisa menjual sejumlah tiket liburan tertentu. Selain itu, kita biasanya perlu memesan terlebih dahulu atau menunggu lama sebelum menikmati makanan di restoran populer.

Di API gateway, pembatasan laju juga memiliki banyak manfaat. Pembatasan laju akan memberikan beberapa batasan pada layanan berbasis API kita, memastikan operasinya berjalan lancar, dan menghindari kerugian yang tidak perlu akibat server crash karena lonjakan lalu lintas. Di sini kami telah mencantumkan lima batasan praktis yang berbeda:

  1. Batasi laju permintaan.
  2. Batasi jumlah permintaan per unit waktu.
  3. Tunda permintaan.
  4. Tolak permintaan klien.
  5. Batasi laju respons.

Kapan Anda Membutuhkannya

Bersama dengan identifikasi dan autentikasi, pembatasan laju dapat memaksimalkan keuntungannya dan meningkatkan ketersediaan sistem dengan cara berikut:

  1. Hindari serangan berbahaya.
  2. Amankan operasi stabil sistem dan hindari server crash karena lonjakan lalu lintas.
  3. Cegah server crash karena lonjakan permintaan yang disebabkan oleh bug yang dihasilkan oleh layanan upstream atau downstream.
  4. Hindari panggilan API yang mahal terlalu sering.
  5. Kurangi pemborosan sumber daya yang tidak perlu dengan membatasi frekuensi panggilan API.

Teori di Balik Pembatasan Laju

Di bagian sebelumnya, kami telah memperkenalkan manfaat pembatasan laju. Di bagian ini, mari kita cari tahu teori di baliknya! Implementasi tingkat rendah dari pembatasan laju dicapai melalui algoritma tertentu. Yang biasa digunakan termasuk:

  • Algoritma Penghitung
    • Jendela Tetap
    • Jendela Geser
  • Algoritma Ember Bocor
  • Algoritma Ember Token

Algoritma Penghitung

Algoritma penghitung relatif mudah dipahami, dan memiliki dua jenis:

Jenis pertama adalah Algoritma Jendela Tetap, yang mempertahankan penghitung dalam unit waktu tetap dan akan mengatur ulang penghitung ke nol jika mendeteksi unit waktu telah berlalu.

Jenis kedua adalah Algoritma Jendela Geser, yang merupakan peningkatan berdasarkan yang pertama; memiliki langkah-langkah berikut:

  1. Bagi unit waktu menjadi beberapa interval (masing-masing disebut blok).
  2. Setiap blok memiliki penghitung; Setiap permintaan yang masuk akan menambah penghitung sebanyak 1.
  3. Setelah jumlah waktu tertentu, jendela waktu ini bergerak maju satu blok.
  4. Ini akan menghitung total permintaan dalam jendela waktu itu dengan menjumlahkan semua penghitung blok dalam jendela waktu; jika total permintaan melebihi batasan, itu akan membuang semua permintaan dalam jendela waktu itu.

Algoritma Ember Bocor

Bayangkan ada ember bocor; semua permintaan akan mengantre terlebih dahulu, dan kemudian ember bocor akan mengirimkannya dengan laju konstan.

Algoritma Ember Bocor

Jika permintaan melebihi kapasitas ember, sistem akan membuang dan menolak permintaan yang meluap. Algoritma ember bocor dapat membatasi laju permintaan dan memastikan semua permintaan dikirim dengan laju konstan, yang menciptakan mode mudah masuk tetapi sulit keluar.

Langkah inti dalam algoritma ini:

  1. Semua permintaan disimpan dalam ember berukuran tetap.
  2. Ember akan mengirimkan permintaan dengan laju konstan sampai ember kosong.
  3. Ketika ember penuh, sistem akan membuang permintaan tambahan.

Algoritma Ember Token

Algoritma ember token terdiri dari dua bagian: pembuatan token dan pembuangan. Ember token menghasilkan token dengan laju konstan dan menyimpannya dalam ember penyimpanan tetap. Ketika permintaan melewati ember token, permintaan mengambil satu atau lebih token. Ketika jumlah token dalam ember token mencapai kapasitas maksimum, ember token akan membuang token yang baru dihasilkan. Selain itu, ember penyimpanan akan menolak permintaan masuk jika tidak ada token yang tersisa.

Algoritma Ember Token

Langkah inti dari algoritma ember token:

  1. Ember token akan menghasilkan token dengan laju konstan dan memasukkannya ke dalam ember penyimpanan.
  2. Jika ember token penuh, token yang baru dihasilkan akan langsung dibuang. Ketika permintaan tiba, itu mengambil satu atau lebih token dari ember penyimpanan.
  3. Jika tidak ada token yang tersisa di ember token, sistem akan menolak permintaan masuk.

Mencapai Pembatasan Laju melalui API Gateway

Jika hanya beberapa layanan berbasis API yang perlu dikelola, kita bisa langsung menggunakan algoritma pembatasan laju dalam layanan. Misalnya, jika Anda menggunakan Go untuk mengembangkan sistem Anda, itu akan menggunakan tollbooth atau golang.org/x/time/rate untuk mengimplementasikan algoritma. Jika Anda menggunakan Lua, Anda bisa menggunakan modul NGINX limit_req, limit_conn, dan Lua-resty-limit-traffic untuk mengimplementasikan algoritma.

Jika pembatasan laju diimplementasikan berdasarkan layanan berbasis API, batasan pembatasan laju akan ditetapkan oleh layanan itu sendiri, dan setiap layanan mungkin memiliki batasan yang berbeda. Batasan dan perbedaan akan membawa masalah tingkat manajemen jika jumlah layanan berbasis API meningkat secara signifikan. Pada saat itu, kita tidak bisa menggunakan API gateway untuk mengelola semua layanan API secara seragam. Anda juga bisa mengimplementasikan fitur bisnis yang tidak terkait di gateway, seperti identifikasi, autentikasi, log, observabilitas, dll. saat menggunakan API gateway untuk menyelesaikan masalah pembatasan laju.

Apache APISIX adalah gateway cloud-native yang dinamis, real-time, dan berkinerja tinggi. APISIX saat ini telah mendukung lebih dari 80 plugin berbeda, dan telah membangun ekosistem yang kaya. Kita bisa mengelola lalu lintas layanan berbasis API dengan menggunakan plugin APISIX, termasuk limit-req, limit-conn, dan limit-count. Di sini, saya akan berbagi kasus penggunaan untuk menunjukkan penggunaan plugin pembatasan laju APISIX.

Misalkan ada layanan berbasis API (/user/login) yang membantu pengguna masuk. Untuk menghindari serangan berbahaya dan kelaparan sumber daya, kita perlu mengaktifkan fungsi pembatasan laju untuk memastikan stabilitas sistem.

Batasi Permintaan

Plugin limit-req membatasi laju permintaan, yang menggunakan algoritma ember bocor, dan kita mengikatnya dengan rute atau pelanggan tertentu.

Kita bisa langsung menggunakan Admin API APISIX untuk membuat rute seperti ini:

X-API-Key adalah admin_key dalam konfigurasi APISIX.

curl http://127.0.0.1:9080/apisix/admin/routes/1 \ -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "methods": ["POST"], "uri": "/user/login", "plugins": { "limit-req": { "rate": 3, "burst": 2, "rejected_code": 503, "key": "remote_addr" } }, "upstream": { "type": "roundrobin", "nodes": { "127.0.0.1:1980": 1 } } }'

Arti dari cuplikan kode ini: Kami menggunakan alamat IP klien sebagai persyaratan untuk membatasi laju permintaan.

  • Jika laju permintaan kurang dari 3 permintaan/detik (rate), maka permintaan normal;
  • Jika laju permintaan lebih besar dari 3 permintaan/detik dan kurang dari 5 permintaan/detik (rate+burst), kami akan menurunkan prioritas permintaan yang melampaui ini;
  • Jika laju permintaan lebih besar dari 5 permintaan/detik (rate+burst), permintaan apa pun yang melebihi batasan maksimum akan mengembalikan Kode HTTP 503.

Jika Anda ingin mempelajari lebih lanjut tentang limit-req, silakan periksa dokumen ini: APISIX limit-req

Batasi Koneksi

Plugin limit-conn membatasi permintaan paralel (atau koneksi paralel). Berikut adalah contoh cuplikan kode untuk mengaktifkan plugin ini untuk /user/login:

curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "methods": ["POST"], "uri": "/user/login", "id": 1, "plugins": { "limit-conn": { "conn": 3, "burst": 2, "default_conn_delay": 0.1, "rejected_code": 503, "key": "remote_addr" } }, "upstream": { "type": "roundrobin", "nodes": { "127.0.0.1:1980": 1 } } }'

Arti dari cuplikan kode ini: Kami menggunakan alamat IP klien sebagai persyaratan untuk membatasi koneksi paralel.

  • Jika koneksi paralel klien yang sama kurang dari 3 (conn), maka itu merespons status normal 200;
  • Jika koneksi paralel lebih dari 3 (conn) tetapi kurang dari 5 (conn+burst), kami akan memperlambat permintaan yang meluap, dan menambah waktu tunda 0,1 detik;
  • Jika koneksi paralel lebih dari 5 (conn+burst), permintaan ini akan ditolak dan mengembalikan Kode HTTP 503.

Jika Anda ingin mempelajari lebih lanjut tentang limit-conn, silakan periksa dokumen ini: APISIX limit-conn

Batasi Jumlah

Plugin limit-count mirip dengan pembatasan laju API Github; itu akan membatasi jumlah total permintaan dalam interval waktu tertentu dan mengembalikan jumlah permintaan yang tersisa di header HTTP. Berikut adalah contoh cuplikan kode untuk mengaktifkan plugin ini untuk /user/login:

curl -i http://127.0.0.1:9080/apisix/admin/routes/1 \ -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "uri": "/user/login", "plugins": { "limit-count": { "count": 3, "time_window": 60, "rejected_code": 503, "key": "remote_addr", "policy": "local" } }, "upstream": { "type": "roundrobin", "nodes": { "127.0.0.1:9001": 1 } } }'

Arti dari cuplikan kode ini: Kami menggunakan alamat IP klien sebagai persyaratan untuk membatasi jumlah permintaan; penghitung disimpan secara lokal dalam memori.

Jika ada lebih dari 3(count) permintaan dalam 60 detik(time_window), permintaan yang dikirim lebih dari 3 kali akan mengembalikan kode HTTP 503 (rejected_code).

Jika Anda ingin mempelajari lebih lanjut tentang limit-count, silakan periksa dokumen ini: APISIX limit-count

Keuntungan Pembatasan Laju Apache APISIX

Ketika kita menggunakan NGINX untuk mengelola lalu lintas, jika jumlah permintaan API menciptakan lonjakan lalu lintas, maka NGINX akan mengekspos kekurangannya, dan salah satu kekurangannya adalah tidak dapat memuat konfigurasi secara dinamis. Di sisi lain, layanan APISIX (seperti Route dan Service) dapat mendukung hot-reloading konfigurasi. Bahkan jika ada lonjakan lalu lintas, APISIX dapat segera memodifikasi pembatasan laju dan konfigurasi plugin keamanan lainnya. Berkat mekanisme watch dari etcd, itu memungkinkan APISIX untuk memperbarui lapisan data dalam milidetik tanpa memuat ulang layanan.

Selain itu, APISIX juga mendukung pembatasan laju tingkat kluster. Misalnya, kita bisa menggunakan limit-count untuk memodifikasi konfigurasi policy ke redis atau redis-cluster. Oleh karena itu, kita bisa membatasi laju tingkat kluster dengan berbagi hasil komputasi antara node APISIX yang berbeda.

Sebagai seorang DevOps, menggunakan dashboard grafis untuk mengelola semua layanan API akan meningkatkan produktivitas. APISIX menyediakan dashboard manajemen visual yang rapi untuk membuat modifikasi konfigurasi API jauh lebih nyaman.

Kesimpulan

Pembatasan laju adalah kebutuhan umum dalam skenario bisnis aktual, dan itu adalah cara penting untuk melindungi sistem dari lonjakan lalu lintas dan memastikan operasinya berjalan lancar. Pembatasan laju hanyalah satu bagian dari manajemen layanan API; kita juga bisa menggunakan banyak teknologi lain untuk memberikan dukungan keamanan vital dan meningkatkan pengalaman pengguna.

Tags: